Whamcloud - gitweb
checking maximal acl size before set.
authorshadow <shadow>
Wed, 24 Dec 2008 21:41:57 +0000 (21:41 +0000)
committershadow <shadow>
Wed, 24 Dec 2008 21:41:57 +0000 (21:41 +0000)
Branch HEAD
b=17636
i=umka
i=deen

lustre/ChangeLog
lustre/include/linux/lustre_acl.h
lustre/mdt/mdt_xattr.c
lustre/tests/conf-sanity.sh

index 48d2398..6c0b31b 100644 (file)
@@ -13,6 +13,13 @@ tbd  Sun Microsystems, Inc.
         removed cwd "./" (refer to Bugzilla 14399).
        * File join has been disabled in this release, refer to Bugzilla 16929.
 
+Severity   : normal
+Frequency  : always with long access acl
+Bugzilla   : 17636
+Descriptoin: mds can't pack reply with long acl.
+Details    : mds don't control size of acl but they limited by reint/getattr
+             reply buffer.
+
 Severity   : enhancement
 Bugzilla   : 18061
 Description: Update to SLES10 kernel-2.6.16.60-0.33.
index cfdc247..c407e50 100644 (file)
@@ -60,6 +60,8 @@
 # ifndef HAVE_VFS_INTENT_PATCHES
 #  include <linux/lustre_intent.h>
 # endif
+/* XATTR_{REPLACE,CREATE} */
+#include <linux/xattr.h>
 #endif /* __KERNEL__ */
 
 /* ACL */
index 561a395..8e646b2 100644 (file)
 #endif
 #define DEBUG_SUBSYSTEM S_MDS
 
-/* prerequisite for linux/xattr.h */
-#include <linux/types.h>
-/* prerequisite for linux/xattr.h */
-#include <linux/fs.h>
-/* XATTR_{REPLACE,CREATE} */
-#include <linux/xattr.h>
-
+#include <lustre_acl.h>
 #include "mdt_internal.h"
 
 
@@ -330,18 +324,22 @@ int mdt_reint_setxattr(struct mdt_thread_info *info,
 
         if (strncmp(xattr_name, XATTR_USER_PREFIX,
                     sizeof(XATTR_USER_PREFIX) - 1) == 0) {
+                if (!(req->rq_export->exp_connect_flags & OBD_CONNECT_XATTR))
+                        GOTO(out, rc = -EOPNOTSUPP);
                 if (strcmp(xattr_name, XATTR_NAME_LOV) == 0)
                         GOTO(out, rc = -EACCES);
                 if (strcmp(xattr_name, XATTR_NAME_LMA) == 0)
                         GOTO(out, rc = 0);
                 if (strcmp(xattr_name, XATTR_NAME_LINK) == 0)
                         GOTO(out, rc = 0);
-        }
+        } else if ((valid & OBD_MD_FLXATTR) &&
+                   (strncmp(xattr_name, XATTR_NAME_ACL_ACCESS,
+                             sizeof(XATTR_NAME_ACL_ACCESS) - 1) == 0)) {
+                /* currently lustre limit acl access size */
+                xattr_len = req_capsule_get_size(pill, &RMF_EADATA, RCL_CLIENT);
 
-        if (!(req->rq_export->exp_connect_flags & OBD_CONNECT_XATTR) &&
-            (strncmp(xattr_name, XATTR_USER_PREFIX,
-                     sizeof(XATTR_USER_PREFIX) - 1) == 0)) {
-                GOTO(out, rc = -EOPNOTSUPP);
+                if (xattr_len > LUSTRE_POSIX_ACL_MAX_SIZE)
+                        GOTO(out, -ERANGE);
         }
 
         lockpart = MDS_INODELOCK_UPDATE;
index b1137e0..f6b319d 100644 (file)
@@ -143,6 +143,12 @@ setup() {
        mount_client $MOUNT
 }
 
+setup_noconfig() {
+       start_mds
+       start_ost
+       mount_client $MOUNT
+}
+
 cleanup_nocli() {
        stop_mds || return 201
        stop_ost || return 202
@@ -1570,6 +1576,35 @@ test_47() { #17674
 }
 run_test 47 "server restart does not make client loss lru_resize settings"
 
+# reformat after this test must need - if test will failed
+# we will have unkillable file at FS
+test_48() { # bug 17636
+       reformat
+       setup_noconfig
+        check_mount || return 2
+
+       $LFS setstripe $MOUNT -c -1 || return 9
+       $LFS getstripe $MOUNT || return 10
+
+       echo "ok" > $MOUNT/widestripe
+       $LFS getstripe $MOUNT/widestripe || return 11
+       # fill acl buffer for avoid expand lsm to them
+       awk -F : '{ print "u:"$1":rwx" }' /etc/passwd | while read acl; do  
+           setfacl -m $acl $MOUNT/widestripe
+       done
+       awk -F : '{ print "g:"$1":rwx" }' /etc/groups | while read acl; do  
+           setfacl -m $acl $MOUNT/widestripe
+       done
+
+
+       stat $MOUNT/widestripe || return 12
+       
+       cleanup || error "can't cleanup"
+       return 0
+}
+run_test 48 "too many acls on file"
+
+
 cleanup_gss
 equals_msg `basename $0`: test complete
 [ -f "$TESTSUITELOG" ] && cat $TESTSUITELOG && grep -q FAIL $TESTSUITELOG && exit 1 || true