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