From 8542ba2d90bb70d1da584401aa304923ac9cdec0 Mon Sep 17 00:00:00 2001
From: bwzhou <bwzhou>
Date: Thu, 27 Sep 2007 05:41:10 +0000
Subject: [PATCH] Branch b1_6 b=12207 i=johann i=shadow

hide trusted.lov to the users and export it internally as lustre.lov
---
 lustre/llite/xattr.c   | 146 ++++++++++++++++++++++-------------------
 lustre/tests/sanity.sh |  16 ++---
 2 files changed, 87 insertions(+), 75 deletions(-)

diff --git a/lustre/llite/xattr.c b/lustre/llite/xattr.c
index 5834f02b81..bda6b87dbf 100644
--- a/lustre/llite/xattr.c
+++ b/lustre/llite/xattr.c
@@ -49,13 +49,15 @@
 #define XATTR_USER_PREFIX       "user."
 #define XATTR_TRUSTED_PREFIX    "trusted."
 #define XATTR_SECURITY_PREFIX   "security."
+#define XATTR_LUSTRE_PREFIX     "lustre."
 
 #define XATTR_USER_T            (1)
 #define XATTR_TRUSTED_T         (2)
 #define XATTR_SECURITY_T        (3)
 #define XATTR_ACL_ACCESS_T      (4)
 #define XATTR_ACL_DEFAULT_T     (5)
-#define XATTR_OTHER_T           (6)
+#define XATTR_LUSTRE_T          (6)
+#define XATTR_OTHER_T           (7)
 
 static
 int get_xattr_type(const char *name)
@@ -78,6 +80,10 @@ int get_xattr_type(const char *name)
                      sizeof(XATTR_SECURITY_PREFIX) - 1))
                 return XATTR_SECURITY_T;
 
+        if (!strncmp(name, XATTR_LUSTRE_PREFIX,
+                     sizeof(XATTR_LUSTRE_PREFIX) - 1))
+                return XATTR_LUSTRE_T;
+
         return XATTR_OTHER_T;
 }
 
@@ -117,7 +123,8 @@ int ll_setxattr_common(struct inode *inode, const char *name,
                 RETURN(rc);
 
         /* b10667: ignore lustre special xattr for now */
-        if (xattr_type == XATTR_TRUSTED_T && strcmp(name, "trusted.lov") == 0)
+        if (xattr_type == XATTR_TRUSTED_T && strcmp(name, "trusted.lov") == 0 ||
+            xattr_type == XATTR_LUSTRE_T && strcmp(name, "lustre.lov") == 0)
                 RETURN(0);
 
         ll_inode2fid(&fid, inode);
@@ -149,8 +156,12 @@ int ll_setxattr(struct dentry *dentry, const char *name,
 
         ll_stats_ops_tally(ll_i2sbi(inode), LPROC_LL_SETXATTR, 1);
 
-        if (strncmp(name, XATTR_TRUSTED_PREFIX, 8) == 0 &&
-            strcmp(name + 8, "lov") == 0) {
+        if (strncmp(name, XATTR_TRUSTED_PREFIX, 
+                    sizeof(XATTR_TRUSTED_PREFIX) - 1) == 0 &&
+            strcmp(name + sizeof(XATTR_TRUSTED_PREFIX) - 1, "lov") == 0 ||
+            strncmp(name, XATTR_LUSTRE_PREFIX, 
+                    sizeof(XATTR_LUSTRE_PREFIX) - 1) == 0 &&
+            strcmp(name + sizeof(XATTR_LUSTRE_PREFIX) - 1, "lov") == 0) {
                 struct lov_user_md *lump = (struct lov_user_md *)value;
                 int rc = 0;
 
@@ -307,39 +318,43 @@ ssize_t ll_getxattr(struct dentry *dentry, const char *name,
 
         ll_stats_ops_tally(ll_i2sbi(inode), LPROC_LL_GETXATTR, 1);
 
-         if (strncmp(name, XATTR_TRUSTED_PREFIX, 8) == 0 &&
-             strcmp(name + 8, "lov") == 0) {
-                 struct lov_user_md *lump;
-                 struct lov_mds_md *lmm = NULL;
-                 struct ptlrpc_request *request = NULL;
-                 int rc = 0, lmmsize;
-
-                 if (S_ISREG(inode->i_mode)) {
-                         rc = ll_lov_getstripe_ea_info(dentry->d_parent->d_inode, 
-                                                       dentry->d_name.name, &lmm, 
-                                                       &lmmsize, &request);
-                 } else if (S_ISDIR(inode->i_mode)) {
-                         rc = ll_dir_getstripe(inode, &lmm, &lmmsize, &request);
-                 }
-
-                 if (rc < 0)
-                        GOTO(out, rc);
-                 if (size == 0)
-                        GOTO(out, rc = lmmsize);
-
-                 if (size < lmmsize) {
-                         CERROR("server bug: replied size %u > %u\n",
-                                lmmsize, (int)size);
-                         GOTO(out, rc = -ERANGE);
-                 }
-
-                 lump = (struct lov_user_md *)buffer;
-                 memcpy(lump, lmm, lmmsize);
-
-                 rc = lmmsize;
+        if (strncmp(name, XATTR_TRUSTED_PREFIX, 
+                    sizeof(XATTR_TRUSTED_PREFIX) - 1) == 0 &&
+            strcmp(name + sizeof(XATTR_TRUSTED_PREFIX) - 1, "lov") == 0 ||
+            strncmp(name, XATTR_LUSTRE_PREFIX, 
+                    sizeof(XATTR_LUSTRE_PREFIX) - 1) == 0 &&
+            strcmp(name + sizeof(XATTR_LUSTRE_PREFIX) - 1, "lov") == 0) {
+                struct lov_user_md *lump;
+                struct lov_mds_md *lmm = NULL;
+                struct ptlrpc_request *request = NULL;
+                int rc = 0, lmmsize;
+
+                if (S_ISREG(inode->i_mode)) {
+                        rc = ll_lov_getstripe_ea_info(dentry->d_parent->d_inode, 
+                                                      dentry->d_name.name, &lmm, 
+                                                      &lmmsize, &request);
+                } else if (S_ISDIR(inode->i_mode)) {
+                        rc = ll_dir_getstripe(inode, &lmm, &lmmsize, &request);
+                }
+
+                if (rc < 0)
+                       GOTO(out, rc);
+                if (size == 0)
+                       GOTO(out, rc = lmmsize);
+
+                if (size < lmmsize) {
+                        CERROR("server bug: replied size %u > %u\n",
+                               lmmsize, (int)size);
+                        GOTO(out, rc = -ERANGE);
+                }
+
+                lump = (struct lov_user_md *)buffer;
+                memcpy(lump, lmm, lmmsize);
+
+                rc = lmmsize;
 out:
-                 ptlrpc_req_finished(request);
-                 return(rc);
+                ptlrpc_req_finished(request);
+                return(rc);
         }
 
         return ll_getxattr_common(inode, name, buffer, size, OBD_MD_FLXATTR);
@@ -349,6 +364,9 @@ ssize_t ll_listxattr(struct dentry *dentry, char *buffer, size_t size)
 {
         struct inode *inode = dentry->d_inode;
         int rc = 0, rc2 = 0;
+        struct lov_mds_md *lmm = NULL;
+        struct ptlrpc_request *request = NULL;
+        int lmmsize;
 
         LASSERT(inode);
 
@@ -359,40 +377,34 @@ ssize_t ll_listxattr(struct dentry *dentry, char *buffer, size_t size)
 
         rc = ll_getxattr_common(inode, NULL, buffer, size, OBD_MD_FLXATTRLS);
 
-        if (!capable(CAP_SYS_ADMIN)) {
-                struct lov_mds_md *lmm = NULL;
-                struct ptlrpc_request *request = NULL;
-                int lmmsize;
-
-                if (S_ISREG(inode->i_mode)) {
-                        struct ll_inode_info *lli = ll_i2info(inode);
-                        struct lov_stripe_md *lsm = NULL;
-                        lsm = lli->lli_smd;
-                        if (lsm == NULL)
-                                rc2 = -1; 
-                } else if (S_ISDIR(inode->i_mode)) {
-                        rc2 = ll_dir_getstripe(inode, &lmm, &lmmsize, &request);
-                }
+        if (S_ISREG(inode->i_mode)) {
+                struct ll_inode_info *lli = ll_i2info(inode);
+                struct lov_stripe_md *lsm = NULL;
+                lsm = lli->lli_smd;
+                if (lsm == NULL)
+                        rc2 = -1; 
+        } else if (S_ISDIR(inode->i_mode)) {
+                rc2 = ll_dir_getstripe(inode, &lmm, &lmmsize, &request);
+        }
 
-                if (rc2 < 0) {
-                        GOTO(out, rc2 = 0);
-                } else {
-                        const int prefix_len = sizeof(XATTR_TRUSTED_PREFIX)-1;
-                        const size_t name_len   = sizeof("lov") - 1;
-                        const size_t total_len  = prefix_len + name_len + 1;
-
-                        if (buffer && (rc + total_len) <= size) {
-                                buffer += rc;
-                                memcpy(buffer,XATTR_TRUSTED_PREFIX, prefix_len);
-                                memcpy(buffer+prefix_len, "lov", name_len);
-                                buffer[prefix_len + name_len] = '\0';
-                        }
-                        rc2 = total_len;
+        if (rc2 < 0) {
+                GOTO(out, rc2 = 0);
+        } else {
+                const int prefix_len = sizeof(XATTR_LUSTRE_PREFIX)-1;
+                const size_t name_len   = sizeof("lov") - 1;
+                const size_t total_len  = prefix_len + name_len + 1;
+
+                if (buffer && (rc + total_len) <= size) {
+                        buffer += rc;
+                        memcpy(buffer,XATTR_LUSTRE_PREFIX, prefix_len);
+                        memcpy(buffer+prefix_len, "lov", name_len);
+                        buffer[prefix_len + name_len] = '\0';
                 }
-out:
-                ptlrpc_req_finished(request);
-                rc = rc + rc2;
+                rc2 = total_len;
         }
+out:
+        ptlrpc_req_finished(request);
+        rc = rc + rc2;
         
         return rc;
 }
diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh
index bd0a9c6d81..120ec88489 100644
--- a/lustre/tests/sanity.sh
+++ b/lustre/tests/sanity.sh
@@ -3469,22 +3469,22 @@ test_102b() {
 run_test 102b "getfattr/setfattr for trusted.lov EAs ============"
 
 test_102c() {
-	# b10930: get/set/list trusted.lov xattr
-	echo "get/set/list trusted.lov xattr ..."
+	# b10930: get/set/list lustre.lov xattr
+	echo "get/set/list lustre.lov xattr ..."
 	[ "$OSTCOUNT" -lt "2" ] && skip "skipping 2-stripe test" && return
 	mkdir -p $DIR/$tdir
 	chown $RUNAS_ID $DIR/$tdir
 	local testfile=$DIR/$tdir/$tfile
 	$RUNAS $SETSTRIPE $testfile 65536 1 2
-	$RUNAS getfattr -d -m "^trusted" $testfile 2> /dev/null | \
-	grep "trusted.lov" || error "can't get trusted.lov from $testfile"
+	$RUNAS getfattr -d -m "^lustre" $testfile 2> /dev/null | \
+	grep "lustre.lov" || error "can't get lustre.lov from $testfile"
 
 	local testfile2=${testfile}2
-	local value=`getfattr -n trusted.lov $testfile 2> /dev/null | \
-		     grep "trusted.lov" |sed -e 's/[^=]\+=//'  `
+	local value=`getfattr -n lustre.lov $testfile 2> /dev/null | \
+		     grep "lustre.lov" |sed -e 's/[^=]\+=//'  `
 	
 	$RUNAS $MCREATE $testfile2
-	$RUNAS setfattr -n trusted.lov -v $value $testfile2 	
+	$RUNAS setfattr -n lustre.lov -v $value $testfile2 	
 	local tmp_file=${testfile}3
 	$RUNAS $GETSTRIPE -v $testfile2 > $tmp_file
 	local stripe_size=`grep "size"  $tmp_file| awk '{print $2}'`
@@ -3492,7 +3492,7 @@ test_102c() {
 	[ $stripe_size -eq 65536 ] || error "stripe size $stripe_size != 65536"
 	[ $stripe_count -eq 2 ] || error "stripe count $stripe_count != 2"
 }
-run_test 102c "non-root getfattr/setfattr for trusted.lov EAs ==========="
+run_test 102c "non-root getfattr/setfattr for lustre.lov EAs ==========="
 
 get_stripe_info() {
 	stripe_size=0
-- 
GitLab