mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-11-24 16:40:59 +07:00
ceph: fix getxattr vxattr handling
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>
This commit is contained in:
parent
f36e447296
commit
0bee82fb4b
@ -569,13 +569,17 @@ ssize_t ceph_getxattr(struct dentry *dentry, const char *name, void *value,
|
|||||||
if (!ceph_is_valid_xattr(name))
|
if (!ceph_is_valid_xattr(name))
|
||||||
return -ENODATA;
|
return -ENODATA;
|
||||||
|
|
||||||
/* let's see if a virtual xattr was requested */
|
|
||||||
vxattr = ceph_match_vxattr(inode, name);
|
|
||||||
|
|
||||||
spin_lock(&ci->i_ceph_lock);
|
spin_lock(&ci->i_ceph_lock);
|
||||||
dout("getxattr %p ver=%lld index_ver=%lld\n", inode,
|
dout("getxattr %p ver=%lld index_ver=%lld\n", inode,
|
||||||
ci->i_xattrs.version, ci->i_xattrs.index_version);
|
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) &&
|
if (__ceph_caps_issued_mask(ci, CEPH_CAP_XATTR_SHARED, 1) &&
|
||||||
(ci->i_xattrs.index_version >= ci->i_xattrs.version)) {
|
(ci->i_xattrs.index_version >= ci->i_xattrs.version)) {
|
||||||
goto get_xattr;
|
goto get_xattr;
|
||||||
@ -589,11 +593,6 @@ ssize_t ceph_getxattr(struct dentry *dentry, const char *name, void *value,
|
|||||||
|
|
||||||
spin_lock(&ci->i_ceph_lock);
|
spin_lock(&ci->i_ceph_lock);
|
||||||
|
|
||||||
if (vxattr && vxattr->readonly) {
|
|
||||||
err = vxattr->getxattr_cb(ci, value, size);
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
err = __build_xattrs(inode);
|
err = __build_xattrs(inode);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
goto out;
|
goto out;
|
||||||
@ -601,11 +600,8 @@ ssize_t ceph_getxattr(struct dentry *dentry, const char *name, void *value,
|
|||||||
get_xattr:
|
get_xattr:
|
||||||
err = -ENODATA; /* == ENOATTR */
|
err = -ENODATA; /* == ENOATTR */
|
||||||
xattr = __get_xattr(ci, name);
|
xattr = __get_xattr(ci, name);
|
||||||
if (!xattr) {
|
if (!xattr)
|
||||||
if (vxattr)
|
|
||||||
err = vxattr->getxattr_cb(ci, value, size);
|
|
||||||
goto out;
|
goto out;
|
||||||
}
|
|
||||||
|
|
||||||
err = -ERANGE;
|
err = -ERANGE;
|
||||||
if (size && size < xattr->val_len)
|
if (size && size < xattr->val_len)
|
||||||
|
Loading…
Reference in New Issue
Block a user