[lustre-devel] [PATCH 074/622] lustre: llite: handle zero length xattr values correctly

James Simmons jsimmons at infradead.org
Thu Feb 27 13:09:02 PST 2020


From: "John L. Hammond" <jhammond at whamcloud.com>

In mdt_getxattr(), set OBD_MD_FLXATTR in mbo_valid of the reply's MDT
body so that the client can distinguish between nonexistent extended
attributes and zero length values. In ll_xattr_list() and
ll_getxattr_common() test for OBD_MD_FLXATTR and return 0 rather than
-ENODATA in the appropriate cases. Add sanity test_102t() to test that
zero length values are handled correctly.

Lustre-commit: 1e4164a1254d ("LU-11109 mdt: handle zero length xattr values correctly")
Signed-off-by: John L. Hammond <jhammond at whamcloud.com>
Reviewed-on: https://review.whamcloud.com/32755
Reviewed-by: Andreas Dilger <adilger at whamcloud.com>
Reviewed-by: Mikhail Pershin <mpershin at whamcloud.com>
Reviewed-by: James Simmons <uja.ornl at yahoo.com>
Signed-off-by: James Simmons <jsimmons at infradead.org>
---
 fs/lustre/llite/xattr.c | 22 +++++++++++++++++++++-
 1 file changed, 21 insertions(+), 1 deletion(-)

diff --git a/fs/lustre/llite/xattr.c b/fs/lustre/llite/xattr.c
index f25ae59..636334e 100644
--- a/fs/lustre/llite/xattr.c
+++ b/fs/lustre/llite/xattr.c
@@ -363,6 +363,11 @@ int ll_xattr_list(struct inode *inode, const char *name, int type, void *buffer,
 
 		/* only detect the xattr size */
 		if (size == 0) {
+			/* LU-11109: Older MDTs do not distinguish
+			 * between nonexistent xattrs and zero length
+			 * values in this case. Newer MDTs will return
+			 * -ENODATA or set OBD_MD_FLXATTR.
+			 */
 			rc = body->mbo_eadatasize;
 			goto out;
 		}
@@ -375,7 +380,22 @@ int ll_xattr_list(struct inode *inode, const char *name, int type, void *buffer,
 		}
 
 		if (body->mbo_eadatasize == 0) {
-			rc = -ENODATA;
+			/* LU-11109: Newer MDTs set OBD_MD_FLXATTR on
+			 * success so that we can distinguish between
+			 * zero length value and nonexistent xattr.
+			 *
+			 * If OBD_MD_FLXATTR is not set then we keep
+			 * the old behavior and return -ENODATA for
+			 * getxattr() when mbo_eadatasize is 0. But
+			 * -ENODATA only makes sense for getxattr()
+			 * and not for listxattr().
+			 */
+			if (body->mbo_valid & OBD_MD_FLXATTR)
+				rc = 0;
+			else if (valid == OBD_MD_FLXATTR)
+				rc = -ENODATA;
+			else
+				rc = 0;
 			goto out;
 		}
 
-- 
1.8.3.1



More information about the lustre-devel mailing list