Skip to content

Commit

Permalink
ceph: fix getxattr vxattr handling
Browse files Browse the repository at this point in the history
Change the vxattr handling for getxattr so that vxattrs are checked
prior to any xattr content, and never after.  Enforce vxattr existence
via the exists_cb callback.

Signed-off-by: Sage Weil <sage@inktank.com>
Reviewed-by: Sam Lang <sam.lang@inktank.com>
  • Loading branch information
Sage Weil committed Feb 14, 2013
1 parent f36e447 commit 0bee82f
Showing 1 changed file with 8 additions and 12 deletions.
20 changes: 8 additions & 12 deletions fs/ceph/xattr.c
Original file line number Diff line number Diff line change
Expand Up @@ -569,13 +569,17 @@ ssize_t ceph_getxattr(struct dentry *dentry, const char *name, void *value,
if (!ceph_is_valid_xattr(name))
return -ENODATA;

/* let's see if a virtual xattr was requested */
vxattr = ceph_match_vxattr(inode, name);

spin_lock(&ci->i_ceph_lock);
dout("getxattr %p ver=%lld index_ver=%lld\n", inode,
ci->i_xattrs.version, ci->i_xattrs.index_version);

/* let's see if a virtual xattr was requested */
vxattr = ceph_match_vxattr(inode, name);
if (vxattr && !(vxattr->exists_cb && !vxattr->exists_cb(ci))) {
err = vxattr->getxattr_cb(ci, value, size);
goto out;
}

if (__ceph_caps_issued_mask(ci, CEPH_CAP_XATTR_SHARED, 1) &&
(ci->i_xattrs.index_version >= ci->i_xattrs.version)) {
goto get_xattr;
Expand All @@ -589,23 +593,15 @@ ssize_t ceph_getxattr(struct dentry *dentry, const char *name, void *value,

spin_lock(&ci->i_ceph_lock);

if (vxattr && vxattr->readonly) {
err = vxattr->getxattr_cb(ci, value, size);
goto out;
}

err = __build_xattrs(inode);
if (err < 0)
goto out;

get_xattr:
err = -ENODATA; /* == ENOATTR */
xattr = __get_xattr(ci, name);
if (!xattr) {
if (vxattr)
err = vxattr->getxattr_cb(ci, value, size);
if (!xattr)
goto out;
}

err = -ERANGE;
if (size && size < xattr->val_len)
Expand Down

0 comments on commit 0bee82f

Please sign in to comment.