diff options
| -rw-r--r-- | fs/ceph/caps.c | 10 | ||||
| -rw-r--r-- | fs/ceph/file.c | 5 | ||||
| -rw-r--r-- | fs/ceph/inode.c | 6 | ||||
| -rw-r--r-- | fs/ceph/super.h | 2 | ||||
| -rw-r--r-- | fs/ceph/xattr.c | 12 |
5 files changed, 23 insertions, 12 deletions
diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c index 010ba9c52e9b..9fa08662a88d 100644 --- a/fs/ceph/caps.c +++ b/fs/ceph/caps.c | |||
| @@ -1331,10 +1331,11 @@ static void ceph_flush_snaps(struct ceph_inode_info *ci) | |||
| 1331 | } | 1331 | } |
| 1332 | 1332 | ||
| 1333 | /* | 1333 | /* |
| 1334 | * Mark caps dirty. If inode is newly dirty, add to the global dirty | 1334 | * Mark caps dirty. If inode is newly dirty, return the dirty flags. |
| 1335 | * list. | 1335 | * Caller is then responsible for calling __mark_inode_dirty with the |
| 1336 | * returned flags value. | ||
| 1336 | */ | 1337 | */ |
| 1337 | void __ceph_mark_dirty_caps(struct ceph_inode_info *ci, int mask) | 1338 | int __ceph_mark_dirty_caps(struct ceph_inode_info *ci, int mask) |
| 1338 | { | 1339 | { |
| 1339 | struct ceph_mds_client *mdsc = | 1340 | struct ceph_mds_client *mdsc = |
| 1340 | ceph_sb_to_client(ci->vfs_inode.i_sb)->mdsc; | 1341 | ceph_sb_to_client(ci->vfs_inode.i_sb)->mdsc; |
| @@ -1365,9 +1366,8 @@ void __ceph_mark_dirty_caps(struct ceph_inode_info *ci, int mask) | |||
| 1365 | if (((was | ci->i_flushing_caps) & CEPH_CAP_FILE_BUFFER) && | 1366 | if (((was | ci->i_flushing_caps) & CEPH_CAP_FILE_BUFFER) && |
| 1366 | (mask & CEPH_CAP_FILE_BUFFER)) | 1367 | (mask & CEPH_CAP_FILE_BUFFER)) |
| 1367 | dirty |= I_DIRTY_DATASYNC; | 1368 | dirty |= I_DIRTY_DATASYNC; |
| 1368 | if (dirty) | ||
| 1369 | __mark_inode_dirty(inode, dirty); | ||
| 1370 | __cap_delay_requeue(mdsc, ci); | 1369 | __cap_delay_requeue(mdsc, ci); |
| 1370 | return dirty; | ||
| 1371 | } | 1371 | } |
| 1372 | 1372 | ||
| 1373 | /* | 1373 | /* |
diff --git a/fs/ceph/file.c b/fs/ceph/file.c index 159b512d5a27..203252d88d9f 100644 --- a/fs/ceph/file.c +++ b/fs/ceph/file.c | |||
| @@ -734,9 +734,12 @@ retry_snap: | |||
| 734 | } | 734 | } |
| 735 | } | 735 | } |
| 736 | if (ret >= 0) { | 736 | if (ret >= 0) { |
| 737 | int dirty; | ||
| 737 | spin_lock(&inode->i_lock); | 738 | spin_lock(&inode->i_lock); |
| 738 | __ceph_mark_dirty_caps(ci, CEPH_CAP_FILE_WR); | 739 | dirty = __ceph_mark_dirty_caps(ci, CEPH_CAP_FILE_WR); |
| 739 | spin_unlock(&inode->i_lock); | 740 | spin_unlock(&inode->i_lock); |
| 741 | if (dirty) | ||
| 742 | __mark_inode_dirty(inode, dirty); | ||
| 740 | } | 743 | } |
| 741 | 744 | ||
| 742 | out: | 745 | out: |
diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c index b54c97da1c43..03d6dafda61f 100644 --- a/fs/ceph/inode.c +++ b/fs/ceph/inode.c | |||
| @@ -1567,6 +1567,7 @@ int ceph_setattr(struct dentry *dentry, struct iattr *attr) | |||
| 1567 | int release = 0, dirtied = 0; | 1567 | int release = 0, dirtied = 0; |
| 1568 | int mask = 0; | 1568 | int mask = 0; |
| 1569 | int err = 0; | 1569 | int err = 0; |
| 1570 | int inode_dirty_flags = 0; | ||
| 1570 | 1571 | ||
| 1571 | if (ceph_snap(inode) != CEPH_NOSNAP) | 1572 | if (ceph_snap(inode) != CEPH_NOSNAP) |
| 1572 | return -EROFS; | 1573 | return -EROFS; |
| @@ -1725,13 +1726,16 @@ int ceph_setattr(struct dentry *dentry, struct iattr *attr) | |||
| 1725 | dout("setattr %p ATTR_FILE ... hrm!\n", inode); | 1726 | dout("setattr %p ATTR_FILE ... hrm!\n", inode); |
| 1726 | 1727 | ||
| 1727 | if (dirtied) { | 1728 | if (dirtied) { |
| 1728 | __ceph_mark_dirty_caps(ci, dirtied); | 1729 | inode_dirty_flags = __ceph_mark_dirty_caps(ci, dirtied); |
| 1729 | inode->i_ctime = CURRENT_TIME; | 1730 | inode->i_ctime = CURRENT_TIME; |
| 1730 | } | 1731 | } |
| 1731 | 1732 | ||
| 1732 | release &= issued; | 1733 | release &= issued; |
| 1733 | spin_unlock(&inode->i_lock); | 1734 | spin_unlock(&inode->i_lock); |
| 1734 | 1735 | ||
| 1736 | if (inode_dirty_flags) | ||
| 1737 | __mark_inode_dirty(inode, inode_dirty_flags); | ||
| 1738 | |||
| 1735 | if (mask) { | 1739 | if (mask) { |
| 1736 | req->r_inode = igrab(inode); | 1740 | req->r_inode = igrab(inode); |
| 1737 | req->r_inode_drop = release; | 1741 | req->r_inode_drop = release; |
diff --git a/fs/ceph/super.h b/fs/ceph/super.h index 619fe719968f..b1f1b8bb1271 100644 --- a/fs/ceph/super.h +++ b/fs/ceph/super.h | |||
| @@ -506,7 +506,7 @@ static inline int __ceph_caps_dirty(struct ceph_inode_info *ci) | |||
| 506 | { | 506 | { |
| 507 | return ci->i_dirty_caps | ci->i_flushing_caps; | 507 | return ci->i_dirty_caps | ci->i_flushing_caps; |
| 508 | } | 508 | } |
| 509 | extern void __ceph_mark_dirty_caps(struct ceph_inode_info *ci, int mask); | 509 | extern int __ceph_mark_dirty_caps(struct ceph_inode_info *ci, int mask); |
| 510 | 510 | ||
| 511 | extern int ceph_caps_revoking(struct ceph_inode_info *ci, int mask); | 511 | extern int ceph_caps_revoking(struct ceph_inode_info *ci, int mask); |
| 512 | extern int __ceph_caps_used(struct ceph_inode_info *ci); | 512 | extern int __ceph_caps_used(struct ceph_inode_info *ci); |
diff --git a/fs/ceph/xattr.c b/fs/ceph/xattr.c index 8c9eba6ef9df..f2b628696180 100644 --- a/fs/ceph/xattr.c +++ b/fs/ceph/xattr.c | |||
| @@ -703,6 +703,7 @@ int ceph_setxattr(struct dentry *dentry, const char *name, | |||
| 703 | struct ceph_inode_xattr *xattr = NULL; | 703 | struct ceph_inode_xattr *xattr = NULL; |
| 704 | int issued; | 704 | int issued; |
| 705 | int required_blob_size; | 705 | int required_blob_size; |
| 706 | int dirty; | ||
| 706 | 707 | ||
| 707 | if (ceph_snap(inode) != CEPH_NOSNAP) | 708 | if (ceph_snap(inode) != CEPH_NOSNAP) |
| 708 | return -EROFS; | 709 | return -EROFS; |
| @@ -763,11 +764,12 @@ retry: | |||
| 763 | dout("setxattr %p issued %s\n", inode, ceph_cap_string(issued)); | 764 | dout("setxattr %p issued %s\n", inode, ceph_cap_string(issued)); |
| 764 | err = __set_xattr(ci, newname, name_len, newval, | 765 | err = __set_xattr(ci, newname, name_len, newval, |
| 765 | val_len, 1, 1, 1, &xattr); | 766 | val_len, 1, 1, 1, &xattr); |
| 766 | __ceph_mark_dirty_caps(ci, CEPH_CAP_XATTR_EXCL); | 767 | dirty = __ceph_mark_dirty_caps(ci, CEPH_CAP_XATTR_EXCL); |
| 767 | ci->i_xattrs.dirty = true; | 768 | ci->i_xattrs.dirty = true; |
| 768 | inode->i_ctime = CURRENT_TIME; | 769 | inode->i_ctime = CURRENT_TIME; |
| 769 | spin_unlock(&inode->i_lock); | 770 | spin_unlock(&inode->i_lock); |
| 770 | 771 | if (dirty) | |
| 772 | __mark_inode_dirty(inode, dirty); | ||
| 771 | return err; | 773 | return err; |
| 772 | 774 | ||
| 773 | do_sync: | 775 | do_sync: |
| @@ -810,6 +812,7 @@ int ceph_removexattr(struct dentry *dentry, const char *name) | |||
| 810 | struct ceph_vxattr_cb *vxattrs = ceph_inode_vxattrs(inode); | 812 | struct ceph_vxattr_cb *vxattrs = ceph_inode_vxattrs(inode); |
| 811 | int issued; | 813 | int issued; |
| 812 | int err; | 814 | int err; |
| 815 | int dirty; | ||
| 813 | 816 | ||
| 814 | if (ceph_snap(inode) != CEPH_NOSNAP) | 817 | if (ceph_snap(inode) != CEPH_NOSNAP) |
| 815 | return -EROFS; | 818 | return -EROFS; |
| @@ -833,12 +836,13 @@ int ceph_removexattr(struct dentry *dentry, const char *name) | |||
| 833 | goto do_sync; | 836 | goto do_sync; |
| 834 | 837 | ||
| 835 | err = __remove_xattr_by_name(ceph_inode(inode), name); | 838 | err = __remove_xattr_by_name(ceph_inode(inode), name); |
| 836 | __ceph_mark_dirty_caps(ci, CEPH_CAP_XATTR_EXCL); | 839 | dirty = __ceph_mark_dirty_caps(ci, CEPH_CAP_XATTR_EXCL); |
| 837 | ci->i_xattrs.dirty = true; | 840 | ci->i_xattrs.dirty = true; |
| 838 | inode->i_ctime = CURRENT_TIME; | 841 | inode->i_ctime = CURRENT_TIME; |
| 839 | 842 | ||
| 840 | spin_unlock(&inode->i_lock); | 843 | spin_unlock(&inode->i_lock); |
| 841 | 844 | if (dirty) | |
| 845 | __mark_inode_dirty(inode, dirty); | ||
| 842 | return err; | 846 | return err; |
| 843 | do_sync: | 847 | do_sync: |
| 844 | spin_unlock(&inode->i_lock); | 848 | spin_unlock(&inode->i_lock); |
