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

lustre/ChangeLog
lustre/mds/mds_xattr.c
lustre/tests/conf-sanity.sh

index 42f3d63..59b0666 100644 (file)
@@ -31,6 +31,13 @@ tbd Sun Microsystems, Inc.
          of Lustre filesystem with 4K stack may cause a stack overflow. For
          more information, please refer to bugzilla 17630.
 
+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 accac2d..cd84bc5 100644 (file)
@@ -269,6 +269,16 @@ int mds_setxattr_internal(struct ptlrpc_request *req, struct mds_body *body)
                 GOTO(out, rc = -EOPNOTSUPP);
         }
 
+        /* currently lustre limit xattr size */
+        if (body->valid & OBD_MD_FLXATTR && !strcmp(xattr_name, XATTR_NAME_ACL_ACCESS))  {
+                xattrlen = lustre_msg_buflen(req->rq_reqmsg,
+                                             REQ_REC_OFF + 2);
+
+                if (xattrlen > LUSTRE_POSIX_ACL_MAX_SIZE)
+                        GOTO(out, -ERANGE);
+        }
+
+
         if (!strcmp(xattr_name, XATTR_NAME_ACL_ACCESS))
                 lockpart |= MDS_INODELOCK_LOOKUP;
 
@@ -301,9 +311,9 @@ int mds_setxattr_internal(struct ptlrpc_request *req, struct mds_body *body)
 
                         xattrlen = lustre_msg_buflen(req->rq_reqmsg,
                                                      REQ_REC_OFF + 2);
-                        if (xattrlen)
-                                xattr = lustre_msg_buf(req->rq_reqmsg,
-                                                       REQ_REC_OFF+2, xattrlen);
+
+                        xattr = lustre_msg_buf(req->rq_reqmsg,
+                                               REQ_REC_OFF+2, xattrlen);
 
                         LOCK_INODE_MUTEX(inode);
                         rc = inode->i_op->setxattr(de, xattr_name, xattr,
index 8347754..1541796 100644 (file)
@@ -145,6 +145,12 @@ setup() {
        mount_client $MOUNT
 }
 
+setup_noconfig() {
+       start_mds
+       start_ost
+       mount_client $MOUNT
+}
+
 cleanup_nocli() {
        stop_mds || return 201
        stop_ost || return 202
@@ -1598,5 +1604,30 @@ 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
+
+       stat $MOUNT/widestripe || return 12
+       
+       cleanup || error "can't cleanup"
+       return 0
+}
+run_test 48 "too many acls on file"
+
+
 equals_msg `basename $0`: test complete
 [ -f "$TESTSUITELOG" ] && cat $TESTSUITELOG && grep -q FAIL $TESTSUITELOG && exit 1 || true