diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-01-28 14:02:23 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-01-28 14:02:23 -0500 |
commit | d891ea23d5203e5c47439b2a174f86a00b356a6c (patch) | |
tree | 3876cefcced9df5519f437cd8eb275cb979b93f6 /fs/ceph/inode.c | |
parent | 08d21b5f93eb92a781daea71b6fcb3a340909141 (diff) | |
parent | 125d725c923527a85876c031028c7f55c28b74b3 (diff) |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client
Pull ceph updates from Sage Weil:
"This is a big batch. From Ilya we have:
- rbd support for more than ~250 mapped devices (now uses same scheme
that SCSI does for device major/minor numbering)
- crush updates for new mapping behaviors (will be needed for coming
erasure coding support, among other things)
- preliminary support for tiered storage pools
There is also a big series fixing a pile cephfs bugs with clustered
MDSs from Yan Zheng, ACL support for cephfs from Guangliang Zhao, ceph
fscache improvements from Li Wang, improved behavior when we get
ENOSPC from Josh Durgin, some readv/writev improvements from
Majianpeng, and the usual mix of small cleanups"
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client: (76 commits)
ceph: cast PAGE_SIZE to size_t in ceph_sync_write()
ceph: fix dout() compile warnings in ceph_filemap_fault()
libceph: support CEPH_FEATURE_OSD_CACHEPOOL feature
libceph: follow redirect replies from osds
libceph: rename ceph_osd_request::r_{oloc,oid} to r_base_{oloc,oid}
libceph: follow {read,write}_tier fields on osd request submission
libceph: add ceph_pg_pool_by_id()
libceph: CEPH_OSD_FLAG_* enum update
libceph: replace ceph_calc_ceph_pg() with ceph_oloc_oid_to_pg()
libceph: introduce and start using oid abstraction
libceph: rename MAX_OBJ_NAME_SIZE to CEPH_MAX_OID_NAME_LEN
libceph: move ceph_file_layout helpers to ceph_fs.h
libceph: start using oloc abstraction
libceph: dout() is missing a newline
libceph: add ceph_kv{malloc,free}() and switch to them
libceph: support CEPH_FEATURE_EXPORT_PEER
ceph: add imported caps when handling cap export message
ceph: add open export target session helper
ceph: remove exported caps when handling cap import message
ceph: handle session flush message
...
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 | } |