X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Ftests%2Fsanity.sh;h=238e75624e335920bc0c9c169fdef84163069ac8;hp=42d8eff336d5dd0c1bb631311991bfacc3b486da;hb=6e45c6d3ae4c46a0312bbb95b7e9ff09761f037d;hpb=70c37954649fbc4fc2d0820d5d422f96144071f9 diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh index 42d8eff..238e756 100644 --- a/lustre/tests/sanity.sh +++ b/lustre/tests/sanity.sh @@ -16,35 +16,18 @@ ALWAYS_EXCEPT=" 42a 42b 42c 42d 45 51d 68b $SANITY_EXCE # bug number for skipped tests: LU-2036 ALWAYS_EXCEPT=" 76 $ALWAYS_EXCEPT" -is_sles11() # LU-4351 -{ - if [ -r /etc/SuSE-release ] - then - local vers=`grep VERSION /etc/SuSE-release | awk '{print $3}'` - if [ $vers -eq 11 ] - then - return 0 - fi - fi - return 1 -} - -if is_sles11; then # LU-4351 - ALWAYS_EXCEPT="$ALWAYS_EXCEPT 54c" -fi - SRCDIR=$(cd $(dirname $0); echo $PWD) export PATH=$PATH:/sbin TMP=${TMP:-/tmp} +CC=${CC:-cc} CHECKSTAT=${CHECKSTAT:-"checkstat -v"} CREATETEST=${CREATETEST:-createtest} LFS=${LFS:-lfs} LFIND=${LFIND:-"$LFS find"} LVERIFY=${LVERIFY:-ll_dirstripe_verify} LCTL=${LCTL:-lctl} -MCREATE=${MCREATE:-mcreate} OPENFILE=${OPENFILE:-openfile} OPENUNLINK=${OPENUNLINK:-openunlink} export MULTIOP=${MULTIOP:-multiop} @@ -69,6 +52,7 @@ CLEANUP=${CLEANUP:-:} SETUP=${SETUP:-:} TRACE=${TRACE:-""} LUSTRE=${LUSTRE:-$(cd $(dirname $0)/..; echo $PWD)} +LUSTRE_TESTS_API_DIR=${LUSTRE_TESTS_API_DIR:-${LUSTRE}/tests/clientapi} . $LUSTRE/tests/test-framework.sh init_test_env $@ . ${CONFIG:=$LUSTRE/tests/cfg/${NAME}.sh} @@ -76,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-2833 LU-1957 LU-2805 + ALWAYS_EXCEPT="$ALWAYS_EXCEPT 34h 48a 180 184c" + [ "$SLOW" = "no" ] && EXCEPT_SLOW="$EXCEPT_SLOW 51b 51ba" +fi FAIL_ON_ERROR=false @@ -212,19 +198,19 @@ run_test 3 "mkdir; touch; rmdir; check dir =====================" # LU-4471 - failed rmdir on remote directories still removes directory on MDT0 test_4() { local MDTIDX=1 - local remote_dir=remote_dir - [ $MDSCOUNT -ge 2 ] && skip "skip now for LU-4690" && return #LU-4690 - test_mkdir $DIR/$remote_dir || + test_mkdir $DIR/$tdir || error "Create remote directory failed" - touch $DIR/$remote_dir/$tfile || + touch $DIR/$tdir/$tfile || error "Create file under remote directory failed" - rmdir $DIR/$remote_dir && - error "Expect error removing in-use dir $DIR/$remote_dir" + rmdir $DIR/$tdir && + error "Expect error removing in-use dir $DIR/$tdir" + + test -d $DIR/$tdir || error "Remote directory disappeared" - test -d $DIR/$remote_dir || error "Remote directory disappeared" + rm -rf $DIR/$tdir || error "remove remote dir error" } run_test 4 "mkdir; touch dir/file; rmdir; checkdir (expect error)" @@ -446,14 +432,14 @@ test_17e() { run_test 17e "symlinks: create recursive symlink (should return error) ====" test_17f() { - test_mkdir -p $DIR/d17f - ln -s 1234567890/2234567890/3234567890/4234567890 $DIR/d17f/111 - ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890 $DIR/d17f/222 - ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890 $DIR/d17f/333 - ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890/9234567890/a234567890/b234567890 $DIR/d17f/444 - ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890/9234567890/a234567890/b234567890/c234567890/d234567890/f234567890 $DIR/d17f/555 - ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890/9234567890/a234567890/b234567890/c234567890/d234567890/f234567890/aaaaaaaaaa/bbbbbbbbbb/cccccccccc/dddddddddd/eeeeeeeeee/ffffffffff/ $DIR/d17f/666 - ls -l $DIR/d17f + test_mkdir -p $DIR/$tdir + ln -s 1234567890/2234567890/3234567890/4234567890 $DIR/$tdir/111 + ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890 $DIR/$tdir/222 + ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890 $DIR/$tdir/333 + ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890/9234567890/a234567890/b234567890 $DIR/$tdir/444 + ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890/9234567890/a234567890/b234567890/c234567890/d234567890/f234567890 $DIR/$tdir/555 + ln -s 1234567890/2234567890/3234567890/4234567890/5234567890/6234567890/7234567890/8234567890/9234567890/a234567890/b234567890/c234567890/d234567890/f234567890/aaaaaaaaaa/bbbbbbbbbb/cccccccccc/dddddddddd/eeeeeeeeee/ffffffffff/ $DIR/$tdir/666 + ls -l $DIR/$tdir } run_test 17f "symlinks: long and very long symlink name ========================" @@ -515,7 +501,7 @@ run_test 17h "create objects: lov_free_memmd() doesn't lbug" test_17i() { #bug 20018 remote_mds_nodsh && skip "remote MDS with nodsh" && return [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - test_mkdir -p $DIR/$tdir + test_mkdir -c1 $DIR/$tdir local foo=$DIR/$tdir/$tfile local mdt_idx if [[ $MDSCOUNT -gt 1 ]]; then @@ -574,6 +560,7 @@ test_17m() { local i local rc=0 + remote_mds_nodsh && skip "remote MDS with nodsh" && return [ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.2.0) ] && [ $(lustre_version_code $SINGLEMDS) -le $(version_code 2.2.93) ] && skip "MDS 2.2.0-2.2.93 do not NUL-terminate symlinks" && return @@ -618,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" @@ -643,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 @@ -653,6 +641,7 @@ check_fs_consistency_17n() { test_17n() { local i + remote_mds_nodsh && skip "remote MDS with nodsh" && return [ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.2.0) ] && [ $(lustre_version_code $SINGLEMDS) -le $(version_code 2.2.93) ] && skip "MDS 2.2.0-2.2.93 do not NUL-terminate symlinks" && return @@ -664,9 +653,9 @@ test_17n() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - mkdir -p $DIR/$tdir + mkdir $DIR/$tdir for ((i=0; i<10; i++)); do - $LFS mkdir -i 1 $DIR/$tdir/remote_dir_${i} || + $LFS mkdir -i1 -c2 $DIR/$tdir/remote_dir_${i} || error "create remote dir error $i" createmany -o $DIR/$tdir/remote_dir_${i}/f 10 || error "create files under remote dir failed $i" @@ -705,6 +694,7 @@ test_17n() { run_test 17n "run e2fsck against master/slave MDT which contains remote dir" test_17o() { + remote_mds_nodsh && skip "remote MDS with nodsh" && return [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.3.64) ] && skip "Need MDS version at least 2.3.64" && return @@ -720,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 @@ -732,7 +723,7 @@ test_17o() { run_test 17o "stat file with incompat LMA feature" test_18() { - touch $DIR/f || error "Failed to touch $DIR/f: $?" + touch $DIR/$tfile || error "Failed to touch $DIR/$tfile: $?" ls $DIR || error "Failed to ls $DIR: $?" } run_test 18 "touch .../f ; ls ... ==============================" @@ -1035,7 +1026,6 @@ test_24t() { run_test 24t "mkdir .../R16a/b/c; rename .../R16a/b/c .../R16a =" test_24u() { # bug12192 - rm -rf $DIR/$tfile $MULTIOP $DIR/$tfile C2w$((2048 * 1024))c || error $CHECKSTAT -s $((2048 * 1024)) $DIR/$tfile || error "wrong file size" } @@ -1100,7 +1090,7 @@ test_24w() { # bug21506 dd if=/dev/zero bs=$SZ1 count=1 >> $DIR/$tfile || return 2 dd if=$DIR/$tfile of=$DIR/${tfile}_left bs=1M skip=4097 || return 3 SZ2=`ls -l $DIR/${tfile}_left | awk '{print $5}'` - [ "$SZ1" = "$SZ2" ] || \ + [[ "$SZ1" -eq "$SZ2" ]] || error "Error reading at the end of the file $tfile" } run_test 24w "Reading a file larger than 4Gb" @@ -1196,16 +1186,71 @@ test_24A() { # LU-3182 rm -rf $DIR/$tdir mkdir -p $DIR/$tdir createmany -m $DIR/$tdir/$tfile $NFILES - local t=`ls $DIR/$tdir | wc -l` - local u=`ls $DIR/$tdir | sort -u | wc -l` - if [ $t -ne $NFILES -o $u -ne $NFILES ] ; then - error "Expected $NFILES files, got $t ($u unique)" + local t=$(ls $DIR/$tdir | wc -l) + local u=$(ls $DIR/$tdir | sort -u | wc -l) + local v=$(ls -ai $DIR/$tdir | sort -u | wc -l) + if [ $t -ne $NFILES -o $u -ne $NFILES -o $v -ne $((NFILES + 2)) ] ; then + error "Expected $NFILES files, got $t ($u unique $v .&..)" fi rm -rf $DIR/$tdir || error "Can not delete directories" } run_test 24A "readdir() returns correct number of entries." +test_24B() { # LU-4805 + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + local count + + mkdir $DIR/$tdir + $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/striped_dir || + error "create striped dir failed" + + count=$(ls -ai $DIR/$tdir/striped_dir | wc -l) + [ $count -eq 2 ] || error "Expected 2, got $count" + + touch $DIR/$tdir/striped_dir/a + + count=$(ls -ai $DIR/$tdir/striped_dir | wc -l) + [ $count -eq 3 ] || error "Expected 3, got $count" + + touch $DIR/$tdir/striped_dir/.f + + count=$(ls -ai $DIR/$tdir/striped_dir | wc -l) + [ $count -eq 4 ] || error "Expected 4, got $count" + + rm -rf $DIR/$tdir || error "Can not delete directories" +} +run_test 24B "readdir for striped dir return correct number of entries" + +test_24C() { + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + + mkdir $DIR/$tdir + mkdir $DIR/$tdir/d0 + mkdir $DIR/$tdir/d1 + + $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/d0/striped_dir || + error "create striped dir failed" + + cd $DIR/$tdir/d0/striped_dir + + local d0_ino=$(ls -i -l -a $DIR/$tdir | grep "d0" | awk '{print $1}') + local d1_ino=$(ls -i -l -a $DIR/$tdir | grep "d1" | awk '{print $1}') + local parent_ino=$(ls -i -l -a | grep "\.\." | awk '{print $1}') + + [ "$d0_ino" = "$parent_ino" ] || + error ".. wrong, expect $d0_ino, get $parent_ino" + + mv $DIR/$tdir/d0/striped_dir $DIR/$tdir/d1/ || + error "mv striped dir failed" + + parent_ino=$(ls -i -l -a | grep "\.\." | awk '{print $1}') + + [ "$d1_ino" = "$parent_ino" ] || + error ".. wrong after mv, expect $d1_ino, get $parent_ino" +} +run_test 24C "check .. in striped dir" + test_25a() { echo '== symlink sanity =============================================' @@ -1316,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)" @@ -1953,6 +2001,24 @@ test_27C() { #LU-2871 } run_test 27C "check full striping across all OSTs" +test_27D() { + [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" && return + local POOL=${POOL:-testpool} + local first_ost=0 + local last_ost=$(($OSTCOUNT - 1)) + local ost_step=1 + local ost_list=$(seq $first_ost $ost_step $last_ost) + local ost_range="$first_ost $last_ost $ost_step" + + mkdir -p $DIR/$tdir + pool_add $POOL || error "pool_add failed" + pool_add_targets $POOL $ost_range || error "pool_add_targets failed" + llapi_layout_test -d$DIR/$tdir -p$POOL -o$OSTCOUNT || + error "llapi_layout_test failed" + cleanup_pools || error "cleanup_pools failed" +} +run_test 27D "validate llapi_layout API" + # createtest also checks that device nodes are created and # then visible correctly (#2091) test_28() { # bug 2091 @@ -2225,6 +2291,25 @@ test_31o() { # LU-2901 } run_test 31o "duplicate hard links with same filename" +test_31p() { + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + + mkdir $DIR/$tdir + $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir + $LFS setdirstripe -D -c2 -t all_char $DIR/$tdir/striped_dir + + opendirunlink $DIR/$tdir/striped_dir/test1 || + error "open unlink test1 failed" + opendirunlink $DIR/$tdir/striped_dir/test2 || + error "open unlink test2 failed" + + $CHECKSTAT -a $DIR/$tdir/striped_dir/test1 || + error "test1 still exists" + $CHECKSTAT -a $DIR/$tdir/striped_dir/test2 || + error "test2 still exists" +} +run_test 31p "remove of open striped directory" + cleanup_test32_mount() { trap 0 $UMOUNT -d $DIR/$tdir/ext2-mountpoint @@ -2397,7 +2482,6 @@ test_32n() { run_test 32n "open d32n/symlink->tmp/symlink->lustre-root ======" test_32o() { - rm -fr $DIR/d32o $DIR/$tfile touch $DIR/$tfile test_mkdir -p $DIR/d32o/tmp TMP_DIR=$DIR/d32o/tmp @@ -2487,9 +2571,9 @@ test_33b() { rm -fr $DIR/d33 test_mkdir -p $DIR/d33 chown $RUNAS_ID $DIR/d33 - $RUNAS $OPENFILE -f 1286739555 $DIR/d33/f33 && error "create" || true + $RUNAS $OPENFILE -f 1286739555 $DIR/d33/f33 } -run_test 33b "test open file with malformed flags (No panic and return error)" +run_test 33b "test open file with malformed flags (No panic)" test_33c() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return @@ -2583,6 +2667,52 @@ test_33d() { } run_test 33d "openfile with 444 modes and malformed flags under remote dir" +test_33e() { + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + + mkdir $DIR/$tdir + + $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir + $LFS setdirstripe -i1 -c2 $DIR/$tdir/striped_dir1 + mkdir $DIR/$tdir/local_dir + + local s0_mode=$(stat -c%f $DIR/$tdir/striped_dir) + local s1_mode=$(stat -c%f $DIR/$tdir/striped_dir1) + local l_mode=$(stat -c%f $DIR/$tdir/local_dir) + + [ "$l_mode" = "$s0_mode" -a "$l_mode" = "$s1_mode" ] || + error "mkdir $l_mode striped0 $s0_mode striped1 $s1_mode" + + rmdir $DIR/$tdir/* || error "rmdir failed" + + umask 777 + $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir + $LFS setdirstripe -i1 -c2 $DIR/$tdir/striped_dir1 + mkdir $DIR/$tdir/local_dir + + s0_mode=$(stat -c%f $DIR/$tdir/striped_dir) + s1_mode=$(stat -c%f $DIR/$tdir/striped_dir1) + l_mode=$(stat -c%f $DIR/$tdir/local_dir) + + [ "$l_mode" = "$s0_mode" -a "$l_mode" = "$s1_mode" ] || + error "mkdir $l_mode striped0 $s0_mode striped1 $s1_mode 777" + + rmdir $DIR/$tdir/* || error "rmdir(umask 777) failed" + + umask 000 + $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir + $LFS setdirstripe -i1 -c2 $DIR/$tdir/striped_dir1 + mkdir $DIR/$tdir/local_dir + + s0_mode=$(stat -c%f $DIR/$tdir/striped_dir) + s1_mode=$(stat -c%f $DIR/$tdir/striped_dir1) + l_mode=$(stat -c%f $DIR/$tdir/local_dir) + + [ "$l_mode" = "$s0_mode" -a "$l_mode" = "$s1_mode" ] || + error "mkdir $l_mode striped0 $s0_mode striped1 $s1_mode 0" +} +run_test 33e "mkdir and striped directory should have same mode" + TEST_34_SIZE=${TEST_34_SIZE:-2000000000000} test_34a() { rm -f $DIR/f34 @@ -2804,6 +2934,25 @@ test_36h() { } run_test 36h "utime on file racing with OST BRW write ==========" +test_36i() { + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + + mkdir $DIR/$tdir + $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/striped_dir + + local mtime=$(stat -c%Y $DIR/$tdir/striped_dir) + local new_mtime=$((mtime + 200)) + + #change Modify time of striped dir + touch -m -d @$new_mtime $DIR/$tdir/striped_dir || + error "change mtime failed" + + local got=$(stat -c%Y $DIR/$tdir/striped_dir) + + [ "$new_mtime" = "$got" ] || error "expect $new_mtime got $got" +} +run_test 36i "change mtime on striped directory" + # test_37 - duplicate with tests 32q 32r test_38() { @@ -3803,7 +3952,7 @@ run_test 50 "special situations: /proc symlinks ===============" test_51a() { # was test_51 # bug 1516 - create an empty entry right after ".." then split dir - test_mkdir -p $DIR/$tdir + test_mkdir -c1 $DIR/$tdir touch $DIR/$tdir/foo $MCREATE $DIR/$tdir/bar rm $DIR/$tdir/foo @@ -3827,24 +3976,32 @@ test_51b() { # cleanup the directory rm -fr $BASE - test_mkdir -p $BASE + 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" @@ -3930,6 +4087,23 @@ test_51d() { } run_test 51d "check object distribution ====================" +test_51e() { + if [ "$(facet_fstype $SINGLEMDS)" != ldiskfs ]; then + skip "Only applicable to ldiskfs-based MDTs" + return + fi + + test_mkdir -c1 $DIR/$tdir || error "create $tdir failed" + test_mkdir -c1 $DIR/$tdir/d0 || error "create d0 failed" + + touch $DIR/$tdir/d0/foo + createmany -l $DIR/$tdir/d0/foo $DIR/$tdir/d0/f- 65001 && + error "file exceed 65000 nlink limit!" + unlinkmany $DIR/$tdir/d0/f- 65001 + return 0 +} +run_test 51e "check file nlink limit" + test_52a() { [ -f $DIR/$tdir/foo ] && chattr -a $DIR/$tdir/foo test_mkdir -p $DIR/$tdir @@ -4072,31 +4246,34 @@ cleanup_54c() { loopdev="$DIR/loop54c" trap 0 - $UMOUNT -d $tdir || rc=$? + $UMOUNT -d $DIR/$tdir || rc=$? losetup -d $loopdev || true - rm $loopdev + losetup -d $LOOPDEV || true + rm -rf $loopdev $DIR/$tfile $DIR/$tdir return $rc } test_54c() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - tfile="$DIR/f54c" - tdir="$DIR/d54c" loopdev="$DIR/loop54c" find_loop_dev [ -z "$LOOPNUM" ] && echo "couldn't find empty loop device" && return - mknod $loopdev b 7 $LOOPNUM - echo "make a loop file system with $tfile on $loopdev ($LOOPNUM)..." - dd if=/dev/zero of=$tfile bs=$(get_page_size client) seek=1024 count=1 > /dev/null - losetup $loopdev $tfile || error "can't set up $loopdev for $tfile" trap cleanup_54c EXIT + mknod $loopdev b 7 $LOOPNUM + echo "make a loop file system with $DIR/$tfile on $loopdev ($LOOPNUM)." + dd if=/dev/zero of=$DIR/$tfile bs=$(get_page_size client) seek=1024 count=1 > /dev/null + losetup $loopdev $DIR/$tfile || + error "can't set up $loopdev for $DIR/$tfile" mkfs.ext2 $loopdev || error "mke2fs on $loopdev" - test_mkdir -p $tdir - mount -t ext2 $loopdev $tdir || error "error mounting $loopdev on $tdir" - dd if=/dev/zero of=$tdir/tmp bs=`page_size` count=30 || error "dd write" - df $tdir - dd if=$tdir/tmp of=/dev/zero bs=`page_size` count=30 || error "dd read" + test_mkdir -p $DIR/$tdir + mount -t ext2 $loopdev $DIR/$tdir || + error "error mounting $loopdev on $DIR/$tdir" + dd if=/dev/zero of=$DIR/$tdir/tmp bs=$(get_page_size client) count=30 || + error "dd write" + df $DIR/$tdir + dd if=$DIR/$tdir/tmp of=/dev/zero bs=$(get_page_size client) count=30 || + error "dd read" cleanup_54c } run_test 54c "block device works in lustre =====================" @@ -4450,31 +4627,41 @@ test_56s() { # LU-611 EXPECTED=$(((NUMDIRS + 1) * NUMFILES)) CMD="$LFIND -stripe-count $OSTCOUNT -type f $TDIR" NUMS=$($CMD | wc -l) - [ $NUMS -eq $EXPECTED ] || + [ $NUMS -eq $EXPECTED ] || { + $GETSTRIPE -R $TDIR error "\"$CMD\" wrong: found $NUMS, expected $EXPECTED" + } EXPECTED=$(((NUMDIRS + 1) * NUMFILES + EXTRA)) CMD="$LFIND -stripe-count +0 -type f $TDIR" NUMS=$($CMD | wc -l) - [ $NUMS -eq $EXPECTED ] || + [ $NUMS -eq $EXPECTED ] || { + $GETSTRIPE -R $TDIR error "\"$CMD\" wrong: found $NUMS, expected $EXPECTED" + } EXPECTED=$ONESTRIPE CMD="$LFIND -stripe-count 1 -type f $TDIR" NUMS=$($CMD | wc -l) - [ $NUMS -eq $EXPECTED ] || + [ $NUMS -eq $EXPECTED ] || { + $GETSTRIPE -R $TDIR error "\"$CMD\" wrong: found $NUMS, expected $EXPECTED" + } CMD="$LFIND -stripe-count -2 -type f $TDIR" NUMS=$($CMD | wc -l) - [ $NUMS -eq $EXPECTED ] || + [ $NUMS -eq $EXPECTED ] || { + $GETSTRIPE -R $TDIR error "\"$CMD\" wrong: found $NUMS, expected $EXPECTED" + } EXPECTED=0 CMD="$LFIND -stripe-count $((OSTCOUNT + 1)) -type f $TDIR" NUMS=$($CMD | wc -l) - [ $NUMS -eq $EXPECTED ] || + [ $NUMS -eq $EXPECTED ] || { + $GETSTRIPE -R $TDIR error "\"$CMD\" wrong: found $NUMS, expected $EXPECTED" + } } run_test 56s "check lfs find -stripe-count works" @@ -4588,28 +4775,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 -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 @@ -4741,6 +4906,30 @@ test_56y() { } run_test 56y "lfs find -L raid0|released" +test_56z() { # LU-4824 + # This checks to make sure 'lfs find' continues after errors + # There are two classes of errors that should be caught: + # - If multiple paths are provided, all should be searched even if one + # errors out + # - If errors are encountered during the search, it should not terminate + # early + local i + test_mkdir $DIR/$tdir + for i in d{0..9}; do + test_mkdir $DIR/$tdir/$i + done + touch $DIR/$tdir/d{0..9}/$tfile + $LFS find $DIR/non_existent_dir $DIR/$tdir && + error "$LFS find did not return an error" + # Make a directory unsearchable. This should NOT be the last entry in + # directory order. Arbitrarily pick the 6th entry + chmod 700 $(lfs find $DIR/$tdir -type d | sed '6!d') + local count=$($RUNAS $LFS find $DIR/non_existent $DIR/$tdir | wc -l) + # The user should be able to see 10 directories and 9 files + [ $count == 19 ] || error "$LFS find did not continue after error" +} +run_test 56z "lfs find should continue after an error" + test_57a() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return # note test will not do anything if MDS is not local @@ -5310,8 +5499,6 @@ test_72a() { # bug 5695 - Test that on 2.6 remove_suid works properly skip_env "User $RUNAS_ID does not exist - skipping" return 0 } - # We had better clear the $DIR to get enough space for dd - rm -rf $DIR/* touch $DIR/$tfile chmod 777 $DIR/$tfile chmod ug+s $DIR/$tfile @@ -5723,6 +5910,7 @@ test_79() { # bug 12743 run_test 79 "df report consistency check =======================" test_80() { # bug 10718 + remote_ost_nodsh && skip "remote OST with nodsh" && return [ $PARALLEL == "yes" ] && skip "skip parallel run" && return # relax strong synchronous semantics for slow backends like ZFS local soc="obdfilter.*.sync_on_lock_cancel" @@ -6234,7 +6422,7 @@ cleanup_test102() { } test_102a() { - local testfile=$DIR/xattr_testfile + local testfile=$DIR/$tfile touch $testfile @@ -6649,7 +6837,7 @@ run_acl_subtest() return $? } -test_103 () { +test_103a() { [ "$UID" != 0 ] && skip_env "must run as root" && return [ -z "$(lctl get_param -n mdc.*-mdc-*.connect_flags | grep acl)" ] && skip "must have acl enabled" && return @@ -6657,6 +6845,8 @@ test_103 () { skip_env "could not find setfacl" && return $GSS && skip "could not run under gss" && return + gpasswd -a daemon bin # LU-5641 + declare -a identity_old for num in $(seq $MDSCOUNT); do @@ -6710,7 +6900,55 @@ test_103 () { fi done } -run_test 103 "acl test =========================================" +run_test 103a "acl test =========================================" + +test_103b() { + local noacl=false + local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/}) + local mountopts=$MDS_MOUNT_OPTS + + if [[ "$MDS_MOUNT_OPTS" =~ "noacl" ]]; then + noacl=true + else + # stop the MDT + stop $SINGLEMDS || error "failed to stop MDT." + # remount the MDT + if [ -z "$MDS_MOUNT_OPTS" ]; then + MDS_MOUNT_OPTS="-o noacl" + else + MDS_MOUNT_OPTS="${MDS_MOUNT_OPTS},noacl" + fi + start $SINGLEMDS $MDT_DEV $MDS_MOUNT_OPTS || + error "failed to start MDT." + MDS_MOUNT_OPTS=$mountopts + fi + + touch $DIR/$tfile + setfacl -m u:bin:rw $DIR/$tfile && error "setfacl should fail" + + if ! $noacl; then + # stop the MDT + stop $SINGLEMDS || error "failed to stop MDT." + # remount the MDT + start $SINGLEMDS $MDT_DEV $MDS_MOUNT_OPTS || + error "failed to start MDT." + fi + + true +} +run_test 103b "MDS mount option 'noacl'" + +test_103c() { + mkdir -p $DIR/$tdir + cp -rp $DIR/$tdir $DIR/$tdir.bak + + [ -n "$(getfattr -d -m. $DIR/$tdir | grep posix_acl_default)" ] && + error "$DIR/$tdir shouldn't contain default ACL" + [ -n "$(getfattr -d -m. $DIR/$tdir.bak | grep posix_acl_default)" ] && + error "$DIR/$tdir.bak shouldn't contain default ACL" + true +} +run_test 103c "'cp -rp' won't set empty acl" test_104a() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return @@ -6750,7 +6988,7 @@ run_test 104b "$RUNAS lfs check servers test ====================" test_105a() { # doesn't work on 2.4 kernels touch $DIR/$tfile - if [ -n "$(mount | grep "$MOUNT.*flock" | grep -v noflock)" ]; then + if $(flock_is_enabled); then flocks_test 1 on -f $DIR/$tfile || error "fail flock on" else flocks_test 1 off -f $DIR/$tfile || error "fail flock off" @@ -6761,7 +6999,7 @@ run_test 105a "flock when mounted without -o flock test ========" test_105b() { touch $DIR/$tfile - if [ -n "$(mount | grep "$MOUNT.*flock" | grep -v noflock)" ]; then + if $(flock_is_enabled); then flocks_test 1 on -c $DIR/$tfile || error "fail flock on" else flocks_test 1 off -c $DIR/$tfile || error "fail flock off" @@ -6772,7 +7010,7 @@ run_test 105b "fcntl when mounted without -o flock test ========" test_105c() { touch $DIR/$tfile - if [ -n "$(mount | grep "$MOUNT.*flock" | grep -v noflock)" ]; then + if $(flock_is_enabled); then flocks_test 1 on -l $DIR/$tfile || error "fail flock on" else flocks_test 1 off -l $DIR/$tfile || error "fail flock off" @@ -6784,8 +7022,7 @@ run_test 105c "lockf when mounted without -o flock test ========" test_105d() { # bug 15924 [ $PARALLEL == "yes" ] && skip "skip parallel run" && return test_mkdir -p $DIR/$tdir - [ -z "$(mount | grep "$MOUNT.*flock" | grep -v noflock)" ] && - skip "mount w/o flock enabled" && return + flock_is_enabled || { skip "mount w/o flock enabled" && return; } #define OBD_FAIL_LDLM_CP_CB_WAIT 0x315 $LCTL set_param fail_loc=0x80000315 flocks_test 2 $DIR/$tdir @@ -6793,8 +7030,7 @@ test_105d() { # bug 15924 run_test 105d "flock race (should not freeze) ========" test_105e() { # bug 22660 && 22040 - [ -z "$(mount | grep "$MOUNT.*flock" | grep -v noflock)" ] && - skip "mount w/o flock enabled" && return + flock_is_enabled || { skip "mount w/o flock enabled" && return; } touch $DIR/$tfile flocks_test 3 $DIR/$tfile } @@ -7648,12 +7884,16 @@ test_120e() { cancel_lru_locks osc dd if=$DIR/$tdir/f1 of=/dev/null stat $DIR/$tdir $DIR/$tdir/f1 > /dev/null + # XXX client can not do early lock cancel of OST lock + # during unlink (LU-4206), so cancel osc lock now. + cancel_lru_locks osc can1=$(do_facet $SINGLEMDS \ "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" | awk '/ldlm_cancel/ {print $2}') blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats | awk '/ldlm_bl_callback/ {print $2}') unlink $DIR/$tdir/f1 + sleep 5 can2=$(do_facet $SINGLEMDS \ "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" | awk '/ldlm_cancel/ {print $2}') @@ -7675,19 +7915,23 @@ test_120f() { lru_resize_disable osc test_mkdir -p -c1 $DIR/$tdir/d1 test_mkdir -p -c1 $DIR/$tdir/d2 - dd if=/dev/zero of=$DIR/$tdir/d1/f1 count=1 - dd if=/dev/zero of=$DIR/$tdir/d2/f2 count=1 - cancel_lru_locks mdc - cancel_lru_locks osc - dd if=$DIR/$tdir/d1/f1 of=/dev/null - dd if=$DIR/$tdir/d2/f2 of=/dev/null - stat $DIR/$tdir/d1 $DIR/$tdir/d2 $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2 > /dev/null + dd if=/dev/zero of=$DIR/$tdir/d1/f1 count=1 + dd if=/dev/zero of=$DIR/$tdir/d2/f2 count=1 + cancel_lru_locks mdc + cancel_lru_locks osc + dd if=$DIR/$tdir/d1/f1 of=/dev/null + dd if=$DIR/$tdir/d2/f2 of=/dev/null + stat $DIR/$tdir/d1 $DIR/$tdir/d2 $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2 > /dev/null + # XXX client can not do early lock cancel of OST lock + # during rename (LU-4206), so cancel osc lock now. + cancel_lru_locks osc can1=$(do_facet $SINGLEMDS \ "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" | awk '/ldlm_cancel/ {print $2}') blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats | awk '/ldlm_bl_callback/ {print $2}') - mv $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2 + mrename $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2 + sleep 5 can2=$(do_facet $SINGLEMDS \ "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" | awk '/ldlm_cancel/ {print $2}') @@ -8579,11 +8823,12 @@ som_mode_switch() { if [ x$som = x"enabled" ]; then [ $((gl2 - gl1)) -gt 0 ] && error "no glimpse RPC is expected" - MOUNTOPT=`echo $MOUNTOPT | sed 's/som_preview//g'` + MOUNT_OPTS=`echo $MOUNT_OPTS | + sed 's/som_preview,\|,som_preview\|som_preview//g'` do_facet mgs "$LCTL conf_param $FSNAME.mdt.som=disabled" else [ $((gl2 - gl1)) -gt 0 ] || error "some glimpse RPC is expected" - MOUNTOPT="$MOUNTOPT,som_preview" + MOUNT_OPTS="${MOUNT_OPTS:+$MOUNT_OPTS,}som_preview" do_facet mgs "$LCTL conf_param $FSNAME.mdt.som=enabled" fi @@ -8599,12 +8844,12 @@ test_132() { #1028, SOM remote_mds_nodsh && skip "remote MDS with nodsh" && return local num=$(get_mds_dir $DIR) local mymds=mds${num} - local MOUNTOPT_SAVE=$MOUNTOPT + local MOUNT_OPTS_SAVE=$MOUNT_OPTS dd if=/dev/zero of=$DIR/$tfile count=1 2>/dev/null cancel_lru_locks osc - som1=$(do_facet $mymds "$LCTL get_param mdt.*.som" | awk -F= ' {print $2}' | head -n 1) + som1=$(do_facet $mymds "$LCTL get_param -n mdt.*.som" | head -n 1) gl1=$(get_ost_param "ldlm_glimpse_enqueue") stat $DIR/$tfile >/dev/null @@ -8616,7 +8861,7 @@ test_132() { #1028, SOM dd if=/dev/zero of=$DIR/$tfile count=1 2>/dev/null cancel_lru_locks osc - som2=$(do_facet $mymds "$LCTL get_param mdt.*.som" | awk -F= ' {print $2}' | head -n 1) + som2=$(do_facet $mymds "$LCTL get_param -n mdt.*.som" | head -n 1) if [ $som1 == $som2 ]; then error "som is still "$som2 if [ x$som2 = x"enabled" ]; then @@ -8631,7 +8876,7 @@ test_132() { #1028, SOM gl2=$(get_ost_param "ldlm_glimpse_enqueue") echo "====> SOM is "$som2", "$((gl2 - gl1))" glimpse RPC occured" som_mode_switch $som2 $gl1 $gl2 - MOUNTOPT=$MOUNTOPT_SAVE + MOUNT_OPTS=$MOUNT_OPTS_SAVE } run_test 132 "som avoids glimpse rpc" @@ -8891,11 +9136,12 @@ test_133d() { run_test 133d "Verifying rename_stats ========================================" test_133e() { + remote_mds_nodsh && skip "remote MDS with nodsh" && return + remote_ost_nodsh && skip "remote OST with nodsh" && return [ $PARALLEL == "yes" ] && skip "skip parallel run" && return local testdir=$DIR/${tdir}/stats_testdir local ctr f0 f1 bs=32768 count=42 sum - remote_ost_nodsh && skip "remote OST with nodsh" && return mkdir -p ${testdir} || error "mkdir failed" $SETSTRIPE -c 1 -i 0 ${testdir}/${tfile} @@ -8936,9 +9182,21 @@ test_133e() { run_test 133e "Verifying OST {read,write}_bytes nid stats =================" test_133f() { - local proc_dirs="/proc/fs/lustre/ /proc/sys/lnet/ /proc/sys/lustre/" + local proc_dirs + + local dirs="/proc/fs/lustre/ /proc/sys/lnet/ /proc/sys/lustre/ \ +/sys/fs/lustre/ /sys/fs/lnet/" + local dir + for dir in $dirs; do + if [ -d $dir ]; then + proc_dirs="$proc_dirs $dir" + fi + done + local facet + remote_mds_nodsh && skip "remote MDS with nodsh" && return + remote_ost_nodsh && skip "remote OST with nodsh" && return # First without trusting modes. find $proc_dirs -exec cat '{}' \; &> /dev/null @@ -8963,7 +9221,17 @@ test_133f() { run_test 133f "Check for LBUGs/Oopses/unreadable files in /proc" test_133g() { - local proc_dirs="/proc/fs/lustre/ /proc/sys/lnet/ /proc/sys/lustre/" + local proc_dirs + + local dirs="/proc/fs/lustre/ /proc/sys/lnet/ /proc/sys/lustre/ \ +/sys/fs/lustre/ /sys/fs/lnet/" + local dir + for dir in $dirs; do + if [ -d $dir ]; then + proc_dirs="$proc_dirs $dir" + fi + done + local facet # Second verifying readability. @@ -8971,7 +9239,8 @@ test_133g() { -type f \ -not -name force_lbug \ -not -name changelog_mask \ - -exec badarea_io '{}' \; > /dev/null + -exec badarea_io '{}' \; &> /dev/null || + error "find $proc_dirs failed" [ $(lustre_version_code $SINGLEMDS) -le $(version_code 2.5.54) ] && skip "Too old lustre on MDS" @@ -8984,10 +9253,14 @@ test_133g() { -type f \ -not -name force_lbug \ -not -name changelog_mask \ - -exec badarea_io '{}' \\\; &> /dev/null + -exec badarea_io '{}' \\\; &> /dev/null || + error "$facet find $proc_dirs failed" done + # remount the FS in case writes/reads /proc break the FS + cleanup || error "failed to unmount" + setup || error "failed to setup" true } run_test 133g "Check for Oopses on bad io area writes/reads in /proc" @@ -9079,14 +9352,14 @@ function roc_hit_init() { dd if=/dev/urandom of=$file bs=4k count=4 2>&1 > /dev/null idx=$(printf %04x $i) BEFORE=$(get_osd_param $list *OST*$idx stats | - awk '$1 == "cache_access" {sum += $2} + awk '$1 == "cache_access" {sum += $7} END { printf("%0.0f", sum) }') cancel_lru_locks osc cat $file >/dev/null AFTER=$(get_osd_param $list *OST*$idx stats | - awk '$1 == "cache_access" {sum += $2} + awk '$1 == "cache_access" {sum += $7} END { printf("%0.0f", sum) }') echo BEFORE:$BEFORE AFTER:$AFTER @@ -9103,7 +9376,7 @@ function roc_hit_init() { function roc_hit() { local list=$(comma_list $(osts_nodes)) echo $(get_osd_param $list '' stats | - awk '$1 == "cache_hit" {sum += $2} + awk '$1 == "cache_hit" {sum += $7} END { printf("%0.0f", sum) }') } @@ -9322,9 +9595,13 @@ dot_lustre_fid_permission_check() { $OPENFILE -f O_LOV_DELAY_CREATE:O_CREAT $test_dir/$tfile-2 fid=$($LFS path2fid $test_dir/$tfile-2) - echo "cp /etc/passwd $MOUNT/.lustre/fid/$fid" - cp /etc/passwd $MOUNT/.lustre/fid/$fid && - error "create lov data thru .lustre should fail." + + if [ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.6.50) ] + then # LU-5424 + echo "cp /etc/passwd $MOUNT/.lustre/fid/$fid" + cp /etc/passwd $MOUNT/.lustre/fid/$fid || + error "create lov data thru .lustre failed" + fi echo "cp /etc/passwd $test_dir/$tfile-2" cp /etc/passwd $test_dir/$tfile-2 || error "copy to $test_dir/$tfile-2 failed." @@ -9393,7 +9670,7 @@ test_154b() { local rc=0 mkdir -p $DIR/$tdir - $LFS mkdir -i $MDTIDX -c $MDSCOUNT $remote_dir || + $LFS mkdir -i $MDTIDX $remote_dir || error "create remote directory failed" cp /etc/hosts $remote_dir/$tfile @@ -9468,6 +9745,93 @@ test_154d() { } run_test 154d "Verify open file fid" +test_154e() +{ + [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.6.50) ]] && + skip "Need MDS version at least 2.6.50" && return + + if ls -a $MOUNT | grep -q '^\.lustre$'; then + error ".lustre returned by readdir" + fi +} +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 /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 @@ -9589,6 +9953,7 @@ test_155h() { run_test 155h "Verify big file correctness: read cache:off write_cache:off" test_156() { + remote_ost_nodsh && skip "remote OST with nodsh" && return [ $PARALLEL == "yes" ] && skip "skip parallel run" && return local CPAGES=3 local BEFORE @@ -9896,6 +10261,12 @@ run_test 160b "Verify that very long rename doesn't crash in changelog" test_160c() { local rc=0 + local server_version=$(lustre_version_code $SINGLEMDS) + + [[ $server_version -gt $(version_code 2.5.57) ]] || + [[ $server_version -gt $(version_code 2.5.1) && + $server_version -lt $(version_code 2.5.50) ]] || + { skip "Need MDS version at least 2.5.58 or 2.5.2+"; return; } [ $PARALLEL == "yes" ] && skip "skip parallel run" && return # Registration step @@ -10017,6 +10388,7 @@ test_161b() { run_test 161b "link ea sanity under remote directory" test_161c() { + remote_mds_nodsh && skip "remote MDS with nodsh" && return [ $PARALLEL == "yes" ] && skip "skip parallel run" && return [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.1.5) ]] && skip "Need MDS version at least 2.1.5" && return @@ -10132,25 +10504,30 @@ test_162() { test_mkdir -p -c1 $DIR/$tdir/d2/p/q/r # regular file FID=$($LFS path2fid $DIR/$tdir/d2/$tfile | tr -d '[]') - check_path "$tdir/d2/$tfile" $FSNAME $FID --link 0 + check_path "$tdir/d2/$tfile" $FSNAME $FID --link 0 || + error "check path $tdir/d2/$tfile failed" # softlink ln -s $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/p/q/r/slink FID=$($LFS path2fid $DIR/$tdir/d2/p/q/r/slink | tr -d '[]') - check_path "$tdir/d2/p/q/r/slink" $FSNAME $FID --link 0 + check_path "$tdir/d2/p/q/r/slink" $FSNAME $FID --link 0 || + error "check path $tdir/d2/p/q/r/slink failed" # softlink to wrong file ln -s /this/is/garbage $DIR/$tdir/d2/p/q/r/slink.wrong FID=$($LFS path2fid $DIR/$tdir/d2/p/q/r/slink.wrong | tr -d '[]') - check_path "$tdir/d2/p/q/r/slink.wrong" $FSNAME $FID --link 0 + check_path "$tdir/d2/p/q/r/slink.wrong" $FSNAME $FID --link 0 || + error "check path $tdir/d2/p/q/r/slink.wrong failed" # hardlink ln $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/p/q/r/hlink mv $DIR/$tdir/d2/$tfile $DIR/$tdir/d2/a/b/c/new_file FID=$($LFS path2fid $DIR/$tdir/d2/a/b/c/new_file | tr -d '[]') # fid2path dir/fsname should both work - check_path "$tdir/d2/a/b/c/new_file" $FSNAME $FID --link 1 - check_path "$DIR/$tdir/d2/p/q/r/hlink" $DIR $FID --link 0 + check_path "$tdir/d2/a/b/c/new_file" $FSNAME $FID --link 1 || + error "check path $tdir/d2/a/b/c/new_file failed" + check_path "$DIR/$tdir/d2/p/q/r/hlink" $DIR $FID --link 0 || + error "check path $DIR/$tdir/d2/p/q/r/hlink failed" # hardlink count: check that there are 2 links # Doesnt work with CMD yet: 17935 @@ -10159,12 +10536,45 @@ test_162() { # hardlink indexing: remove the first link rm $DIR/$tdir/d2/p/q/r/hlink - check_path "$tdir/d2/a/b/c/new_file" $FSNAME $FID --link 0 + check_path "$tdir/d2/a/b/c/new_file" $FSNAME $FID --link 0 || + error "check path $DIR/$tdir/d2/a/b/c/new_file failed" return 0 } run_test 162 "path lookup sanity" +test_162b() { + [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + + mkdir $DIR/$tdir + $LFS setdirstripe -i0 -c$MDSCOUNT -t all_char $DIR/$tdir/striped_dir || + error "create striped dir failed" + + local FID=$($LFS getdirstripe $DIR/$tdir/striped_dir | + tail -n 1 | awk '{print $2}') + stat $MOUNT/.lustre/fid/$FID && error "sub_stripe can be accessed" + + touch $DIR/$tdir/striped_dir/f{0..4} || error "touch f0..4 failed" + mkdir $DIR/$tdir/striped_dir/d{0..4} || error "mkdir d0..4 failed" + + # regular file + for ((i=0;i<5;i++)); do + FID=$($LFS path2fid $DIR/$tdir/striped_dir/f$i | tr -d '[]') || + error "get fid for f$i failed" + check_path "$tdir/striped_dir/f$i" $FSNAME $FID --link 0 || + error "check path $tdir/striped_dir/f$i failed" + + FID=$($LFS path2fid $DIR/$tdir/striped_dir/d$i | tr -d '[]') || + error "get fid for d$i failed" + check_path "$tdir/striped_dir/d$i" $FSNAME $FID --link 0 || + error "check path $tdir/striped_dir/d$i failed" + done + + return 0 +} +run_test 162b "striped directory path lookup sanity" + test_169() { # do directio so as not to populate the page cache log "creating a 10 Mb file" @@ -10255,7 +10665,7 @@ test_171() { # bug20592 } run_test 171 "test libcfs_debug_dumplog_thread stuck in do_exit() ======" -# it would be good to share it with obdfilter-survey/libecho code +# it would be good to share it with obdfilter-survey/iokit-libecho code setup_obdecho_osc () { local rc=0 local ost_nid=$1 @@ -10359,6 +10769,7 @@ run_test 180b "test obdecho directly on obdfilter" test_180c() { # LU-2598 [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + remote_ost_nodsh && skip "remote OST with nodsh" && return [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.4.0) ]] && skip "Need MDS version at least 2.4.0" && return @@ -10430,6 +10841,7 @@ test_182() { run_test 182 "Disable MDC RPCs semaphore wouldn't crash client ================" test_183() { # LU-2275 + remote_mds_nodsh && skip "remote MDS with nodsh" && return [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.3.56) ]] && skip "Need MDS version at least 2.3.56" && return @@ -10659,251 +11071,6 @@ test_187b() { } run_test 187b "Test data version change on volatile file" -# OST pools tests -check_file_in_pool() -{ - local file=$1 - local pool=$2 - local tlist="$3" - local res=$($GETSTRIPE $file | grep 0x | cut -f2) - for i in $res - do - for t in $tlist ; do - [ "$i" -eq "$t" ] && continue 2 - done - - echo "pool list: $tlist" - echo "striping: $res" - error_noexit "$file not allocated in $pool" - return 1 - done - return 0 -} - -pool_add() { - echo "Creating new pool" - local pool=$1 - - create_pool $FSNAME.$pool || - { error_noexit "No pool created, result code $?"; return 1; } - [ $($LFS pool_list $FSNAME | grep -c $pool) -eq 1 ] || - { error_noexit "$pool not in lfs pool_list"; return 2; } -} - -pool_add_targets() { - echo "Adding targets to pool" - local pool=$1 - local first=$2 - local last=$3 - local step=${4:-1} - - local list=$(seq $first $step $last) - - local t=$(for i in $list; do printf "$FSNAME-OST%04x_UUID " $i; done) - do_facet mgs $LCTL pool_add \ - $FSNAME.$pool $FSNAME-OST[$first-$last/$step] - wait_update $HOSTNAME "lctl get_param -n lov.$FSNAME-*.pools.$pool \ - | sort -u | tr '\n' ' ' " "$t" || { - error_noexit "Add to pool failed" - return 1 - } - local lfscount=$($LFS pool_list $FSNAME.$pool | grep -c "\-OST") - local addcount=$(((last - first) / step + 1)) - [ $lfscount -eq $addcount ] || { - error_noexit "lfs pool_list bad ost count" \ - "$lfscount != $addcount" - return 2 - } -} - -pool_set_dir() { - local pool=$1 - local tdir=$2 - echo "Setting pool on directory $tdir" - - $SETSTRIPE -c 2 -p $pool $tdir && return 0 - - error_noexit "Cannot set pool $pool to $tdir" - return 1 -} - -pool_check_dir() { - local pool=$1 - local tdir=$2 - echo "Checking pool on directory $tdir" - - local res=$($GETSTRIPE --pool $tdir | sed "s/\s*$//") - [ "$res" = "$pool" ] && return 0 - - error_noexit "Pool on '$tdir' is '$res', not '$pool'" - return 1 -} - -pool_dir_rel_path() { - echo "Testing relative path works well" - local pool=$1 - local tdir=$2 - local root=$3 - - mkdir -p $root/$tdir/$tdir - cd $root/$tdir - pool_set_dir $pool $tdir || return 1 - pool_set_dir $pool ./$tdir || return 2 - pool_set_dir $pool ../$tdir || return 3 - pool_set_dir $pool ../$tdir/$tdir || return 4 - rm -rf $tdir; cd - > /dev/null -} - -pool_alloc_files() { - echo "Checking files allocation from directory pool" - local pool=$1 - local tdir=$2 - local count=$3 - local tlist="$4" - - local failed=0 - for i in $(seq -w 1 $count) - do - local file=$tdir/file-$i - touch $file - check_file_in_pool $file $pool "$tlist" || \ - failed=$((failed + 1)) - done - [ "$failed" = 0 ] && return 0 - - error_noexit "$failed files not allocated in $pool" - return 1 -} - -pool_create_files() { - echo "Creating files in pool" - local pool=$1 - local tdir=$2 - local count=$3 - local tlist="$4" - - mkdir -p $tdir - local failed=0 - for i in $(seq -w 1 $count) - do - local file=$tdir/spoo-$i - $SETSTRIPE -p $pool $file - check_file_in_pool $file $pool "$tlist" || \ - failed=$((failed + 1)) - done - [ "$failed" = 0 ] && return 0 - - error_noexit "$failed files not allocated in $pool" - return 1 -} - -pool_lfs_df() { - echo "Checking 'lfs df' output" - local pool=$1 - - local t=$($LCTL get_param -n lov.$FSNAME-clilov-*.pools.$pool | - tr '\n' ' ') - local res=$($LFS df --pool $FSNAME.$pool | - awk '{print $1}' | - grep "$FSNAME-OST" | - tr '\n' ' ') - [ "$res" = "$t" ] && return 0 - - error_noexit "Pools OSTs '$t' is not '$res' that lfs df reports" - return 1 -} - -pool_file_rel_path() { - echo "Creating files in a pool with relative pathname" - local pool=$1 - local tdir=$2 - - mkdir -p $tdir || - { error_noexit "unable to create $tdir"; return 1 ; } - local file="/..$tdir/$tfile-1" - $SETSTRIPE -p $pool $file || - { error_noexit "unable to create $file" ; return 2 ; } - - cd $tdir - $SETSTRIPE -p $pool $tfile-2 || { - error_noexit "unable to create $tfile-2 in $tdir" - return 3 - } -} - -pool_remove_first_target() { - echo "Removing first target from a pool" - local pool=$1 - - local pname="lov.$FSNAME-*.pools.$pool" - local t=$($LCTL get_param -n $pname | head -n1) - do_facet mgs $LCTL pool_remove $FSNAME.$pool $t - wait_update $HOSTNAME "lctl get_param -n $pname | grep $t" "" || { - error_noexit "$t not removed from $FSNAME.$pool" - return 1 - } -} - -pool_remove_all_targets() { - echo "Removing all targets from pool" - local pool=$1 - local file=$2 - local pname="lov.$FSNAME-*.pools.$pool" - for t in $($LCTL get_param -n $pname | sort -u) - do - do_facet mgs $LCTL pool_remove $FSNAME.$pool $t - done - wait_update $HOSTNAME "lctl get_param -n $pname" "" || { - error_noexit "Pool $FSNAME.$pool cannot be drained" - return 1 - } - # striping on an empty/nonexistant pool should fall back - # to "pool of everything" - touch $file || { - error_noexit "failed to use fallback striping for empty pool" - return 2 - } - # setstripe on an empty pool should fail - $SETSTRIPE -p $pool $file 2>/dev/null && { - error_noexit "expected failure when creating file" \ - "with empty pool" - return 3 - } - return 0 -} - -pool_remove() { - echo "Destroying pool" - local pool=$1 - local file=$2 - - do_facet mgs $LCTL pool_destroy $FSNAME.$pool - - sleep 2 - # striping on an empty/nonexistant pool should fall back - # to "pool of everything" - touch $file || { - error_noexit "failed to use fallback striping for missing pool" - return 1 - } - # setstripe on an empty pool should fail - $SETSTRIPE -p $pool $file 2>/dev/null && { - error_noexit "expected failure when creating file" \ - "with missing pool" - return 2 - } - - # get param should return err once pool is gone - if wait_update $HOSTNAME "lctl get_param -n \ - lov.$FSNAME-*.pools.$pool 2>/dev/null || echo foo" "foo" - then - remove_pool_from_list $FSNAME.$pool - return 0 - fi - error_noexit "Pool $FSNAME.$pool is not destroyed" - return 3 -} - test_200() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return remote_mgs_nodsh && skip "remote MGS with nodsh" && return @@ -11126,6 +11293,7 @@ jobstats_set() { test_205() { # Job stats [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + remote_mgs_nodsh && skip "remote MGS with nodsh" && return [ -z "$(lctl get_param -n mdc.*.connect_flags | grep jobstats)" ] && skip "Server doesn't support jobstats" && return 0 [[ $JOBID_VAR = disable ]] && skip "jobstats is disabled" && return @@ -11137,6 +11305,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" @@ -11168,6 +11340,15 @@ 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" + fi + # cleanup rm -f $DIR/jobstats_test_rename @@ -11228,6 +11409,7 @@ test_208() { [[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.4.52) ]] || { skip "Need MDS version at least 2.4.52"; return 0; } + remote_mds_nodsh && skip "remote MDS with nodsh" && return echo "==== test 1: verify get lease work" $MULTIOP $DIR/$tfile oO_CREAT:O_RDWR:eRE+eU || error "get lease error" @@ -11333,7 +11515,7 @@ run_test 214 "hash-indexed directory test - bug 20133" # having "abc" as 1st arg, creates $TMP/lnet_abc.out and $TMP/lnet_abc.sys create_lnet_proc_files() { - cat /proc/sys/lnet/$1 >$TMP/lnet_$1.out || error "cannot read /proc/sys/lnet/$1" + lctl get_param -n $1 >$TMP/lnet_$1.out || error "cannot read lnet.$1" sysctl lnet.$1 >$TMP/lnet_$1.sys_tmp || error "cannot read lnet.$1" sed "s/^lnet.$1\ =\ //g" "$TMP/lnet_$1.sys_tmp" >$TMP/lnet_$1.sys @@ -11389,14 +11571,13 @@ test_215() { # for bugs 18102, 21079, 21517 local L2 # regexp for 2nd line (optional) local BR # regexp for the rest (body) - # /proc/sys/lnet/stats should look as 11 space-separated non-negative numerics + # lnet.stats should look as 11 space-separated non-negative numerics BR="^$N $N $N $N $N $N $N $N $N $N $N$" create_lnet_proc_files "stats" - check_lnet_proc_stats "stats.out" "/proc/sys/lnet/stats" "$BR" check_lnet_proc_stats "stats.sys" "lnet.stats" "$BR" remove_lnet_proc_files "stats" - # /proc/sys/lnet/routes should look like this: + # lnet.routes should look like this: # Routing disabled/enabled # net hops priority state router # where net is a string like tcp0, hops > 0, priority >= 0, @@ -11406,11 +11587,10 @@ test_215() { # for bugs 18102, 21079, 21517 L2="^net +hops +priority +state +router$" BR="^$NET +$N +(0|1) +(up|down) +$NID$" create_lnet_proc_files "routes" - check_lnet_proc_entry "routes.out" "/proc/sys/lnet/routes" "$BR" "$L1" "$L2" check_lnet_proc_entry "routes.sys" "lnet.routes" "$BR" "$L1" "$L2" remove_lnet_proc_files "routes" - # /proc/sys/lnet/routers should look like this: + # lnet.routers should look like this: # ref rtr_ref alive_cnt state last_ping ping_sent deadline down_ni router # where ref > 0, rtr_ref > 0, alive_cnt >= 0, state is up/down, # last_ping >= 0, ping_sent is boolean (0/1), deadline and down_ni are @@ -11418,11 +11598,10 @@ test_215() { # for bugs 18102, 21079, 21517 L1="^ref +rtr_ref +alive_cnt +state +last_ping +ping_sent +deadline +down_ni +router$" BR="^$P +$P +$N +(up|down) +$N +(0|1) +$I +$I +$NID$" create_lnet_proc_files "routers" - check_lnet_proc_entry "routers.out" "/proc/sys/lnet/routers" "$BR" "$L1" check_lnet_proc_entry "routers.sys" "lnet.routers" "$BR" "$L1" remove_lnet_proc_files "routers" - # /proc/sys/lnet/peers should look like this: + # lnet.peers should look like this: # nid refs state last max rtr min tx min queue # where nid is a string like 192.168.1.1@tcp2, refs > 0, # state is up/down/NA, max >= 0. last, rtr, min, tx, min are @@ -11430,21 +11609,19 @@ test_215() { # for bugs 18102, 21079, 21517 L1="^nid +refs +state +last +max +rtr +min +tx +min +queue$" BR="^$NID +$P +(up|down|NA) +$I +$N +$I +$I +$I +$I +$N$" create_lnet_proc_files "peers" - check_lnet_proc_entry "peers.out" "/proc/sys/lnet/peers" "$BR" "$L1" check_lnet_proc_entry "peers.sys" "lnet.peers" "$BR" "$L1" remove_lnet_proc_files "peers" - # /proc/sys/lnet/buffers should look like this: + # lnet.buffers should look like this: # pages count credits min # where pages >=0, count >=0, credits and min are numeric (0 or >0 or <0) L1="^pages +count +credits +min$" BR="^ +$N +$N +$I +$I$" create_lnet_proc_files "buffers" - check_lnet_proc_entry "buffers.out" "/proc/sys/lnet/buffers" "$BR" "$L1" check_lnet_proc_entry "buffers.sys" "lnet.buffers" "$BR" "$L1" remove_lnet_proc_files "buffers" - # /proc/sys/lnet/nis should look like this: + # lnet.nis should look like this: # nid status alive refs peer rtr max tx min # where nid is a string like 192.168.1.1@tcp2, status is up/down, # alive is numeric (0 or >0 or <0), refs >= 0, peer >= 0, @@ -11452,15 +11629,14 @@ test_215() { # for bugs 18102, 21079, 21517 L1="^nid +status +alive +refs +peer +rtr +max +tx +min$" BR="^$NID +(up|down) +$I +$N +$N +$N +$N +$I +$I$" create_lnet_proc_files "nis" - check_lnet_proc_entry "nis.out" "/proc/sys/lnet/nis" "$BR" "$L1" check_lnet_proc_entry "nis.sys" "lnet.nis" "$BR" "$L1" remove_lnet_proc_files "nis" - # can we successfully write to /proc/sys/lnet/stats? - echo "0" >/proc/sys/lnet/stats || error "cannot write to /proc/sys/lnet/stats" + # can we successfully write to lnet.stats? + lctl set_param -n stats=0 || error "cannot write to lnet.stats" sysctl -w lnet.stats=0 || error "cannot write to lnet.stats" } -run_test 215 "/proc/sys/lnet exists and has proper content - bugs 18102, 21079, 21517" +run_test 215 "lnet exists and has proper content - bugs 18102, 21079, 21517" test_216() { # bug 20317 [ $PARALLEL == "yes" ] && skip "skip parallel run" && return @@ -11839,6 +12015,7 @@ run_test 227 "running truncated executable does not cause OOM" # LU-1512 try to reuse idle OI blocks test_228a() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + remote_mds_nodsh && skip "remote MDS with nodsh" && return [ "$(facet_fstype $SINGLEMDS)" != "ldiskfs" ] && skip "non-ldiskfs backend" && return @@ -11880,6 +12057,7 @@ run_test 228a "try to reuse idle OI blocks" test_228b() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + remote_mds_nodsh && skip "remote MDS with nodsh" && return [ "$(facet_fstype $SINGLEMDS)" != "ldiskfs" ] && skip "non-ldiskfs backend" && return @@ -11929,6 +12107,7 @@ run_test 228b "idle OI blocks can be reused after MDT restart" #LU-1881 test_228c() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + remote_mds_nodsh && skip "remote MDS with nodsh" && return [ "$(facet_fstype $SINGLEMDS)" != "ldiskfs" ] && skip "non-ldiskfs backend" && return @@ -12051,6 +12230,14 @@ test_230b() { cp /etc/passwd $migrate_dir/$tfile cp /etc/passwd $other_dir/$tfile + chattr +SAD $migrate_dir + chattr +SAD $migrate_dir/$tfile + + local old_dir_flag=$(lsattr -a $migrate_dir | awk '/\/\.$/ {print $1}') + local old_file_flag=$(lsattr $migrate_dir/$tfile | awk '{print $1}') + local old_dir_mode=$(stat -c%f $migrate_dir) + local old_file_mode=$(stat -c%f $migrate_dir/$tfile) + mkdir -p $migrate_dir/dir_default_stripe2 $SETSTRIPE -c 2 $migrate_dir/dir_default_stripe2 $SETSTRIPE -c 2 $migrate_dir/${tfile}_stripe2 @@ -12080,6 +12267,22 @@ test_230b() { [ $mdt_index == 0 ] || error "$file is not on MDT${MDTIDX}" + local new_dir_flag=$(lsattr -a $migrate_dir | awk '/\/\.$/ {print $1}') + [ "$old_dir_flag" = "$new_dir_flag" ] || + error " expect $old_dir_flag get $new_dir_flag" + + local new_file_flag=$(lsattr $migrate_dir/$tfile | awk '{print $1}') + [ "$old_file_flag" = "$new_file_flag" ] || + error " expect $old_file_flag get $new_file_flag" + + local new_dir_mode=$(stat -c%f $migrate_dir) + [ "$old_dir_mode" = "$new_dir_mode" ] || + error "expect mode $old_dir_mode get $new_dir_mode" + + local new_file_mode=$(stat -c%f $migrate_dir/$tfile) + [ "$old_file_mode" = "$new_file_mode" ] || + error "expect mode $old_file_mode get $new_file_mode" + diff /etc/passwd $migrate_dir/$tfile || error "$tfile different after migration" @@ -12121,6 +12324,22 @@ test_230b() { error "$file is not on MDT${MDTIDX}" done + local new_dir_flag=$(lsattr -a $migrate_dir | awk '/\/\.$/ {print $1}') + [ "$old_dir_flag" = "$new_dir_flag" ] || + error " expect $old_dir_flag get $new_dir_flag" + + local new_file_flag=$(lsattr $migrate_dir/$tfile | awk '{print $1}') + [ "$old_file_flag" = "$new_file_flag" ] || + error " expect $old_file_flag get $new_file_flag" + + local new_dir_mode=$(stat -c%f $migrate_dir) + [ "$old_dir_mode" = "$new_dir_mode" ] || + error "expect mode $old_dir_mode get $new_dir_mode" + + local new_file_mode=$(stat -c%f $migrate_dir/$tfile) + [ "$old_file_mode" = "$new_file_mode" ] || + error "expect mode $old_file_mode get $new_file_mode" + diff /etc/passwd ${migrate_dir}/$tfile || error "$tfile different after migration" @@ -12323,11 +12542,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 @@ -12387,7 +12611,8 @@ run_test 236 "Layout swap on open unlinked file" # The new system calls are supported in glibc >= 2.14. test_237() { - echo "Test file_handle syscalls" > $DIR/$tfile + echo "Test file_handle syscalls" > $DIR/$tfile || + error "write failed" check_fhandle_syscalls $DIR/$tfile || error "check_fhandle_syscalls failed" } @@ -12395,6 +12620,13 @@ run_test 237 "Verify name_to_handle_at/open_by_handle_at syscalls" # LU-4659 linkea consistency test_238() { + local server_version=$(lustre_version_code $SINGLEMDS) + + [[ $server_version -gt $(version_code 2.5.57) ]] || + [[ $server_version -gt $(version_code 2.5.1) && + $server_version -lt $(version_code 2.5.50) ]] || + { skip "Need MDS version at least 2.5.58 or 2.5.2+"; return; } + touch $DIR/$tfile ln $DIR/$tfile $DIR/$tfile.lnk touch $DIR/$tfile.new @@ -12410,15 +12642,87 @@ 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 + createmany -o $DIR/$tdir/f- 5000 + unlinkmany $DIR/$tdir/f- 5000 + do_nodes $list "lctl set_param -n osp*.*.sync_changes 1" + changes=$(do_nodes $list "lctl get_param -n osc.*MDT*.sync_changes \ + osc.*MDT*.sync_in_flight" | calc_sum) + [ "$changes" -eq 0 ] || error "$changes not synced" +} +run_test 239 "osp_sync test" + +test_240() { + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + + mkdir -p $DIR/$tdir + + $LFS mkdir -i 0 $DIR/$tdir/d0 || + error "failed to mkdir $DIR/$tdir/d0 on MDT0" + $LFS mkdir -i 1 $DIR/$tdir/d0/d1 || + error "failed to mkdir $DIR/$tdir/d0/d1 on MDT1" + + umount_client $MOUNT || error "umount failed" + #define OBD_FAIL_TGT_DELAY_CONDITIONAL 0x713 + do_facet mds2 lctl set_param fail_loc=0x713 fail_val=1 + mount_client $MOUNT || error "failed to mount client" + + echo "stat $DIR/$tdir/d0/d1, should not fail/ASSERT" + stat $DIR/$tdir/d0/d1 || error "fail to stat $DIR/$tdir/d0/d1" +} +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 +} test_striped_dir() { local mdt_index=$1 local stripe_count local stripe_index mkdir -p $DIR/$tdir - $LFS setdirstripe -i $mdt_index -c 2 -t all_char $DIR/$tdir/striped_dir || + + SAVE_UMASK=$(umask) + trap cleanup_test_300 RETURN EXIT + + $LFS setdirstripe -i $mdt_index -c 2 -t all_char -m 755 \ + $DIR/$tdir/striped_dir || error "set striped dir error" + local mode=$(stat -c%a $DIR/$tdir/striped_dir) + [ "$mode" = "755" ] || error "expect 755 got $mode" + stripe_count=$($LFS getdirstripe -c $DIR/$tdir/striped_dir) if [ "$stripe_count" != "2" ]; then error "stripe_count is $stripe_count, expect 2" @@ -12453,6 +12757,9 @@ test_striped_dir() { rmdir $DIR/$tdir/striped_dir || error "rmdir striped dir error" + + cleanup_test_300 + true } @@ -12640,6 +12947,151 @@ test_300f() { } run_test 300f "check rename cross striped directory" +test_300g() { + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + local stripe_count + local dir + + mkdir $DIR/$tdir + $LFS setdirstripe -i 0 -c $MDSCOUNT -t all_char \ + $DIR/$tdir/striped_dir || + error "set striped dir error" + + $LFS setdirstripe -D -c $MDSCOUNT -t all_char $DIR/$tdir/striped_dir || + error "set default stripe on striped dir error" + + stripe_count=$($LFS getdirstripe -D -c $DIR/$tdir/striped_dir) + [ $stripe_count -eq $MDSCOUNT ] || + error "default stripe wrong expect $MDSCOUNT get $stripe_count" + + mkdir -p $DIR/$tdir/striped_dir/{test1,test2,test3,test4} + + for dir in $(find $DIR/$tdir/striped_dir/*); do + stripe_count=$($LFS getdirstripe -c $dir) + [ $stripe_count -eq $MDSCOUNT ] || + error "expect $MDSCOUNT get $stripe_count for $dir" + done + + rmdir $DIR/$tdir/striped_dir/* || error "rmdir1 failed" + #change default stripe count to 2 + $LFS setdirstripe -D -c 2 -t all_char $DIR/$tdir/striped_dir || + error "set default stripe on striped dir error" + + mkdir -p $DIR/$tdir/striped_dir/{test1,test2,test3,test4} + + rmdir $DIR/$tdir/striped_dir/* || error "rmdir2 failed" + + #change default stripe count to 1 + $LFS setdirstripe -D -c 1 -t all_char $DIR/$tdir/striped_dir || + error "set default stripe on striped dir error" + + mkdir -p $DIR/$tdir/striped_dir/{test1,test2,test3,test4} + for dir in $(find $DIR/$tdir/striped_dir/*); do + stripe_count=$($LFS getdirstripe -c $dir) + [ $stripe_count -eq 1 ] || + error "expect 1 get $stripe_count for $dir" + done + rmdir $DIR/$tdir/striped_dir/* || error "rmdir3 failed" +} +run_test 300g "check default striped directory for striped directory" + +test_300h() { + [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + local stripe_count + local file + + mkdir $DIR/$tdir + + $LFS setdirstripe -i 0 -c$MDSCOUNT -t all_char $DIR/$tdir/striped_dir || + error "set striped dir error" + + createmany -o $DIR/$tdir/striped_dir/f- 10 || + error "create files under striped dir failed" + + # unfortunately, we need to umount to clear dir layout cache for now + # once we fully implement dir layout, we can drop this + umount_client $MOUNT || error "umount failed" + mount_client $MOUNT || error "mount failed" + + #set the stripe to be unknown hash type + #define OBD_FAIL_UNKNOWN_LMV_STRIPE 0x1901 + $LCTL set_param fail_loc=0x1901 + for ((i = 0; i < 10; i++)); do + $CHECKSTAT -t file $DIR/$tdir/striped_dir/f-$i || + error "stat f-$i failed" + rm $DIR/$tdir/striped_dir/f-$i || error "unlink f-$i failed" + done + + touch $DIR/$tdir/striped_dir/f0 && + error "create under striped dir with unknown hash should fail" + + $LCTL set_param fail_loc=0 + + umount_client $MOUNT || error "umount failed" + mount_client $MOUNT || error "mount failed" + + return 0 +} +run_test 300h "client handle unknown hash type striped directory" + +test_400a() { # LU-1606, was conf-sanity test_74 + local extra_flags='' + local out=$TMP/$tfile + local prefix=/usr/include/lustre + local prog + + if ! which $CC > /dev/null 2>&1; then + skip_env "$CC is not installed" + return 0 + fi + + if ! [[ -d $prefix ]]; then + # Assume we're running in tree and fixup the include path. + extra_flags+=" -I$LUSTRE/../libcfs/include" + extra_flags+=" -I$LUSTRE/include" + extra_flags+=" -L$LUSTRE/utils" + fi + + for prog in $LUSTRE_TESTS_API_DIR/*.c; do + $CC -Wall -Werror $extra_flags -llustreapi -o $out $prog || + error "client api broken" + done +} +run_test 400a "Lustre client api program can compile and link" + +test_400b() { # LU-1606, LU-5011 + local header + local out=$TMP/$tfile + local prefix=/usr/include/lustre + + # We use a hard coded prefix so that this test will not fail + # when run in tree. There are headers in lustre/include/lustre/ + # that are not packaged (like lustre_idl.h) and have more + # complicated include dependencies (like config.h and lnet/types.h). + # Since this test about correct packaging we just skip them when + # they don't exist (see below) rather than try to fixup cppflags. + + if ! which $CC > /dev/null 2>&1; then + skip_env "$CC is not installed" + return 0 + fi + + for header in $prefix/*.h; do + if ! [[ -f "$header" ]]; then + continue + fi + + if [[ "$(basename $header)" == liblustreapi.h ]]; then + continue # liblustreapi.h is deprecated. + fi + + $CC -Wall -Werror -include $header -c -x c /dev/null -o $out || + error "cannot compile '$header'" + done +} +run_test 400b "packaged headers can be compiled" + # # tests that do cleanup/setup should be run at the end # @@ -12649,10 +13101,9 @@ test_900() { local ls #define OBD_FAIL_MGC_PAUSE_PROCESS_LOG 0x903 $LCTL set_param fail_loc=0x903 - # cancel_lru_locks mgc - does not work due to lctl set_param syntax - for ls in /proc/fs/lustre/ldlm/namespaces/MGC*/lru_size; do - echo "clear" > $ls - done + + cancel_lru_locks MGC + FAIL_ON_ERROR=true cleanup FAIL_ON_ERROR=true setup }