Commit b65917dd authored by Sage Weil's avatar Sage Weil

ceph: fix listxattr handling for vxattrs

Only include vxattrs in the result if they are not hidden and exist
(as determined by the exists_cb callback).

Note that the buffer size we return when 0 is passed in always includes
vxattrs that *might* exist, forming an upper bound.
Signed-off-by: default avatarSage Weil <sage@inktank.com>
Reviewed-by: default avatarSam Lang <sam.lang@inktank.com>
parent 0bee82fb
...@@ -657,23 +657,30 @@ ssize_t ceph_listxattr(struct dentry *dentry, char *names, size_t size) ...@@ -657,23 +657,30 @@ ssize_t ceph_listxattr(struct dentry *dentry, char *names, size_t size)
vir_namelen = ceph_vxattrs_name_size(vxattrs); vir_namelen = ceph_vxattrs_name_size(vxattrs);
/* adding 1 byte per each variable due to the null termination */ /* adding 1 byte per each variable due to the null termination */
namelen = vir_namelen + ci->i_xattrs.names_size + ci->i_xattrs.count; namelen = ci->i_xattrs.names_size + ci->i_xattrs.count;
err = -ERANGE; err = -ERANGE;
if (size && namelen > size) if (size && vir_namelen + namelen > size)
goto out; goto out;
err = namelen; err = namelen + vir_namelen;
if (size == 0) if (size == 0)
goto out; goto out;
names = __copy_xattr_names(ci, names); names = __copy_xattr_names(ci, names);
/* virtual xattr names, too */ /* virtual xattr names, too */
if (vxattrs) err = namelen;
if (vxattrs) {
for (i = 0; vxattrs[i].name; i++) { for (i = 0; vxattrs[i].name; i++) {
len = sprintf(names, "%s", vxattrs[i].name); if (!vxattrs[i].hidden &&
names += len + 1; !(vxattrs[i].exists_cb &&
!vxattrs[i].exists_cb(ci))) {
len = sprintf(names, "%s", vxattrs[i].name);
names += len + 1;
err += len + 1;
}
} }
}
out: out:
spin_unlock(&ci->i_ceph_lock); spin_unlock(&ci->i_ceph_lock);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment