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),
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;
}
}
}
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:
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;
}
int issued;
int required_blob_size;
void *prealloc_blob = NULL;
- int was_dirty;
if (ceph_snap(inode) != CEPH_NOSNAP)
return -EROFS;
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;
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)
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);