diff options
author | Yan, Zheng <zyan@redhat.com> | 2016-02-14 18:06:41 +0800 |
---|---|---|
committer | Ilya Dryomov <idryomov@gmail.com> | 2016-03-04 21:00:37 +0100 |
commit | 5ea5c5e0a7f70b256417d3b6e36bd9851504babd (patch) | |
tree | c71678dee6860e0bce59c737a3ea52f7e310e09f /fs/ceph/mds_client.c | |
parent | fc77dbd34c5c99bce46d40a2491937c3bcbd10af (diff) | |
download | blackbird-op-linux-5ea5c5e0a7f70b256417d3b6e36bd9851504babd.tar.gz blackbird-op-linux-5ea5c5e0a7f70b256417d3b6e36bd9851504babd.zip |
ceph: initial CEPH_FEATURE_FS_FILE_LAYOUT_V2 support
Add support for the format change of MClientReply/MclientCaps.
Also add code that denies access to inodes with pool_ns layouts.
Signed-off-by: Yan, Zheng <zyan@redhat.com>
Reviewed-by: Sage Weil <sage@redhat.com>
Diffstat (limited to 'fs/ceph/mds_client.c')
-rw-r--r-- | fs/ceph/mds_client.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c index e7b130a637f9..911d64d865f1 100644 --- a/fs/ceph/mds_client.c +++ b/fs/ceph/mds_client.c @@ -100,6 +100,14 @@ static int parse_reply_info_in(void **p, void *end, } else info->inline_version = CEPH_INLINE_NONE; + if (features & CEPH_FEATURE_FS_FILE_LAYOUT_V2) { + ceph_decode_32_safe(p, end, info->pool_ns_len, bad); + ceph_decode_need(p, end, info->pool_ns_len, bad); + *p += info->pool_ns_len; + } else { + info->pool_ns_len = 0; + } + return 0; bad: return err; @@ -2298,6 +2306,14 @@ int ceph_mdsc_do_request(struct ceph_mds_client *mdsc, ceph_get_cap_refs(ceph_inode(req->r_old_dentry_dir), CEPH_CAP_PIN); + /* deny access to directories with pool_ns layouts */ + if (req->r_inode && S_ISDIR(req->r_inode->i_mode) && + ceph_inode(req->r_inode)->i_pool_ns_len) + return -EIO; + if (req->r_locked_dir && + ceph_inode(req->r_locked_dir)->i_pool_ns_len) + return -EIO; + /* issue */ mutex_lock(&mdsc->mutex); __register_request(mdsc, req, dir); |