]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
kclient: move igrab, __mark_inode_dirty into __ceph_mark_dirty_caps
authorSage Weil <sage@newdream.net>
Mon, 20 Apr 2009 14:10:23 +0000 (07:10 -0700)
committerSage Weil <sage@newdream.net>
Mon, 20 Apr 2009 14:10:23 +0000 (07:10 -0700)
Also be sure to __mark_inode_dirty(inode, I_DIRTY_DATASYNC) when
we dirty FILE_WRBUFFER.

src/kernel/caps.c
src/kernel/file.c
src/kernel/inode.c

index ecaea48570d778abc5f72205c52a560b2e805f08..3bfa1de74495305021020d7eaa7fac80a0c61cf5 100644 (file)
@@ -1289,7 +1289,9 @@ ack:
 int __ceph_mark_dirty_caps(struct ceph_inode_info *ci, int mask)
 {
        struct ceph_mds_client *mdsc = &ceph_client(ci->vfs_inode.i_sb)->mdsc;
+       struct inode *inode = &ci->vfs_inode;
        int was = __ceph_caps_dirty(ci);
+       int dirty = 0;
 
        dout(20, "__mark_dirty_caps %p %s dirty %s -> %s\n", &ci->vfs_inode,
             ceph_cap_string(mask), ceph_cap_string(ci->i_dirty_caps),
@@ -1300,7 +1302,14 @@ int __ceph_mark_dirty_caps(struct ceph_inode_info *ci, int mask)
                spin_lock(&mdsc->cap_dirty_lock);
                list_add(&ci->i_dirty_item, &mdsc->cap_dirty);
                spin_unlock(&mdsc->cap_dirty_lock);
-       }
+               igrab(inode);
+               dirty |= I_DIRTY_SYNC;
+       }
+       if ((was & CEPH_CAP_FILE_WRBUFFER) &&
+           (mask & CEPH_CAP_FILE_WRBUFFER))
+               dirty |= I_DIRTY_DATASYNC;
+       if (dirty)
+               __mark_inode_dirty(inode, dirty);
        return was;
 }
 
index 02f2668a5ba647981898e35af9e003efeb29fbe3..9d2ea333cc1650139bdf70207bd188b1769dceac 100644 (file)
@@ -759,15 +759,9 @@ retry_snap:
                }
        }
        if (ret >= 0) {
-               int was_dirty;
-
                spin_lock(&inode->i_lock);
-               was_dirty = __ceph_mark_dirty_caps(ci, CEPH_CAP_FILE_WR);
+               __ceph_mark_dirty_caps(ci, CEPH_CAP_FILE_WR);
                spin_unlock(&inode->i_lock);
-               if (!was_dirty) {
-                       __mark_inode_dirty(inode,I_DIRTY_SYNC|I_DIRTY_DATASYNC);
-                       igrab(inode);
-               }
        }
 
 out:
index 9f5c72a7ce7c159e0f48b11726c719a0471a0717..af06b2c66286f7e41900646cce6b4317eb2613b3 100644 (file)
@@ -1452,11 +1452,7 @@ int ceph_setattr(struct dentry *dentry, struct iattr *attr)
                dout(10, "setattr %p ATTR_FILE ... hrm!\n", inode);
 
        if (dirtied) {
-               int was_dirty = __ceph_mark_dirty_caps(ci, dirtied);
-               if (!was_dirty) {
-                       __mark_inode_dirty(inode,I_DIRTY_SYNC);
-                       igrab(inode);
-               }
+               __ceph_mark_dirty_caps(ci, dirtied);
                inode->i_ctime = CURRENT_TIME;
        }
 
@@ -2188,7 +2184,6 @@ int ceph_setxattr(struct dentry *dentry, const char *name,
        int issued;
        int required_blob_size;
        void *prealloc_blob = NULL;
-       int was_dirty;
 
        if (ceph_snap(inode) != CEPH_NOSNAP)
                return -EROFS;
@@ -2253,15 +2248,9 @@ retry:
        dout(20, "setxattr %p issued %s\n", inode, ceph_cap_string(issued));
        err = __set_xattr(ci, newname, name_len, newval,
                          val_len, 1, 1, 1, &xattr);
-       was_dirty = __ceph_mark_dirty_caps(ci, CEPH_CAP_XATTR_EXCL);
+       __ceph_mark_dirty_caps(ci, CEPH_CAP_XATTR_EXCL);
        ci->i_xattrs.dirty = 1;
        inode->i_ctime = CURRENT_TIME;
-
-       if (!was_dirty) {
-               __mark_inode_dirty(inode, I_DIRTY_SYNC);
-               igrab(inode);
-       }
-
        spin_unlock(&inode->i_lock);
 
        return err;
@@ -2304,7 +2293,6 @@ int ceph_removexattr(struct dentry *dentry, const char *name)
        struct inode *inode = dentry->d_inode;
        struct ceph_inode_info *ci = ceph_inode(inode);
        int issued;
-       int was_dirty;
        int err;
 
        if (ceph_snap(inode) != CEPH_NOSNAP)
@@ -2326,13 +2314,8 @@ int ceph_removexattr(struct dentry *dentry, const char *name)
                goto do_sync;
 
        err = __remove_xattr_by_name(ceph_inode(inode), name);
-       was_dirty = __ceph_mark_dirty_caps(ci, CEPH_CAP_XATTR_EXCL);
+       __ceph_mark_dirty_caps(ci, CEPH_CAP_XATTR_EXCL);
        ci->i_xattrs.dirty = 1;
-
-       if (!was_dirty) {
-               __mark_inode_dirty(inode, I_DIRTY_SYNC);
-               igrab(inode);
-       }
        inode->i_ctime = CURRENT_TIME;
 
        spin_unlock(&inode->i_lock);