Whamcloud - gitweb
LU-3448 llite: call simple_setattr() from ll_md_setattr()
[fs/lustre-release.git] / lustre / tests / sanity.sh
index 39b1138..d64d161 100644 (file)
@@ -141,13 +141,13 @@ umask 077
 
 OLDDEBUG=$(lctl get_param -n debug 2> /dev/null)
 lctl set_param debug=-1 2> /dev/null || true
-test_0() {
+test_0a() {
        touch $DIR/$tfile
        $CHECKSTAT -t file $DIR/$tfile || error "$tfile is not a file"
        rm $DIR/$tfile
        $CHECKSTAT -a $DIR/$tfile || error "$tfile was not removed"
 }
-run_test 0 "touch .../$tfile ; rm .../$tfile ====================="
+run_test 0a "touch; rm ====================="
 
 test_0b() {
        chmod 0755 $DIR || error "chmod 0755 $DIR failed"
@@ -193,14 +193,6 @@ test_3() {
 }
 run_test 3 "mkdir; touch; rmdir; check dir ====================="
 
-test_4() {
-       test_mkdir -p $DIR/$tdir || error "mkdir $tdir failed"
-       $CHECKSTAT -t dir $DIR/$tdir || error "$tdir is not a directory"
-       test_mkdir $DIR/$tdir/d2 || error "mkdir $tdir/d2 failed"
-       $CHECKSTAT -t dir $DIR/$tdir/d2 || error "$tdir/d2 is not a directory"
-}
-run_test 4 "mkdir =============================================="
-
 test_5() {
        test_mkdir -p $DIR/$tdir || error "mkdir $tdir failed"
        test_mkdir $DIR/$tdir/d2 || error "mkdir $tdir/d2 failed"
@@ -215,20 +207,11 @@ test_6a() {
        chmod 0666 $DIR/$tfile || error "chmod 0666 $tfile failed"
        $CHECKSTAT -t file -p 0666 -u \#$UID $DIR/$tfile ||
                error "$tfile does not have perm 0666 or UID $UID"
-}
-run_test 6a "touch .../f6a; chmod .../f6a ======================"
-
-test_6b() {
-       [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID" && return
-       if [ ! -f $DIR/$tfile ]; then
-               touch $DIR/$tfile
-               chmod 0666 $DIR/$tfile
-       fi
        $RUNAS chmod 0444 $DIR/$tfile && error "chmod $tfile worked on UID $UID"
        $CHECKSTAT -t file -p 0666 -u \#$UID $DIR/$tfile ||
                error "$tfile should be 0666 and owned by UID $UID"
 }
-run_test 6b "$RUNAS chmod .../f6a (should return error) =="
+run_test 6a "touch f6a; chmod f6a; $RUNAS chmod f6a (should return error) =="
 
 test_6c() {
        [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID" && return
@@ -236,20 +219,11 @@ test_6c() {
        chown $RUNAS_ID $DIR/$tfile || error "chown $RUNAS_ID $file failed"
        $CHECKSTAT -t file -u \#$RUNAS_ID $DIR/$tfile ||
                error "$tfile should be owned by UID $RUNAS_ID"
-}
-run_test 6c "touch .../f6c; chown .../f6c ======================"
-
-test_6d() {
-       [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID" && return
-       if [ ! -f $DIR/$tfile ]; then
-               touch $DIR/$tfile
-               chown $RUNAS_ID $DIR/$tfile
-       fi
        $RUNAS chown $UID $DIR/$tfile && error "chown $UID $file succeeded"
        $CHECKSTAT -t file -u \#$RUNAS_ID $DIR/$tfile ||
                error "$tfile should be owned by UID $RUNAS_ID"
 }
-run_test 6d "$RUNAS chown .../f6c (should return error) =="
+run_test 6c "touch f6c; chown f6c; $RUNAS chown f6c (should return error) =="
 
 test_6e() {
        [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID" && return
@@ -257,20 +231,11 @@ test_6e() {
        chgrp $RUNAS_ID $DIR/$tfile || error "chgrp $RUNAS_ID $file failed"
        $CHECKSTAT -t file -u \#$UID -g \#$RUNAS_ID $DIR/$tfile ||
                error "$tfile should be owned by GID $UID"
-}
-run_test 6e "touch .../f6e; chgrp .../f6e ======================"
-
-test_6f() {
-       [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID" && return
-       if [ ! -f $DIR/$tfile ]; then
-               touch $DIR/$tfile
-               chgrp $RUNAS_ID $DIR/$tfile
-       fi
        $RUNAS chgrp $UID $DIR/$tfile && error "chgrp $UID $file succeeded"
        $CHECKSTAT -t file -u \#$UID -g \#$RUNAS_ID $DIR/$tfile ||
                error "$tfile should be owned by UID $UID and GID $RUNAS_ID"
 }
-run_test 6f "$RUNAS chgrp .../f6e (should return error) =="
+run_test 6e "touch f6e; chgrp f6e; $RUNAS chgrp f6e (should return error) =="
 
 test_6g() {
        [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID" && return
@@ -2146,6 +2111,29 @@ test_31n() {
 }
 run_test 31n "check link count of unlinked file"
 
+link_one() {
+       local TEMPNAME=$(mktemp $1_XXXXXX)
+       mlink $TEMPNAME $1 2> /dev/null &&
+               echo "$BASHPID: link $TEMPNAME to $1 succeeded"
+       munlink $TEMPNAME
+}
+
+test_31o() { # LU-2901
+       mkdir -p $DIR/$tdir
+       for LOOP in $(seq 100); do
+               rm -f $DIR/$tdir/$tfile*
+               for THREAD in $(seq 8); do
+                       link_one $DIR/$tdir/$tfile.$LOOP &
+               done
+               wait
+               local LINKS=$(ls -1 $DIR/$tdir | grep -c $tfile.$LOOP)
+               [ $LINKS -gt 1 ] && ls $DIR/$tdir &&
+                       error "$LINKS duplicate links to $tfile.$LOOP" &&
+                       break || true
+       done
+}
+run_test 31o "duplicate hard links with same filename"
+
 cleanup_test32_mount() {
        trap 0
        $UMOUNT $DIR/$tdir/ext2-mountpoint
@@ -7762,31 +7750,44 @@ test_129() {
        fi
        remote_mds_nodsh && skip "remote MDS with nodsh" && return
 
+       ENOSPC=28
        EFBIG=27
-       MAX=16384
 
-       set_dir_limits $MAX
        test_mkdir -p $DIR/$tdir
 
+       MAX=$(stat -c%s "$DIR/$tdir")
+       set_dir_limits $MAX
        local I=0
        local J=0
-       while [ ! $I -gt $((MAX * MDSCOUNT)) ]; do
+       while [ ! $I -gt $MAX ]; do
                $MULTIOP $DIR/$tdir/$J Oc
                rc=$?
-               if [ $rc -eq $EFBIG ]; then
+               #check two errors ENOSPC for new version of ext4 max_dir_size patch
+               #mainline kernel commit df981d03eeff7971ac7e6ff37000bfa702327ef1
+               #and EFBIG for previous versions
+               if [ $rc -eq $EFBIG -o $rc -eq $ENOSPC ] && [ $I -gt 0 ]; then
                        set_dir_limits 0
                        echo "return code $rc received as expected"
-                       return 0
+                       multiop $DIR/$tdir/$J Oc
+                       rc=$?
+                       I=$(stat -c%s "$DIR/$tdir")
+                       if [ $I -gt $MAX ] && [ $rc -eq 0 ]; then
+                               return 0
+                       else
+                               error_exit "return code $rc current dir size $I " \
+                                          "previous limit $MAX"
+                       fi
                elif [ $rc -ne 0 ]; then
                        set_dir_limits 0
-                       error_exit "return code $rc received instead of expected $EFBIG"
+                       error_exit "return code $rc received instead of expected " \
+                                  "$EFBIG or $ENOSPC, files in dir $I"
                fi
                J=$((J+1))
                I=$(stat -c%s "$DIR/$tdir")
        done
 
        set_dir_limits 0
-       error "exceeded dir size limit $MAX x $MDSCOUNT $((MAX * MDSCOUNT)) : $I bytes"
+       error "exceeded dir size limit $MAX x $MDSCOUNT $MAX : $I bytes"
 }
 run_test 129 "test directory size limit ========================"
 
@@ -11129,12 +11130,15 @@ test_228c() {
 }
 run_test 228c "NOT shrink the last entry in OI index node to recycle idle leaf"
 
-test_229() { # LU-2482
+test_229() { # LU-2482, LU-3448
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+       [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" && return
+
+       rm -f $DIR/$tfile
 
-       # Create a file with a release layout (stripe count = 0)
+       # Create a file with a released layout and stripe count 2.
        $MULTIOP $DIR/$tfile H2c ||
-               error "failed to create file w. released layout"
+               error "failed to create file with released layout"
 
        $GETSTRIPE -v $DIR/$tfile
 
@@ -11146,8 +11150,13 @@ test_229() { # LU-2482
        [ $stripe_count -eq 2 ] || error "stripe count not 2 ($stripe_count)"
        stat $DIR/$tfile || error "failed to stat released file"
 
-       $TRUNCATE $DIR/$tfile 200000
-       $CHECKSTAT -s 200000 $DIR/$tfile || error
+       # Truncate should fail.
+       $TRUNCATE $DIR/$tfile 200000 &&
+               error "truncate of released file should fail"
+
+       # Ensure that nothing happened anyway.
+       $CHECKSTAT -s 0 $DIR/$tfile ||
+               error "released file size should not change"
 
        # Stripe count should be no change after truncate
        stripe_count=$($GETSTRIPE -c $DIR/$tfile) || error "getstripe failed"
@@ -11155,7 +11164,7 @@ test_229() { # LU-2482
 
        rm $DIR/$tfile || error "failed to remove released file"
 }
-run_test 229 "getstripe/stat/rm work on released files (stripe count = 0)"
+run_test 229 "getstripe/stat/rm work on released files (stripe count = 2)"
 
 test_230a() {
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return