Whamcloud - gitweb
Branch HEAD
authorbwzhou <bwzhou>
Fri, 28 Sep 2007 05:12:56 +0000 (05:12 +0000)
committerbwzhou <bwzhou>
Fri, 28 Sep 2007 05:12:56 +0000 (05:12 +0000)
b=12207
i=johann
i=shadow

hide trusted.lov to the users and export it internally as lustre.lov

lustre/llite/xattr.c
lustre/tests/sanity.sh

index 5450038..4ae9f62 100644 (file)
 #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)
@@ -67,6 +69,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;
 }
 
@@ -106,7 +112,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);
 
         oc = ll_mdscapa_get(inode);
@@ -139,8 +146,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;
 
@@ -295,39 +306,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);
@@ -337,7 +352,10 @@ 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);
 
         CDEBUG(D_VFSTRACE, "VFS Op:inode=%lu/%u(%p)\n",
@@ -347,40 +365,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;
 }
index 16ef6f5..3477ff7 100644 (file)
@@ -3540,22 +3540,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}'`
@@ -3563,7 +3563,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