Whamcloud - gitweb
LU-2901 mdt: duplicate link names in directory
[fs/lustre-release.git] / lustre / tests / sanity.sh
index 2244d5a..20599f5 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 ========================"
 
@@ -9541,6 +9542,7 @@ cleanup_obdecho_osc () {
 obdecho_test() {
         local OBD=$1
         local node=$2
+       local pages=${3:-64}
         local rc=0
         local id
         do_facet $node "$LCTL attach echo_client ec ec_uuid" || rc=1
@@ -9553,8 +9555,8 @@ obdecho_test() {
         echo "New object id is $id"
        [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec getattr $id" ||
                           rc=4; }
-       [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec test_brw 10 w v 64 $id" ||
-                          rc=4; }
+       [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec "                 \
+                          "test_brw 10 w v $pages $id" || rc=4; }
        [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec destroy $id 1" ||
                           rc=4; }
        [ $rc -eq 0 -o $rc -gt 2 ] && { do_facet $node "$LCTL --device ec "    \
@@ -9607,6 +9609,32 @@ test_180b() {
 }
 run_test 180b "test obdecho directly on obdfilter"
 
+test_180c() { # LU-2598
+       [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+       [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.4.0) ]] &&
+               skip "Need MDS version at least 2.4.0" && return
+
+       local rc=0
+       local rmmod_remote=false
+       local pages=16384 # 64MB bulk I/O RPC size
+       local target
+
+       do_rpc_nodes $(facet_active_host ost1) load_module obdecho/obdecho &&
+               rmmod_remote=true || error "failed to load module obdecho"
+
+       target=$(do_facet ost1 $LCTL dl | awk '/obdfilter/ {print $4}'|head -1)
+       if [[ -n $target ]]; then
+               obdecho_test "$target" ost1 "$pages" ||
+                       rc=${PIPESTATUS[0]}
+       else
+               echo "there is no obdfilter target on ost1"
+               rc=2
+       fi
+       $rmmod_remote && do_facet ost1 "rmmod obdecho" || true
+       return $rc
+}
+run_test 180c "test huge bulk I/O size on obdfilter, don't LASSERT"
+
 test_181() { # bug 22177
        test_mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir"
        # create enough files to index the directory
@@ -9842,6 +9870,37 @@ test_185() { # LU-2441
 }
 run_test 185 "Volatile file support"
 
+test_187a() {
+       local dir0=$DIR/$tdir/$testnum
+       mkdir -p $dir0 || error "creating dir $dir0"
+
+       local file=$dir0/file1
+       dd if=/dev/urandom of=$file count=10 bs=1M conv=fsync
+       local dv1=$($LFS data_version $file)
+       dd if=/dev/urandom of=$file seek=10 count=1 bs=1M conv=fsync
+       local dv2=$($LFS data_version $file)
+       [[ $dv1 != $dv2 ]] ||
+               error "data version did not change on write $dv1 == $dv2"
+
+       # clean up
+       rm -f $file1
+}
+run_test 187a "Test data version change"
+
+test_187b() {
+       local dir0=$DIR/$tdir/$testnum
+       mkdir -p $dir0 || error "creating dir $dir0"
+
+       declare -a DV=$($MULTIOP $dir0 Vw1000xYw1000xY | cut -f3 -d" ")
+       [[ ${DV[0]} != ${DV[1]} ]] ||
+               error "data version did not change on write"\
+                     " ${DV[0]} == ${DV[1]}"
+
+       # clean up
+       rm -f $file1
+}
+run_test 187b "Test data version change on volatile file"
+
 # OST pools tests
 check_file_in_pool()
 {
@@ -11071,6 +11130,34 @@ test_228c() {
 }
 run_test 228c "NOT shrink the last entry in OI index node to recycle idle leaf"
 
+test_229() { # LU-2482
+       [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+
+       # Create a file with a release layout (stripe count = 0)
+       $MULTIOP $DIR/$tfile H2c ||
+               error "failed to create file w. released layout"
+
+       $GETSTRIPE -v $DIR/$tfile
+
+       local pattern=$($GETSTRIPE -v $DIR/$tfile |
+                       grep lmm_stripe_pattern | awk '{print $2}')
+       [ X"$pattern" = X"80000001" ] || error "pattern error ($pattern)"
+
+       local stripe_count=$($GETSTRIPE -c $DIR/$tfile) || error "getstripe"
+       [ $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
+
+       # Stripe count should be no change after truncate
+       stripe_count=$($GETSTRIPE -c $DIR/$tfile) || error "getstripe failed"
+       [ $stripe_count -eq 2 ] || error "after trunc: ($stripe_count)"
+
+       rm $DIR/$tfile || error "failed to remove released file"
+}
+run_test 229 "getstripe/stat/rm work on released files (stripe count = 0)"
+
 test_230a() {
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
        [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return