Whamcloud - gitweb
LU-2833 tests: Unexempt sanity/48a for zfs
[fs/lustre-release.git] / lustre / tests / sanity.sh
index a5570fd..e5f2143 100644 (file)
@@ -60,9 +60,11 @@ init_logging
 
 [ "$SLOW" = "no" ] && EXCEPT_SLOW="24o 27m 64b 68 71 77f 78 115 124b 230d"
 
-[ $(facet_fstype $SINGLEMDS) = "zfs" ] &&
-# bug number for skipped test:        LU-1593 LU-2610 LU-2833 LU-1957 LU-2805
-       ALWAYS_EXCEPT="$ALWAYS_EXCEPT 34h     40      48a     180     184c"
+if [ $(facet_fstype $SINGLEMDS) = "zfs" ]; then
+       # bug number for skipped test: LU-1593 LU-1957 LU-2805
+       ALWAYS_EXCEPT="$ALWAYS_EXCEPT  34h     180     184c"
+       [ "$SLOW" = "no" ] && EXCEPT_SLOW="$EXCEPT_SLOW 51b 51ba"
+fi
 
 FAIL_ON_ERROR=false
 
@@ -603,7 +605,7 @@ test_17m() {
        stop mds${mds_index}
        do_facet mds${mds_index} $cmd || rc=$?
 
-       start mds${mds_index} $devname $MDS_MOUNT_OPTS
+       start mds${mds_index} $devname $MDS_MOUNT_OPTS || error "start failed"
        df $MOUNT > /dev/null 2>&1
        [ $rc -ne 0 ] && error "e2fsck should not report error upon "\
                "short/long symlink MDT: rc=$rc"
@@ -628,7 +630,8 @@ check_fs_consistency_17n() {
                stop mds${mdt_index}
                do_facet mds${mdt_index} $cmd || rc=$?
 
-               start mds${mdt_index} $devname $MDS_MOUNT_OPTS
+               start mds${mdt_index} $devname $MDS_MOUNT_OPTS ||
+                       error "mount mds${mdt_index} failed"
                df $MOUNT > /dev/null 2>&1
                [ $rc -ne 0 ] && break
        done
@@ -707,7 +710,8 @@ test_17o() {
 
        touch $WDIR/$tfile
        stop mds${mdt_index}
-       start mds${mdt_index} $mdtdevname $MDS_MOUNT_OPTS
+       start mds${mdt_index} $mdtdevname $MDS_MOUNT_OPTS ||
+               error "mount mds${mdt_index} failed"
 
        #define OBD_FAIL_OSD_LMA_INCOMPAT 0x194
        do_facet mds${mdt_index} lctl set_param fail_loc=0x194
@@ -1357,10 +1361,13 @@ test_27e() {
 run_test 27e "setstripe existing file (should return error) ======"
 
 test_27f() {
-       test_mkdir -p $DIR/d27
-       $SETSTRIPE -S 100 -i 0 -c 1 $DIR/d27/fbad && error "setstripe failed"
-       dd if=/dev/zero of=$DIR/d27/fbad bs=4k count=4 || error "dd failed"
-       $GETSTRIPE $DIR/d27/fbad || error "$GETSTRIPE failed"
+       test_mkdir $DIR/$tdir
+       $SETSTRIPE -S 100 -i 0 -c 1 $DIR/$tdir/$tfile &&
+               error "$SETSTRIPE $DIR/$tdir/$tfile failed"
+       $CHECKSTAT -t file $DIR/$tdir/$tfile &&
+               error "$CHECKSTAT -t file $DIR/$tdir/$tfile should fail"
+       dd if=/dev/zero of=$DIR/$tdir/$tfile bs=4k count=4 || error "dd failed"
+       $GETSTRIPE $DIR/$tdir/$tfile || error "$GETSTRIPE failed"
 }
 run_test 27f "setstripe with bad stripe size (should return error)"
 
@@ -3789,6 +3796,10 @@ run_test 46 "dirtying a previously written page ================"
 # test_47 is removed "Device nodes check" is moved to test_28
 
 test_48a() { # bug 2399
+       [ $(facet_fstype $SINGLEMDS) = "zfs" ] &&
+       [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.3.63) ] &&
+               skip "MDS prior to 2.3.63 handle ZFS dir .. incorrectly" &&
+               return
        check_kernel_version 34 || return 0
        test_mkdir -p $DIR/$tdir
        cd $DIR/$tdir
@@ -3971,22 +3982,30 @@ test_51b() {
 
        test_mkdir -p -c1 $BASE
 
+       $LFS df
+       $LFS df -i
        local mdtidx=$(printf "%04x" $($LFS getstripe -M $BASE))
        local numfree=$(lctl get_param -n mdc.$FSNAME-MDT$mdtidx*.filesfree)
-       [[ $numfree -lt 21000 ]] && skip "not enough free inodes ($numfree)" &&
+       [[ $numfree -lt 21000 ]] &&
+               skip "not enough free inodes ($numfree) on MDT$mdtidx" &&
                return
 
        [[ $numfree -lt $NUMTEST ]] && NUMTEST=$(($numfree - 50)) &&
-               echo "reduced count to $NUMTEST due to inodes"
+               echo "reduced count to $NUMTEST due to inodes on MDT$mdtidx"
 
        # need to check free space for the directories as well
        local blkfree=$(lctl get_param -n mdc.$FSNAME-MDT$mdtidx*.kbytesavail)
        numfree=$((blkfree / 4))
-       [[ $numfree -lt $NUMTEST ]] && NUMTEST=$(($numfree - 50)) &&
-               echo "reduced count to $NUMTEST due to blocks"
+       [[ $numfree -lt $NUMTEST ]] && NUMTEST=$((numfree - 50)) &&
+               echo "reduced count to $NUMTEST due to blocks on MDT$mdtidx"
 
        createmany -d $BASE/d $NUMTEST && echo $NUMTEST > $BASE/fnum ||
+       {
+               $LFS df
+               $LFS df -i
                echo "failed" > $BASE/fnum
+               error "failed to create $NUMTEST subdirs in MDT$mdtidx:$BASE"
+       }
 }
 run_test 51b "exceed 64k subdirectory nlink limit"
 
@@ -4760,28 +4779,6 @@ test_56v() {
 }
 run_test 56v "check 'lfs find -mdt match with lfs getstripe -M' ======="
 
-# Get and check the actual stripe count of one file.
-# Usage: check_stripe_count <file> <expected_stripe_count>
-check_stripe_count() {
-    local file=$1
-    local expected=$2
-    local actual
-
-    [[ -z "$file" || -z "$expected" ]] &&
-        error "check_stripe_count: invalid argument!"
-
-    local cmd="$GETSTRIPE -c $file"
-    actual=$($cmd) || error "$cmd failed"
-    actual=${actual%% *}
-
-    if [[ $actual -ne $expected ]]; then
-        [[ $expected -eq -1 ]] ||
-            error "$cmd wrong: found $actual, expected $expected"
-        [[ $actual -eq $OSTCOUNT ]] ||
-            error "$cmd wrong: found $actual, expected $OSTCOUNT"
-    fi
-}
-
 test_56w() {
        [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
        TDIR=$DIR/${tdir}w
@@ -6806,6 +6803,27 @@ test_102n() { # LU-4101 mdt: protect internal xattrs
                setfattr --remove=$trusted.$name $file1 2> /dev/null
        done
 
+       if [ $(lustre_version_code $SINGLEMDS) -gt $(version_code 2.6.50) ]
+       then
+               name="lfsck_ns"
+               # Try to copy xattr from $file0 to $file1.
+               value=$(getxattr $file0 trusted.$name 2> /dev/null)
+
+               setfattr --name=trusted.$name --value="$value" $file1 ||
+                       error "setxattr 'trusted.$name' failed"
+
+               # Try to set a garbage xattr.
+               value=0sVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIGl0c2VsZi4=
+
+               setfattr --name=trusted.$name --value="$value" $file1 ||
+                       error "setxattr 'trusted.$name' failed"
+
+               # Try to remove the xattr from $file1. We don't care if this
+               # appears to succeed or fail, we just don't want there to be
+               # any changes or crashes.
+               setfattr --remove=$trusted.$name $file1 2> /dev/null
+       fi
+
        # Get 'after' xattrs of file1.
        getfattr --absolute-names --dump --match=- $file1 > $xattr1
 
@@ -6852,6 +6870,9 @@ test_103a() {
                skip_env "could not find setfacl" && return
        $GSS && skip "could not run under gss" && return
 
+       gpasswd -a daemon bin                           # LU-5641
+       do_facet $SINGLEMDS gpasswd -a daemon bin       # LU-5641
+
        declare -a identity_old
 
        for num in $(seq $MDSCOUNT); do
@@ -9761,6 +9782,82 @@ test_154e()
 }
 run_test 154e ".lustre is not returned by readdir"
 
+test_154f() {
+       # create parent directory on a single MDT to avoid cross-MDT hardlinks
+       test_mkdir -p -c1 $DIR/$tdir/d
+       # test dirs inherit from its stripe
+       mkdir -p $DIR/$tdir/d/foo1 || error "mkdir error"
+       mkdir -p $DIR/$tdir/d/foo2 || error "mkdir error"
+       cp /etc/hosts $DIR/$tdir/d/foo1/$tfile
+       ln $DIR/$tdir/d/foo1/$tfile $DIR/$tdir/d/foo2/link
+       touch $DIR/f
+
+       # get fid of parents
+       local FID0=$($LFS path2fid $DIR/$tdir/d)
+       local FID1=$($LFS path2fid $DIR/$tdir/d/foo1)
+       local FID2=$($LFS path2fid $DIR/$tdir/d/foo2)
+       local FID3=$($LFS path2fid $DIR)
+
+       # check that path2fid --parents returns expected <parent_fid>/name
+       # 1) test for a directory (single parent)
+       local parent=$($LFS path2fid --parents $DIR/$tdir/d/foo1)
+       [ "$parent" == "$FID0/foo1" ] ||
+               error "expected parent: $FID0/foo1, got: $parent"
+
+       # 2) test for a file with nlink > 1 (multiple parents)
+       parent=$($LFS path2fid --parents $DIR/$tdir/d/foo1/$tfile)
+       echo "$parent" | grep -F "$FID1/$tfile" ||
+               error "$FID1/$tfile not returned in parent list"
+       echo "$parent" | grep -F "$FID2/link" ||
+               error "$FID2/link not returned in parent list"
+
+       # 3) get parent by fid
+       local file_fid=$($LFS path2fid $DIR/$tdir/d/foo1/$tfile)
+       parent=$($LFS path2fid --parents $MOUNT/.lustre/fid/$file_fid)
+       echo "$parent" | grep -F "$FID1/$tfile" ||
+               error "$FID1/$tfile not returned in parent list (by fid)"
+       echo "$parent" | grep -F "$FID2/link" ||
+               error "$FID2/link not returned in parent list (by fid)"
+
+       # 4) test for entry in root directory
+       parent=$($LFS path2fid --parents $DIR/f)
+       echo "$parent" | grep -F "$FID3/f" ||
+               error "$FID3/f not returned in parent list"
+
+       # 5) test it on root directory
+       [ -z "$($LFS path2fid --parents $MOUNT 2>/dev/null)" ] ||
+               error "$MOUNT should not have parents"
+
+       # enable xattr caching and check that linkea is correctly updated
+       local save="$TMP/$TESTSUITE-$TESTNAME.parameters"
+       save_lustre_params client "llite.*.xattr_cache" > $save
+       lctl set_param llite.*.xattr_cache 1
+
+       # 6.1) linkea update on rename
+       mv $DIR/$tdir/d/foo1/$tfile $DIR/$tdir/d/foo2/$tfile.moved
+
+       # get parents by fid
+       parent=$($LFS path2fid --parents $MOUNT/.lustre/fid/$file_fid)
+       # foo1 should no longer be returned in parent list
+       echo "$parent" | grep -F "$FID1" &&
+               error "$FID1 should no longer be in parent list"
+       # the new path should appear
+       echo "$parent" | grep -F "$FID2/$tfile.moved" ||
+               error "$FID2/$tfile.moved is not in parent list"
+
+       # 6.2) linkea update on unlink
+       rm -f $DIR/$tdir/d/foo2/link
+       parent=$($LFS path2fid --parents $MOUNT/.lustre/fid/$file_fid)
+       # foo2/link should no longer be returned in parent list
+       echo "$parent" | grep -F "$FID2/link" &&
+               error "$FID2/link should no longer be in parent list"
+       true
+
+       rm -f $DIR/f
+       restore_lustre_params < $save
+}
+run_test 154f "get parent fids by reading link ea"
+
 test_155_small_load() {
     local temp=$TMP/$tfile
     local file=$DIR/$tfile
@@ -11234,6 +11331,10 @@ test_205() { # Job stats
                trap jobstats_set EXIT
        fi
 
+       local user=$(do_facet $SINGLEMDS $LCTL --device $MDT0 \
+                    changelog_register -n)
+       echo "Registered as changelog user $user"
+
        # mkdir
        cmd="mkdir $DIR/$tfile"
        verify_jobstats "$cmd" "mdt"
@@ -11265,6 +11366,24 @@ test_205() { # Job stats
        cmd="mv -f $DIR/$tfile $DIR/jobstats_test_rename"
        verify_jobstats "$cmd" "mdt"
 
+       # Ensure that jobid are present in changelog (if supported by MDS)
+       if [ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.6.52) ]
+       then
+               $LFS changelog $MDT0 | tail -9
+               jobids=$($LFS changelog $MDT0 | tail -9 | grep -c "j=")
+               [ $jobids -eq 9 ] ||
+                       error "Wrong changelog jobid count $jobids != 9"
+
+               # LU-5862
+               JOBENV="disable"
+               jobstats_set $JOBENV
+               touch $DIR/$tfile
+               $LFS changelog $MDT0 | tail -1
+               jobids=$($LFS changelog $MDT0 | tail -1 | grep -c "j=")
+               [ $jobids -eq 0 ] ||
+                       error "Unexpected jobids when jobid_var=$JOBENV"
+       fi
+
        # cleanup
        rm -f $DIR/jobstats_test_rename
 
@@ -12458,11 +12577,16 @@ test_234() {
        touch $DIR/$tdir/$tfile || error "touch failed"
        # OBD_FAIL_LLITE_XATTR_ENOMEM
        $LCTL set_param fail_loc=0x1405
-       if [ ! -f /etc/SuSE-release ]; then
+       # output of the form: attr 2 4 44 3 fc13 x86_64
+       V=($(IFS=".-" rpm -q attr))
+       if [[ ${V[1]} > 2 || ${V[2]} > 4 || ${V[3]} > 44 ||
+             ${V[1]} = 2 && ${V[2]} = 4 && ${V[3]} = 44 && ${V[4]} > 6 ]]; then
                # attr pre-2.4.44-7 had a bug with rc
-               # LU-3703 - SLES clients have older attr
+               # LU-3703 - SLES 11 and FC13 clients have older attr
                getfattr -n user.attr $DIR/$tdir/$tfile &&
                        error "getfattr should have failed with ENOMEM"
+       else
+               skip "LU-3703: attr version $(getfattr --version) too old"
        fi
        $LCTL set_param fail_loc=0x0
        rm -rf $DIR/$tdir
@@ -12554,6 +12678,8 @@ test_238() {
 run_test 238 "Verify linkea consistency"
 
 test_239() {
+       [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.5.60) ] &&
+               skip "Need MDS version at least 2.5.60" && return
        local list=$(comma_list $(mdts_nodes))
 
        mkdir -p $DIR/$tdir
@@ -12586,6 +12712,31 @@ test_240() {
 }
 run_test 240 "race between ldlm enqueue and the connection RPC (no ASSERT)"
 
+test_241_bio() {
+       for LOOP in $(seq $1); do
+               dd if=$DIR/$tfile of=/dev/null bs=40960 count=1 2>/dev/null
+               cancel_lru_locks osc
+       done
+}
+
+test_241_dio() {
+       for LOOP in $(seq $1); do
+               dd if=$DIR/$tfile of=/dev/null bs=40960 count=1 \
+                                               iflag=direct 2>/dev/null
+       done
+}
+
+test_241() {
+       dd if=/dev/zero of=$DIR/$tfile count=1 bs=40960
+       ls -la $DIR/$tfile
+       cancel_lru_locks osc
+       test_241_bio 1000 &
+       PID=$!
+       test_241_dio 1000
+       wait $PID
+}
+run_test 241 "bio vs dio"
+
 cleanup_test_300() {
        trap 0
        umask $SAVE_UMASK