diff options
Diffstat (limited to 'fs/ceph/inode.c')
-rw-r--r-- | fs/ceph/inode.c | 33 |
1 files changed, 27 insertions, 6 deletions
diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c index 278fd2891288..6fc10a7d7c59 100644 --- a/fs/ceph/inode.c +++ b/fs/ceph/inode.c | |||
@@ -95,6 +95,7 @@ const struct inode_operations ceph_file_iops = { | |||
95 | .getxattr = ceph_getxattr, | 95 | .getxattr = ceph_getxattr, |
96 | .listxattr = ceph_listxattr, | 96 | .listxattr = ceph_listxattr, |
97 | .removexattr = ceph_removexattr, | 97 | .removexattr = ceph_removexattr, |
98 | .get_acl = ceph_get_acl, | ||
98 | }; | 99 | }; |
99 | 100 | ||
100 | 101 | ||
@@ -335,12 +336,10 @@ struct inode *ceph_alloc_inode(struct super_block *sb) | |||
335 | ci->i_hold_caps_min = 0; | 336 | ci->i_hold_caps_min = 0; |
336 | ci->i_hold_caps_max = 0; | 337 | ci->i_hold_caps_max = 0; |
337 | INIT_LIST_HEAD(&ci->i_cap_delay_list); | 338 | INIT_LIST_HEAD(&ci->i_cap_delay_list); |
338 | ci->i_cap_exporting_mds = 0; | ||
339 | ci->i_cap_exporting_mseq = 0; | ||
340 | ci->i_cap_exporting_issued = 0; | ||
341 | INIT_LIST_HEAD(&ci->i_cap_snaps); | 339 | INIT_LIST_HEAD(&ci->i_cap_snaps); |
342 | ci->i_head_snapc = NULL; | 340 | ci->i_head_snapc = NULL; |
343 | ci->i_snap_caps = 0; | 341 | ci->i_snap_caps = 0; |
342 | ci->i_cap_exporting_issued = 0; | ||
344 | 343 | ||
345 | for (i = 0; i < CEPH_FILE_MODE_NUM; i++) | 344 | for (i = 0; i < CEPH_FILE_MODE_NUM; i++) |
346 | ci->i_nr_by_mode[i] = 0; | 345 | ci->i_nr_by_mode[i] = 0; |
@@ -436,6 +435,16 @@ void ceph_destroy_inode(struct inode *inode) | |||
436 | call_rcu(&inode->i_rcu, ceph_i_callback); | 435 | call_rcu(&inode->i_rcu, ceph_i_callback); |
437 | } | 436 | } |
438 | 437 | ||
438 | int ceph_drop_inode(struct inode *inode) | ||
439 | { | ||
440 | /* | ||
441 | * Positve dentry and corresponding inode are always accompanied | ||
442 | * in MDS reply. So no need to keep inode in the cache after | ||
443 | * dropping all its aliases. | ||
444 | */ | ||
445 | return 1; | ||
446 | } | ||
447 | |||
439 | /* | 448 | /* |
440 | * Helpers to fill in size, ctime, mtime, and atime. We have to be | 449 | * Helpers to fill in size, ctime, mtime, and atime. We have to be |
441 | * careful because either the client or MDS may have more up to date | 450 | * careful because either the client or MDS may have more up to date |
@@ -670,6 +679,7 @@ static int fill_inode(struct inode *inode, | |||
670 | memcpy(ci->i_xattrs.blob->vec.iov_base, | 679 | memcpy(ci->i_xattrs.blob->vec.iov_base, |
671 | iinfo->xattr_data, iinfo->xattr_len); | 680 | iinfo->xattr_data, iinfo->xattr_len); |
672 | ci->i_xattrs.version = le64_to_cpu(info->xattr_version); | 681 | ci->i_xattrs.version = le64_to_cpu(info->xattr_version); |
682 | ceph_forget_all_cached_acls(inode); | ||
673 | xattr_blob = NULL; | 683 | xattr_blob = NULL; |
674 | } | 684 | } |
675 | 685 | ||
@@ -1454,7 +1464,8 @@ static void ceph_invalidate_work(struct work_struct *work) | |||
1454 | dout("invalidate_pages %p gen %d revoking %d\n", inode, | 1464 | dout("invalidate_pages %p gen %d revoking %d\n", inode, |
1455 | ci->i_rdcache_gen, ci->i_rdcache_revoking); | 1465 | ci->i_rdcache_gen, ci->i_rdcache_revoking); |
1456 | if (ci->i_rdcache_revoking != ci->i_rdcache_gen) { | 1466 | if (ci->i_rdcache_revoking != ci->i_rdcache_gen) { |
1457 | /* nevermind! */ | 1467 | if (__ceph_caps_revoking_other(ci, NULL, CEPH_CAP_FILE_CACHE)) |
1468 | check = 1; | ||
1458 | spin_unlock(&ci->i_ceph_lock); | 1469 | spin_unlock(&ci->i_ceph_lock); |
1459 | mutex_unlock(&ci->i_truncate_mutex); | 1470 | mutex_unlock(&ci->i_truncate_mutex); |
1460 | goto out; | 1471 | goto out; |
@@ -1475,13 +1486,14 @@ static void ceph_invalidate_work(struct work_struct *work) | |||
1475 | dout("invalidate_pages %p gen %d raced, now %d revoking %d\n", | 1486 | dout("invalidate_pages %p gen %d raced, now %d revoking %d\n", |
1476 | inode, orig_gen, ci->i_rdcache_gen, | 1487 | inode, orig_gen, ci->i_rdcache_gen, |
1477 | ci->i_rdcache_revoking); | 1488 | ci->i_rdcache_revoking); |
1489 | if (__ceph_caps_revoking_other(ci, NULL, CEPH_CAP_FILE_CACHE)) | ||
1490 | check = 1; | ||
1478 | } | 1491 | } |
1479 | spin_unlock(&ci->i_ceph_lock); | 1492 | spin_unlock(&ci->i_ceph_lock); |
1480 | mutex_unlock(&ci->i_truncate_mutex); | 1493 | mutex_unlock(&ci->i_truncate_mutex); |
1481 | 1494 | out: | |
1482 | if (check) | 1495 | if (check) |
1483 | ceph_check_caps(ci, 0, NULL); | 1496 | ceph_check_caps(ci, 0, NULL); |
1484 | out: | ||
1485 | iput(inode); | 1497 | iput(inode); |
1486 | } | 1498 | } |
1487 | 1499 | ||
@@ -1602,6 +1614,7 @@ static const struct inode_operations ceph_symlink_iops = { | |||
1602 | .getxattr = ceph_getxattr, | 1614 | .getxattr = ceph_getxattr, |
1603 | .listxattr = ceph_listxattr, | 1615 | .listxattr = ceph_listxattr, |
1604 | .removexattr = ceph_removexattr, | 1616 | .removexattr = ceph_removexattr, |
1617 | .get_acl = ceph_get_acl, | ||
1605 | }; | 1618 | }; |
1606 | 1619 | ||
1607 | /* | 1620 | /* |
@@ -1675,6 +1688,7 @@ int ceph_setattr(struct dentry *dentry, struct iattr *attr) | |||
1675 | dirtied |= CEPH_CAP_AUTH_EXCL; | 1688 | dirtied |= CEPH_CAP_AUTH_EXCL; |
1676 | } else if ((issued & CEPH_CAP_AUTH_SHARED) == 0 || | 1689 | } else if ((issued & CEPH_CAP_AUTH_SHARED) == 0 || |
1677 | attr->ia_mode != inode->i_mode) { | 1690 | attr->ia_mode != inode->i_mode) { |
1691 | inode->i_mode = attr->ia_mode; | ||
1678 | req->r_args.setattr.mode = cpu_to_le32(attr->ia_mode); | 1692 | req->r_args.setattr.mode = cpu_to_le32(attr->ia_mode); |
1679 | mask |= CEPH_SETATTR_MODE; | 1693 | mask |= CEPH_SETATTR_MODE; |
1680 | release |= CEPH_CAP_AUTH_SHARED; | 1694 | release |= CEPH_CAP_AUTH_SHARED; |
@@ -1790,6 +1804,12 @@ int ceph_setattr(struct dentry *dentry, struct iattr *attr) | |||
1790 | if (inode_dirty_flags) | 1804 | if (inode_dirty_flags) |
1791 | __mark_inode_dirty(inode, inode_dirty_flags); | 1805 | __mark_inode_dirty(inode, inode_dirty_flags); |
1792 | 1806 | ||
1807 | if (ia_valid & ATTR_MODE) { | ||
1808 | err = ceph_acl_chmod(dentry, inode); | ||
1809 | if (err) | ||
1810 | goto out_put; | ||
1811 | } | ||
1812 | |||
1793 | if (mask) { | 1813 | if (mask) { |
1794 | req->r_inode = inode; | 1814 | req->r_inode = inode; |
1795 | ihold(inode); | 1815 | ihold(inode); |
@@ -1809,6 +1829,7 @@ int ceph_setattr(struct dentry *dentry, struct iattr *attr) | |||
1809 | return err; | 1829 | return err; |
1810 | out: | 1830 | out: |
1811 | spin_unlock(&ci->i_ceph_lock); | 1831 | spin_unlock(&ci->i_ceph_lock); |
1832 | out_put: | ||
1812 | ceph_mdsc_put_request(req); | 1833 | ceph_mdsc_put_request(req); |
1813 | return err; | 1834 | return err; |
1814 | } | 1835 | } |