Details
-
Bug
-
Resolution: Fixed
-
Minor
-
None
-
3
-
9223372036854775807
Description
When the xattr cache is disabled (or when we bypass it as in LU-11074), getxattr() will return a zero length value for any nonexistent attribute:
o:~# lctl set_param llite.*.xattr_cache=0
llite.lustre-ffff8c4ac8a60000.xattr_cache=0
o:~# cd /mnt/lustre
o:lustre# touch f0
o:lustre# getfattr -d -m- f0
# file: f0
lustre.lov=0s0AvRCwEAAAABAAAAAAAAAAEEAAACAAAAAAAQAAEAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
trusted.link=0s3/HqEQEAAAAsAAAAAAAAAAAAAAAAAAAAABQAAAACAAAABwAAAAEAAAAAZjA=
trusted.lma=0sAAAAAAAAAAABBAAAAgAAAAEAAAAAAAAA
trusted.lov=0s0AvRCwEAAAABAAAAAAAAAAEEAAACAAAAAAAQAAEAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
trusted.version=0sAQAAAAEAAAA=
o:lustre# getfattr -d -n user.blah f0
# file: f0
user.blah
o:lustre# strace getfattr -d -n user.blah f0
...
lstat("f0", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
getxattr("f0", "user.blah", NULL, 0) = 0
getxattr("f0", "user.blah", NULL, 0) = 0
...
After reenabling the xattr cache getxattr() works as expected:
o:lustre# lctl set_param llite.*.xattr_cache=1 llite.lustre-ffff8c4ac8a60000.xattr_cache=1 o:lustre# getfattr -d -n user.blah f0 f0: user.blah: No such attribute
This is because in mdt_getxattr_pack_reply() if the xattr doesn't exist then we return 0. And in mdt_getxattr() we have the following:
easize = mdt_getxattr_pack_reply(info);
if (easize < 0)
GOTO(out, rc = err_serious(easize));
repbody = req_capsule_server_get(info->mti_pill, &RMF_MDT_BODY);
LASSERT(repbody != NULL);
/* No need further getxattr. */
if (easize == 0 || reqbody->mbo_eadatasize == 0)
GOTO(out, rc = easize);
Attachments
Issue Links
- is related to
-
LU-11074 Invalid argument reading file caps
-
- Resolved
-