X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Ftests%2Fsanity.sh;h=679a528b3ac3b964a72b02fbe1c5360823cd1e7e;hp=1918c3a746d51345fd2c8b153eed6f8c90cb3c87;hb=1fc013f90175d1e50d7a22b404ad6abd31a43e38;hpb=01bc529ccffdb21d33ab6a36ed64fe96ef9ac55b diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh index 1918c3a..679a528 100644 --- a/lustre/tests/sanity.sh +++ b/lustre/tests/sanity.sh @@ -58,11 +58,11 @@ init_test_env $@ . ${CONFIG:=$LUSTRE/tests/cfg/${NAME}.sh} init_logging -[ "$SLOW" = "no" ] && EXCEPT_SLOW="24o 27m 64b 68 71 77f 78 115 124b 230d" +[ "$SLOW" = "no" ] && EXCEPT_SLOW="24o 24D 27m 64b 68 71 77f 78 115 124b" if [ $(facet_fstype $SINGLEMDS) = "zfs" ]; then - # bug number for skipped test: LU-1593 LU-1957 LU-2805 - ALWAYS_EXCEPT="$ALWAYS_EXCEPT 34h 180 184c" + # bug number for skipped test: LU-4536 LU-1957 LU-2805 + ALWAYS_EXCEPT="$ALWAYS_EXCEPT 65ic 180 184c" [ "$SLOW" = "no" ] && EXCEPT_SLOW="$EXCEPT_SLOW 51b 51ba" fi @@ -80,17 +80,6 @@ setup() { echo "done" } -check_kernel_version() { - WANT_VER=$1 - GOT_VER=$(lctl get_param -n version | awk '/kernel:/ {print $2}') - case $GOT_VER in - patchless|patchless_client) return 0;; - *) [ $GOT_VER -ge $WANT_VER ] && return 0 ;; - esac - log "test needs at least kernel version $WANT_VER, running $GOT_VER" - return 1 -} - check_swap_layouts_support() { $LCTL get_param -n llite.*.sbi_flags | grep -q layout || @@ -98,11 +87,6 @@ check_swap_layouts_support() return 1 } -if [ "$ONLY" == "cleanup" ]; then - sh llmountcleanup.sh - exit 0 -fi - check_and_setup_lustre DIR=${DIR:-$MOUNT} @@ -292,7 +276,7 @@ run_test 7a "mkdir .../d7; mcreate .../d7/f; chmod .../d7/f ====" test_7b() { if [ ! -d $DIR/$tdir ]; then - mkdir $DIR/$tdir + test_mkdir $DIR/$tdir fi $MCREATE $DIR/$tdir/$tfile echo -n foo > $DIR/$tdir/$tfile @@ -370,6 +354,7 @@ test_15() { mv $DIR/$tdir/$tfile $DIR/$tdir/${tfile}_2 $CHECKSTAT -t file $DIR/$tdir/${tfile}_2 || error "$tdir/${tfile_2} not a file after rename" + rm $DIR/$tdir/${tfile}_2 || error "unlink failed after rename" } run_test 15 "touch .../d15/f; mv .../d15/f .../d15/f2 ==========" @@ -535,7 +520,7 @@ run_test 17k "symlinks: rsync with xattrs enabled =========================" test_17l() { # LU-279 [[ -z "$(which getfattr 2>/dev/null)" ]] && skip "no getfattr command" && return 0 - mkdir -p $DIR/$tdir + test_mkdir -p $DIR/$tdir touch $DIR/$tdir/$tfile ln -s $DIR/$tdir/$tfile $DIR/$tdir/$tfile.lnk for path in "$DIR/$tdir" "$DIR/$tdir/$tfile" "$DIR/$tdir/$tfile.lnk"; do @@ -570,7 +555,7 @@ test_17m() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - mkdir -p $WDIR + test_mkdir -p $WDIR long_sym=$short_sym # create a long symlink file for ((i = 0; i < 4; ++i)); do @@ -653,7 +638,7 @@ test_17n() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - mkdir $DIR/$tdir + test_mkdir $DIR/$tdir for ((i=0; i<10; i++)); do $LFS mkdir -i1 -c2 $DIR/$tdir/remote_dir_${i} || error "create remote dir error $i" @@ -664,7 +649,7 @@ test_17n() { check_fs_consistency_17n || error "e2fsck report error after create files under remote dir" - for ((i=0;i<10;i++)); do + for ((i = 0; i < 10; i++)); do rm -rf $DIR/$tdir/remote_dir_${i} || error "destroy remote dir error $i" done @@ -675,16 +660,16 @@ test_17n() { [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.4.50) ] && skip "lustre < 2.4.50 does not support migrate mv " && return - for ((i=0; i<10; i++)); do + for ((i = 0; i < 10; i++)); do mkdir -p $DIR/$tdir/remote_dir_${i} createmany -o $DIR/$tdir/remote_dir_${i}/f 10 || error "create files under remote dir failed $i" - $LFS mv -M 1 $DIR/$tdir/remote_dir_${i} || + $LFS mv --mdt-index 1 $DIR/$tdir/remote_dir_${i} || error "migrate remote dir error $i" done check_fs_consistency_17n || error "e2fsck report error after migration" - for ((i=0;i<10;i++)); do + for ((i = 0; i < 10; i++)); do rm -rf $DIR/$tdir/remote_dir_${i} || error "destroy remote dir error $i" done @@ -700,18 +685,17 @@ test_17o() { local WDIR=$DIR/${tdir}o local mdt_index - local mdtdevname local rc=0 - mkdir -p $WDIR + test_mkdir -p $WDIR mdt_index=$($LFS getstripe -M $WDIR) mdt_index=$((mdt_index+1)) - mdtdevname=$(mdsdevname $mdt_index) touch $WDIR/$tfile - stop mds${mdt_index} - start mds${mdt_index} $mdtdevname $MDS_MOUNT_OPTS || - error "mount mds${mdt_index} failed" + + #fail mds will wait the failover finish then set + #following fail_loc to avoid interfer the recovery process. + fail mds${mdt_index} #define OBD_FAIL_OSD_LMA_INCOMPAT 0x194 do_facet mds${mdt_index} lctl set_param fail_loc=0x194 @@ -955,7 +939,6 @@ test_24n() { run_test 24n "Statting the old file after renaming (Posix rename 2)" test_24o() { - check_kernel_version 37 || return 0 test_mkdir -p $DIR/d24o rename_many -s random -v -n 10 $DIR/d24o } @@ -1058,7 +1041,7 @@ test_24v() { # Performance issue on ZFS see LU-4072 (c.f. LU-2887) [ $(facet_fstype $SINGLEMDS) = "zfs" ] && NRFILES=10000 - mkdir -p $DIR/$tdir + test_mkdir -p $DIR/$tdir createmany -m $DIR/$tdir/$tfile $NRFILES cancel_lru_locks mdc @@ -1101,30 +1084,28 @@ test_24x() { local MDTIDX=1 local remote_dir=$DIR/$tdir/remote_dir - mkdir -p $DIR/$tdir + test_mkdir -p $DIR/$tdir $LFS mkdir -i $MDTIDX $remote_dir || error "create remote directory failed" - mkdir -p $DIR/$tdir/src_dir + test_mkdir -p $DIR/$tdir/src_dir touch $DIR/$tdir/src_file - mkdir -p $remote_dir/tgt_dir + test_mkdir -p $remote_dir/tgt_dir touch $remote_dir/tgt_file - mrename $remote_dir $DIR/ && - error "rename dir cross MDT works!" + mrename $DIR/$tdir/src_dir $remote_dir/tgt_dir || + error "rename dir cross MDT failed!" - mrename $DIR/$tdir/src_dir $remote_dir/tgt_dir && - error "rename dir cross MDT works!" + mrename $DIR/$tdir/src_file $remote_dir/tgt_file || + error "rename file cross MDT failed!" - mrename $DIR/$tdir/src_file $remote_dir/tgt_file && - error "rename file cross MDT works!" - - ln $DIR/$tdir/src_file $remote_dir/tgt_file1 && - error "ln file cross MDT should not work!" + touch $DIR/$tdir/ln_file + ln $DIR/$tdir/ln_file $remote_dir/ln_name || + error "ln file cross MDT failed" rm -rf $DIR/$tdir || error "Can not delete directories" } -run_test 24x "cross rename/link should be failed" +run_test 24x "cross MDT rename/link" test_24y() { [[ $MDSCOUNT -lt 2 ]] && skip "needs >= 2 MDTs" && return @@ -1132,13 +1113,13 @@ test_24y() { local MDTIDX=1 local remote_dir=$DIR/$tdir/remote_dir - mkdir -p $DIR/$tdir + test_mkdir -p $DIR/$tdir $LFS mkdir -i $MDTIDX $remote_dir || error "create remote directory failed" - mkdir -p $remote_dir/src_dir + test_mkdir -p $remote_dir/src_dir touch $remote_dir/src_file - mkdir -p $remote_dir/tgt_dir + test_mkdir -p $remote_dir/tgt_dir touch $remote_dir/tgt_file mrename $remote_dir/src_dir $remote_dir/tgt_dir || @@ -1154,37 +1135,11 @@ test_24y() { } run_test 24y "rename/link on the same dir should succeed" -test_24z() { - [[ $MDSCOUNT -lt 2 ]] && skip "needs >= 2 MDTs" && return - [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - local MDTIDX=1 - local remote_src=$DIR/$tdir/remote_dir - local remote_tgt=$DIR/$tdir/remote_tgt - - mkdir -p $DIR/$tdir - $LFS mkdir -i $MDTIDX $remote_src || - error "create remote directory failed" - - $LFS mkdir -i $MDTIDX $remote_tgt || - error "create remote directory failed" - - mrename $remote_src $remote_tgt && - error "rename remote dirs should not work!" - - # If target dir does not exists, it should succeed - rm -rf $remote_tgt - mrename $remote_src $remote_tgt || - error "rename remote dirs(tgt dir does not exists) failed!" - - rm -rf $DIR/$tdir || error "Can not delete directories" -} -run_test 24z "rename one remote dir to another remote dir should fail" - test_24A() { # LU-3182 local NFILES=5000 rm -rf $DIR/$tdir - mkdir -p $DIR/$tdir + test_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) @@ -1201,7 +1156,7 @@ test_24B() { # LU-4805 [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return local count - mkdir $DIR/$tdir + test_mkdir $DIR/$tdir $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/striped_dir || error "create striped dir failed" @@ -1251,6 +1206,55 @@ test_24C() { } run_test 24C "check .. in striped dir" +test_24D() { # LU-6101 + local NFILES=50000 + + 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) + 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 24D "readdir() returns correct number of entries after cursor reload" + +test_24E() { + [[ $MDSCOUNT -lt 4 ]] && skip "needs >= 4 MDTs" && return + [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + + mkdir -p $DIR/$tdir + mkdir $DIR/$tdir/src_dir + $LFS mkdir -i 1 $DIR/$tdir/src_dir/src_child || + error "create remote source failed" + + touch $DIR/$tdir/src_dir/src_child/a + + $LFS mkdir -i 2 $DIR/$tdir/tgt_dir || + error "create remote target dir failed" + + $LFS mkdir -i 3 $DIR/$tdir/tgt_dir/tgt_child || + error "create remote target child failed" + + mrename $DIR/$tdir/src_dir/src_child $DIR/$tdir/tgt_dir/tgt_child || + error "rename dir cross MDT failed!" + + find $DIR/$tdir + + $CHECKSTAT -t dir $DIR/$tdir/src_dir/src_child && + error "src_child still exists after rename" + + $CHECKSTAT -t file $DIR/$tdir/tgt_dir/tgt_child/a || + error "missing file(a) after rename" + + rm -rf $DIR/$tdir || error "Can not delete directories" +} +run_test 24E "cross MDT rename/link" + test_25a() { echo '== symlink sanity =============================================' @@ -1380,8 +1384,10 @@ test_27g() { run_test 27g "$GETSTRIPE with no objects" test_27i() { - touch $DIR/d27/fsome || error "touch failed" - [[ $($GETSTRIPE -c $DIR/d27/fsome) -gt 0 ]] || error "missing objects" + test_mkdir $DIR/$tdir + touch $DIR/$tdir/$tfile || error "touch failed" + [[ $($GETSTRIPE -c $DIR/$tdir/$tfile) -gt 0 ]] || + error "missing objects" } run_test 27i "$GETSTRIPE with some objects" @@ -1464,34 +1470,33 @@ exhaust_precreations() { local OSTIDX=$1 local FAILLOC=$2 local FAILIDX=${3:-$OSTIDX} + local ofacet=ost$((OSTIDX + 1)) - test_mkdir -p $DIR/$tdir - local MDSIDX=$(get_mds_dir "$DIR/$tdir") - echo OSTIDX=$OSTIDX MDSIDX=$MDSIDX + test_mkdir -p -c1 $DIR/$tdir + local mdtidx=$($LFS getstripe -M $DIR/$tdir) + local mfacet=mds$((mdtidx + 1)) + echo OSTIDX=$OSTIDX MDTIDX=$mdtidx local OST=$(ostname_from_index $OSTIDX) - local MDT_INDEX=$(lfs df | grep "\[MDT:$((MDSIDX - 1))\]" | awk '{print $1}' | \ - sed -e 's/_UUID$//;s/^.*-//') # on the mdt's osc - local mdtosc_proc1=$(get_mdtosc_proc_path mds${MDSIDX} $OST) - local last_id=$(do_facet mds${MDSIDX} lctl get_param -n \ + local mdtosc_proc1=$(get_mdtosc_proc_path $mfacet $OST) + local last_id=$(do_facet $mfacet lctl get_param -n \ osc.$mdtosc_proc1.prealloc_last_id) - local next_id=$(do_facet mds${MDSIDX} lctl get_param -n \ + local next_id=$(do_facet $mfacet lctl get_param -n \ osc.$mdtosc_proc1.prealloc_next_id) - local mdtosc_proc2=$(get_mdtosc_proc_path mds${MDSIDX}) - do_facet mds${MDSIDX} lctl get_param osc.$mdtosc_proc2.prealloc* + local mdtosc_proc2=$(get_mdtosc_proc_path $mfacet) + do_facet $mfacet lctl get_param osc.$mdtosc_proc2.prealloc* test_mkdir -p $DIR/$tdir/${OST} $SETSTRIPE -i $OSTIDX -c 1 $DIR/$tdir/${OST} #define OBD_FAIL_OST_ENOSPC 0x215 - do_facet ost$((OSTIDX + 1)) lctl set_param fail_val=$FAILIDX - do_facet ost$((OSTIDX + 1)) lctl set_param fail_loc=0x215 + do_facet $ofacet lctl set_param fail_val=$FAILIDX fail_loc=0x215 echo "Creating to objid $last_id on ost $OST..." createmany -o $DIR/$tdir/${OST}/f $next_id $((last_id - next_id + 2)) - do_facet mds${MDSIDX} lctl get_param osc.$mdtosc_proc2.prealloc* - do_facet ost$((OSTIDX + 1)) lctl set_param fail_loc=$FAILLOC + do_facet $mfacet lctl get_param osc.$mdtosc_proc2.prealloc* + do_facet $ofacet lctl set_param fail_loc=$FAILLOC sleep_maxage } @@ -1756,7 +1761,7 @@ test_27y() { done OSTIDX=$(index_from_ostuuid $OST) - mkdir -p $DIR/$tdir + test_mkdir -p $DIR/$tdir $SETSTRIPE -c 1 $DIR/$tdir # 1 stripe / file for OSC in $MDS_OSCS; do @@ -2010,7 +2015,7 @@ test_27D() { local ost_list=$(seq $first_ost $ost_step $last_ost) local ost_range="$first_ost $last_ost $ost_step" - mkdir -p $DIR/$tdir + test_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 || @@ -2019,6 +2024,35 @@ test_27D() { } run_test 27D "validate llapi_layout API" +# Verify that default_easize is increased from its initial value after +# accessing a widely striped file. +test_27E() { + [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" && return + + # 72 bytes is the minimum space required to store striping + # information for a file striped across one OST: + # (sizeof(struct lov_user_md_v3) + + # sizeof(struct lov_user_ost_data_v1)) + local min_easize=72 + $LCTL set_param -n llite.*.default_easize $min_easize || + error "lctl set_param failed" + local easize=$($LCTL get_param -n llite.*.default_easize) + + [ $easize -eq $min_easize ] || + error "failed to set default_easize" + + $LFS setstripe -c $OSTCOUNT $DIR/$tfile || + error "setstripe failed" + cat $DIR/$tfile + rm $DIR/$tfile + + easize=$($LCTL get_param -n llite.*.default_easize) + + [ $easize -gt $min_easize ] || + error "default_easize not updated" +} +run_test 27E "check that default extended attribute size properly increases" + # createtest also checks that device nodes are created and # then visible correctly (#2091) test_28() { # bug 2091 @@ -2134,7 +2168,6 @@ test_31d() { run_test 31d "remove of open directory =========================" test_31e() { # bug 2904 - check_kernel_version 34 || return 0 openfilleddirunlink $DIR/d31e || error } run_test 31e "remove of open non-empty directory ===============" @@ -2276,7 +2309,7 @@ link_one() { } test_31o() { # LU-2901 - mkdir -p $DIR/$tdir + test_mkdir -p $DIR/$tdir for LOOP in $(seq 100); do rm -f $DIR/$tdir/$tfile* for THREAD in $(seq 8); do @@ -2294,7 +2327,7 @@ run_test 31o "duplicate hard links with same filename" test_31p() { [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return - mkdir $DIR/$tdir + test_mkdir $DIR/$tdir $LFS setdirstripe -i0 -c2 $DIR/$tdir/striped_dir $LFS setdirstripe -D -c2 -t all_char $DIR/$tdir/striped_dir @@ -2571,7 +2604,7 @@ test_33b() { rm -fr $DIR/d33 test_mkdir -p $DIR/d33 chown $RUNAS_ID $DIR/d33 - $RUNAS $OPENFILE -f 1286739555 $DIR/d33/f33 + $RUNAS $OPENFILE -f 1286739555 $DIR/d33/f33 || true } run_test 33b "test open file with malformed flags (No panic)" @@ -2647,7 +2680,7 @@ test_33d() { local MDTIDX=1 local remote_dir=$DIR/$tdir/remote_dir - mkdir -p $DIR/$tdir + test_mkdir -p $DIR/$tdir $LFS mkdir -i $MDTIDX $remote_dir || error "create remote directory failed" @@ -2713,6 +2746,35 @@ test_33e() { } run_test 33e "mkdir and striped directory should have same mode" +cleanup_33f() { + trap 0 + do_facet $SINGLEMDS $LCTL set_param mdt.*.enable_remote_dir_gid=0 +} + +test_33f() { + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + + mkdir $DIR/$tdir + chmod go+rwx $DIR/$tdir + do_facet $SINGLEMDS $LCTL set_param mdt.*.enable_remote_dir_gid=-1 + trap cleanup_33f EXIT + + $RUNAS lfs mkdir -c$MDSCOUNT $DIR/$tdir/striped_dir || + error "cannot create striped directory" + + $RUNAS touch $DIR/$tdir/striped_dir/{0..16} || + error "cannot create files in striped directory" + + $RUNAS rm $DIR/$tdir/striped_dir/{0..16} || + error "cannot remove files in striped directory" + + $RUNAS rmdir $DIR/$tdir/striped_dir || + error "cannot remove striped directory" + + cleanup_33f +} +run_test 33f "nonroot user can create, access, and remove a striped directory" + TEST_34_SIZE=${TEST_34_SIZE:-2000000000000} test_34a() { rm -f $DIR/f34 @@ -2937,7 +2999,7 @@ run_test 36h "utime on file racing with OST BRW write ==========" test_36i() { [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return - mkdir $DIR/$tdir + test_mkdir $DIR/$tdir $LFS setdirstripe -i0 -c$MDSCOUNT $DIR/$tdir/striped_dir local mtime=$(stat -c%Y $DIR/$tdir/striped_dir) @@ -3354,7 +3416,7 @@ run_test 39n "check that O_NOATIME is honored" test_39o() { TESTDIR=$DIR/$tdir/$tfile [ -e $TESTDIR ] && rm -rf $TESTDIR - test_mkdir -p $TESTDIR + mkdir -p $TESTDIR cd $TESTDIR links1=2 ls @@ -3376,7 +3438,7 @@ test_39p() { local MDTIDX=1 TESTDIR=$DIR/$tdir/$tfile [ -e $TESTDIR ] && rm -rf $TESTDIR - mkdir -p $TESTDIR + test_mkdir -p $TESTDIR cd $TESTDIR links1=2 ls @@ -3800,19 +3862,14 @@ test_48a() { # bug 2399 [ $(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 + test_mkdir $DIR/$tdir cd $DIR/$tdir - mv $DIR/$tdir $DIR/d48.new || error "move directory failed" + mv $DIR/$tdir $DIR/$tdir.new || error "move directory failed" test_mkdir $DIR/$tdir || error "recreate directory failed" touch foo || error "'touch foo' failed after recreating cwd" - test_mkdir $DIR/$tdir/bar || - error "'mkdir foo' failed after recreating cwd" - if check_kernel_version 44; then - touch .foo || error "'touch .foo' failed after recreating cwd" - test_mkdir $DIR/$tdir/.bar || - error "'mkdir .foo' failed after recreating cwd" - fi + test_mkdir bar || error "'mkdir foo' failed after recreating cwd" + touch .foo || error "'touch .foo' failed after recreating cwd" + test_mkdir .bar || error "'mkdir .foo' failed after recreating cwd" ls . > /dev/null || error "'ls .' failed after recreating cwd" ls .. > /dev/null || error "'ls ..' failed after removing cwd" cd . || error "'cd .' failed after recreating cwd" @@ -3824,23 +3881,18 @@ test_48a() { # bug 2399 run_test 48a "Access renamed working dir (should return errors)=" test_48b() { # bug 2399 - check_kernel_version 34 || return 0 rm -rf $DIR/$tdir - test_mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir cd $DIR/$tdir rmdir $DIR/$tdir || error "remove cwd $DIR/$tdir failed" touch foo && error "'touch foo' worked after removing cwd" - test_mkdir $DIR/$tdir/foo && - error "'mkdir foo' worked after removing cwd" - if check_kernel_version 44; then - touch .foo && error "'touch .foo' worked after removing cwd" - test_mkdir $DIR/$tdir/.foo && - error "'mkdir .foo' worked after removing cwd" - fi + test_mkdir foo && error "'mkdir foo' worked after removing cwd" + touch .foo && error "'touch .foo' worked after removing cwd" + test_mkdir .foo && error "'mkdir .foo' worked after removing cwd" ls . > /dev/null && error "'ls .' worked after removing cwd" ls .. > /dev/null || error "'ls ..' failed after removing cwd" is_patchless || ( cd . && error "'cd .' worked after removing cwd" ) - test_mkdir $DIR/$tdir/. && error "'mkdir .' worked after removing cwd" + test_mkdir . && error "'mkdir .' worked after removing cwd" rmdir . && error "'rmdir .' worked after removing cwd" ln -s . foo && error "'ln -s .' worked after removing cwd" cd .. || echo "'cd ..' failed after removing cwd `pwd`" #bug 3517 @@ -3848,7 +3900,6 @@ test_48b() { # bug 2399 run_test 48b "Access removed working dir (should return errors)=" test_48c() { # bug 2350 - check_kernel_version 36 || return 0 #lctl set_param debug=-1 #set -vx rm -rf $DIR/$tdir @@ -3857,10 +3908,8 @@ test_48c() { # bug 2350 $TRACE rmdir $DIR/$tdir/dir || error "remove cwd $DIR/$tdir/dir failed" $TRACE touch foo && error "touch foo worked after removing cwd" $TRACE test_mkdir foo && error "'mkdir foo' worked after removing cwd" - if check_kernel_version 44; then - touch .foo && error "touch .foo worked after removing cwd" - test_mkdir .foo && error "mkdir .foo worked after removing cwd" - fi + touch .foo && error "touch .foo worked after removing cwd" + test_mkdir .foo && error "mkdir .foo worked after removing cwd" $TRACE ls . && error "'ls .' worked after removing cwd" $TRACE ls .. || error "'ls ..' failed after removing cwd" is_patchless || ( $TRACE cd . && @@ -3873,7 +3922,6 @@ test_48c() { # bug 2350 run_test 48c "Access removed working subdir (should return errors)" test_48d() { # bug 2350 - check_kernel_version 36 || return 0 #lctl set_param debug=-1 #set -vx rm -rf $DIR/$tdir @@ -3883,11 +3931,8 @@ test_48d() { # bug 2350 $TRACE rmdir $DIR/$tdir || error "remove parent $DIR/$tdir failed" $TRACE touch foo && error "'touch foo' worked after removing parent" $TRACE test_mkdir foo && error "mkdir foo worked after removing parent" - if check_kernel_version 44; then - touch .foo && error "'touch .foo' worked after removing parent" - test_mkdir .foo && - error "mkdir .foo worked after removing parent" - fi + touch .foo && error "'touch .foo' worked after removing parent" + test_mkdir .foo && error "mkdir .foo worked after removing parent" $TRACE ls . && error "'ls .' worked after removing parent" $TRACE ls .. && error "'ls ..' worked after removing parent" is_patchless || ( $TRACE cd . && @@ -3901,7 +3946,6 @@ test_48d() { # bug 2350 run_test 48d "Access removed parent subdir (should return errors)" test_48e() { # bug 4134 - check_kernel_version 41 || return 0 #lctl set_param debug=-1 #set -vx rm -rf $DIR/$tdir @@ -4291,7 +4335,6 @@ test_54d() { run_test 54d "fifo device works in lustre ======================" test_54e() { - check_kernel_version 46 || return 0 f="$DIR/f54e" string="aaaaaa" cp -aL /dev/console $f @@ -4780,6 +4823,8 @@ test_56v() { run_test 56v "check 'lfs find -mdt match with lfs getstripe -M' =======" test_56w() { + [[ $OSTCOUNT -lt 2 ]] && skip_env "$OSTCOUNT < 2 OSTs -- skipping" && + return [ $PARALLEL == "yes" ] && skip "skip parallel run" && return TDIR=$DIR/${tdir}w @@ -4885,7 +4930,7 @@ test_56x() { skip_env "need 2 OST, skipping test" && return local dir0=$DIR/$tdir/$testnum - mkdir -p $dir0 || error "creating dir $dir0" + test_mkdir -p $dir0 || error "creating dir $dir0" local ref1=/etc/passwd local file1=$dir0/file1 @@ -4904,12 +4949,12 @@ run_test 56x "lfs migration support" test_56y() { [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.4.53) ] && - skip "No HSM support on MDS of $(get_lustre_version)," \ - "need 2.4.53 at least" && return - local res="" + skip "No HSM $(lustre_build_version $SINGLEMDS) MDS < 2.4.53" && + return + local res="" local dir0=$DIR/$tdir/$testnum - mkdir -p $dir0 || error "creating dir $dir0" + test_mkdir -p $dir0 || error "creating dir $dir0" local f1=$dir0/file1 local f2=$dir0/file2 @@ -4950,13 +4995,26 @@ test_56z() { # LU-4824 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') + 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_56aa() { # LU-5937 + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + + mkdir $DIR/$tdir + $LFS setdirstripe -c$MDSCOUNT $DIR/$tdir/striped_dir + + createmany -o $DIR/$tdir/striped_dir/${tfile}- 1024 + local dirs=$(lfs find --size +8k $DIR/$tdir/) + + [ -n "$dirs" ] || error "lfs find --size wrong under striped dir" +} +run_test 56aa "lfs find --size under striped dir" + test_57a() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return # note test will not do anything if MDS is not local @@ -4987,16 +5045,17 @@ test_57b() { fi remote_mds_nodsh && skip "remote MDS with nodsh" && return - local dir=$DIR/d57b + local dir=$DIR/$tdir local FILECOUNT=100 local FILE1=$dir/f1 local FILEN=$dir/f$FILECOUNT rm -rf $dir || error "removing $dir" - test_mkdir -p $dir || error "creating $dir" - local num=$(get_mds_dir $dir) - local mymds=mds$num + test_mkdir -p -c1 $dir || error "creating $dir" + local mdtidx=$($LFS getstripe -M $dir) + local mdtname=MDT$(printf %04x $mdtidx) + local facet=mds$((mdtidx + 1)) echo "mcreating $FILECOUNT files" createmany -m $dir/f 1 $FILECOUNT || \ @@ -5009,9 +5068,9 @@ test_57b() { sync sleep 1 df $dir #make sure we get new statfs data - local MDSFREE=$(do_facet $mymds \ - lctl get_param -n osd*.*MDT000$((num -1)).kbytesfree) - local MDCFREE=$(lctl get_param -n mdc.*MDT000$((num -1))-mdc-*.kbytesfree) + local MDSFREE=$(do_facet $facet \ + lctl get_param -n osd*.*$mdtname.kbytesfree) + local MDCFREE=$(lctl get_param -n mdc.*$mdtname-mdc-*.kbytesfree) echo "opening files to create objects/EAs" local FILE for FILE in `seq -f $dir/f%g 1 $FILECOUNT`; do @@ -5024,9 +5083,9 @@ test_57b() { sleep 1 #make sure we get new statfs data df $dir - local MDSFREE2=$(do_facet $mymds \ - lctl get_param -n osd*.*MDT000$((num -1)).kbytesfree) - local MDCFREE2=$(lctl get_param -n mdc.*MDT000$((num -1))-mdc-*.kbytesfree) + local MDSFREE2=$(do_facet $facet \ + lctl get_param -n osd*.*$mdtname.kbytesfree) + local MDCFREE2=$(lctl get_param -n mdc.*$mdtname-mdc-*.kbytesfree) if [[ $MDCFREE2 -lt $((MDCFREE - 16)) ]]; then if [ "$MDSFREE" != "$MDSFREE2" ]; then error "MDC before $MDCFREE != after $MDCFREE2" @@ -5173,6 +5232,8 @@ test_63b() { dd if=/dev/zero of=$DIR/$tfile bs=4k count=1 rm $DIR/$tfile + sync # sync lest earlier test intercept the fail_loc + #define OBD_FAIL_OSC_BRW_PREP_REQ 0x406 lctl set_param fail_loc=0x80000406 $MULTIOP $DIR/$tfile Owy && \ @@ -5511,8 +5572,9 @@ test_69() { run_test 69 "verify oa2dentry return -ENOENT doesn't LBUG ======" test_71() { - test_mkdir -p $DIR/$tdir - sh rundbench -C -D $DIR/$tdir 2 || error "dbench failed!" + test_mkdir -p $DIR/$tdir + $LFS setdirstripe -D -c$MDSCOUNT $DIR/$tdir + sh rundbench -C -D $DIR/$tdir 2 || error "dbench failed!" } run_test 71 "Running dbench on lustre (don't segment fault) ====" @@ -5883,7 +5945,7 @@ test_78() { # bug 10901 [[ $F78SIZE -gt $MEMTOTAL ]] && F78SIZE=$MEMTOTAL [[ $F78SIZE -gt 512 ]] && F78SIZE=512 [[ $F78SIZE -gt $((MAXFREE / 1024)) ]] && F78SIZE=$((MAXFREE / 1024)) - SMALLESTOST=$(lfs df $DIR | grep OST | awk '{ print $4 }' | sort -n | + SMALLESTOST=$($LFS df $DIR | grep OST | awk '{ print $4 }' | sort -n | head -n1) echo "Smallest OST: $SMALLESTOST" [[ $SMALLESTOST -lt 10240 ]] && @@ -6578,14 +6640,14 @@ compare_stripe_info1() { for offset in $(seq 0 $[$STRIPE_COUNT - 1]); do local size=$((STRIPE_SIZE * num)) local file=file"$num-$offset-$count" - stripe_size=$(lfs getstripe -S $PWD/$file) + stripe_size=$($LFS getstripe -S $PWD/$file) [[ $stripe_size -ne $size ]] && error "$file: size $stripe_size != $size" - stripe_count=$(lfs getstripe -c $PWD/$file) + stripe_count=$($LFS getstripe -c $PWD/$file) # allow fewer stripes to be created, ORI-601 [[ $stripe_count -lt $(((3 * count + 3) / 4)) ]] && error "$file: count $stripe_count != $count" - stripe_index=$(lfs getstripe -i $PWD/$file) + stripe_index=$($LFS getstripe -i $PWD/$file) [[ $stripe_index -ne 0 ]] && stripe_index_all_zero=false done @@ -6879,6 +6941,45 @@ test_102p() { # LU-4703 setxattr did not check ownership } run_test 102p "check setxattr(2) correctly fails without permission" +test_102q() { + [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.6.92) ] && + skip "MDS needs to be at least 2.6.92" && return + orphan_linkea_check $DIR/$tfile || error "orphan_linkea_check" +} +run_test 102q "flistxattr should not return trusted.link EAs for orphans" + +test_102r() { + [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.6.93) ] && + skip "MDS needs to be at least 2.6.93" && return + touch $DIR/$tfile || error "touch" + setfattr -n user.$(basename $tfile) $DIR/$tfile || error "setfattr" + getfattr -n user.$(basename $tfile) $DIR/$tfile || error "getfattr" + rm $DIR/$tfile || error "rm" + + #normal directory + mkdir -p $DIR/$tdir || error "mkdir" + setfattr -n user.$(basename $tdir) $DIR/$tdir || error "setfattr dir" + getfattr -n user.$(basename $tdir) $DIR/$tdir || error "getfattr dir" + setfattr -x user.$(basename $tdir) $DIR/$tdir || + error "$testfile error deleting user.author1" + getfattr -d -m user.$(basename $tdir) 2> /dev/null | + grep "user.$(basename $tdir)" && + error "$tdir did not delete user.$(basename $tdir)" + rmdir $DIR/$tdir || error "rmdir" + + #striped directory + test_mkdir -p $DIR/$tdir || error "make striped dir" + setfattr -n user.$(basename $tdir) $DIR/$tdir || error "setfattr dir" + getfattr -n user.$(basename $tdir) $DIR/$tdir || error "getfattr dir" + setfattr -x user.$(basename $tdir) $DIR/$tdir || + error "$testfile error deleting user.author1" + getfattr -d -m user.$(basename $tdir) 2> /dev/null | + grep "user.$(basename $tdir)" && + error "$tdir did not delete user.$(basename $tdir)" + rmdir $DIR/$tdir || error "rm striped dir" +} +run_test 102r "set EAs with empty values" + run_acl_subtest() { $LUSTRE/tests/acl/run $LUSTRE/tests/acl/$1.test @@ -7310,12 +7411,10 @@ run_test 116a "stripe QOS: free space balance ===================" test_116b() { # LU-2093 [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - [ -z "$($LCTL get_param -n lo*.$FSNAME-MDT0000-mdtlov.qos_threshold_rr | - head -1 2>/dev/null)" ] && skip "no QOS" && return #define OBD_FAIL_MDS_OSC_CREATE_FAIL 0x147 - local old_rr - old_rr=$(do_facet $SINGLEMDS lctl get_param -n \ - lo*.$FSNAME-MDT0000-mdtlov.qos_threshold_rr | head -1) + local old_rr=$(do_facet $SINGLEMDS lctl get_param -n \ + lo*.$FSNAME-MDT0000-mdtlov.qos_threshold_rr | head -1) + [ -z "$old_rr" ] && skip "no QOS" && return 0 do_facet $SINGLEMDS lctl set_param \ lo*.$FSNAME-MDT0000-mdtlov.qos_threshold_rr=0 mkdir -p $DIR/$tdir @@ -8195,6 +8294,10 @@ test_124a() { local MAX_HRS=10 local LIMIT=$($LCTL get_param -n $NSDIR.pool.limit) log "LIMIT=$LIMIT" + if [ $LIMIT -lt $LRU_SIZE ]; then + skip "Limit is too small $LIMIT" + return 0 + fi # Make LVF so higher that sleeping for $SLEEP is enough to _start_ # killing locks. Some time was spent for creating locks. This means @@ -8323,6 +8426,38 @@ test_124b() { } run_test 124b "lru resize (performance test) =======================" +test_124c() { + [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + [ -z "$($LCTL get_param -n mdc.*.connect_flags | grep lru_resize)" ] && + skip "no lru resize on server" && return 0 + + # cache ununsed locks on client + local nr=100 + cancel_lru_locks mdc + test_mkdir -p $DIR/$tdir || error "failed to create $DIR/$tdir" + createmany -o $DIR/$tdir/f $nr || + error "failed to create $nr files in $DIR/$tdir" + ls -l $DIR/$tdir > /dev/null + + local nsdir="ldlm.namespaces.*-MDT0000-mdc-*" + local unused=$($LCTL get_param -n $nsdir.lock_unused_count) + local max_age=$($LCTL get_param -n $nsdir.lru_max_age) + local recalc_p=$($LCTL get_param -n $nsdir.pool.recalc_period) + echo "unused=$unused, max_age=$max_age, recalc_p=$recalc_p" + + # set lru_max_age to 1 sec + $LCTL set_param $nsdir.lru_max_age=1000 # jiffies + echo "sleep $((recalc_p * 2)) seconds..." + sleep $((recalc_p * 2)) + + local remaining=$($LCTL get_param -n $nsdir.lock_unused_count) + # restore lru_max_age + $LCTL set_param -n $nsdir.lru_max_age $max_age + [ $remaining -eq 0 ] || error "$remaining locks are not canceled" + unlinkmany $DIR/$tdir/f $nr +} +run_test 124c "LRUR cancel very aged locks" + test_125() { # 13358 [ -z "$(lctl get_param -n llite.*.client_type | grep local)" ] && skip "must run as local client" && return [ -z "$(lctl get_param -n mdc.*-mdc-*.connect_flags | grep acl)" ] && skip "must have acl enabled" && return @@ -8854,81 +8989,6 @@ test_131e() { } run_test 131e "test read hitting hole" -get_ost_param() { - local token=$1 - local gl_sum=0 - for node in $(osts_nodes); do - gl=$(do_node $node "$LCTL get_param -n ost.OSS.ost.stats" | awk '/'$token'/ {print $2}' | head -n 1) - [ x$gl = x"" ] && gl=0 - gl_sum=$((gl_sum + gl)) - done - echo $gl_sum -} - -som_mode_switch() { - local som=$1 - local gl1=$2 - local gl2=$3 - - if [ x$som = x"enabled" ]; then - [ $((gl2 - gl1)) -gt 0 ] && error "no glimpse RPC is expected" - 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" - MOUNT_OPTS="${MOUNT_OPTS:+$MOUNT_OPTS,}som_preview" - do_facet mgs "$LCTL conf_param $FSNAME.mdt.som=enabled" - fi - - # do remount to make new mount-conf parameters actual - echo remounting... - sync - stopall - setupall -} - -test_132() { #1028, SOM - [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - remote_mds_nodsh && skip "remote MDS with nodsh" && return - local num=$(get_mds_dir $DIR) - local mymds=mds${num} - 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 -n mdt.*.som" | head -n 1) - - gl1=$(get_ost_param "ldlm_glimpse_enqueue") - stat $DIR/$tfile >/dev/null - gl2=$(get_ost_param "ldlm_glimpse_enqueue") - echo "====> SOM is "$som1", "$((gl2 - gl1))" glimpse RPC occured" - rm $DIR/$tfile - som_mode_switch $som1 $gl1 $gl2 - - dd if=/dev/zero of=$DIR/$tfile count=1 2>/dev/null - cancel_lru_locks osc - - 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 - som2="disabled" - else - som2="enabled" - fi - fi - - gl1=$(get_ost_param "ldlm_glimpse_enqueue") - stat $DIR/$tfile >/dev/null - gl2=$(get_ost_param "ldlm_glimpse_enqueue") - echo "====> SOM is "$som2", "$((gl2 - gl1))" glimpse RPC occured" - som_mode_switch $som2 $gl1 $gl2 - MOUNT_OPTS=$MOUNT_OPTS_SAVE -} -run_test 132 "som avoids glimpse rpc" - check_stats() { local res local count @@ -9292,10 +9352,10 @@ test_133g() { error "find $proc_dirs failed" [ $(lustre_version_code $SINGLEMDS) -le $(version_code 2.5.54) ] && - skip "Too old lustre on MDS" + skip "Too old lustre on MDS" && return [ $(lustre_version_code ost1) -le $(version_code 2.5.54) ] && - skip "Too old lustre on ost1" + skip "Too old lustre on ost1" && return for facet in $SINGLEMDS ost1; do do_facet $facet find $proc_dirs \ @@ -9671,7 +9731,7 @@ test_154A() { [ -z "$FID" ] && error "path2fid unable to get $DIR/$tfile FID" # check that we get the same pathname back - local FOUND=$($LFS fid2path $MOUNT $FID) + local FOUND=$($LFS fid2path $MOUNT "$FID") [ -z "$FOUND" ] && error "fid2path unable to get $FID path" [ "$FOUND" != "$DIR/$tfile" ] && error "fid2path(path2fid($DIR/$tfile)) = $FOUND != $DIR/$tfile" @@ -9753,7 +9813,8 @@ test_154c() { N=$((N + 1)) done - $LFS fid2path $MOUNT $FID1 $FID2 $FID3 | while read PATHNAME; do + $LFS fid2path $MOUNT "$FID1" "$FID2" "$FID3" | while read PATHNAME; + do [ "$PATHNAME" = "$DIR/$tfile.$N" ] || error "fid2path pathname $PATHNAME != $DIR/$tfile.$N:" N=$((N + 1)) @@ -9777,13 +9838,13 @@ test_154d() { rm -f $DIR/$tfile touch $DIR/$tfile - fid=$($LFS path2fid $DIR/$tfile) + local fid=$($LFS path2fid $DIR/$tfile) # Open the file fd=$(free_fd) cmd="exec $fd<$DIR/$tfile" eval $cmd - fid_list=$(do_facet $SINGLEMDS $LCTL get_param $proc_ofile) - echo $fid_list | grep $fid + local fid_list=$(do_facet $SINGLEMDS $LCTL get_param $proc_ofile) + echo "$fid_list" | grep "$fid" rc=$? cmd="exec $fd>/dev/null" @@ -9881,6 +9942,16 @@ test_154f() { } run_test 154f "get parent fids by reading link ea" +test_154g() +{ + [[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.6.92) ]] || + { skip "Need MDS version at least 2.6.92"; return 0; } + + mkdir -p $DIR/$tdir + llapi_fid_test -d $DIR/$tdir +} +run_test 154g "various llapi FID tests" + test_155_small_load() { local temp=$TMP/$tfile local file=$DIR/$tfile @@ -10530,6 +10601,8 @@ check_path() { local fid=$2 local path=$(${LFS} fid2path $*) + # Remove the '//' indicating a remote directory + path=$(echo $path | sed 's#//#/#g') RC=$? if [ $RC -ne 0 ]; then @@ -10624,6 +10697,33 @@ test_162b() { } run_test 162b "striped directory path lookup sanity" +# LU-4239: Verify fid2path works with paths 100 or more directories deep +test_162c() { + test_mkdir $DIR/$tdir.local + test_mkdir $DIR/$tdir.remote + local lpath=$tdir.local + local rpath=$tdir.remote + + for ((i = 0; i <= 101; i++)); do + lpath="$lpath/$i" + mkdir $DIR/$lpath + FID=$($LFS path2fid $DIR/$lpath | tr -d '[]') || + error "get fid for local directory $DIR/$lpath failed" + check_path "$DIR/$lpath" $MOUNT $FID --link 0 || + error "check path for local directory $DIR/$lpath failed" + + rpath="$rpath/$i" + test_mkdir $DIR/$rpath + FID=$($LFS path2fid $DIR/$rpath | tr -d '[]') || + error "get fid for remote directory $DIR/$rpath failed" + check_path "$DIR/$rpath" $MOUNT $FID --link 0 || + error "check path for remote directory $DIR/$rpath failed" + done + + return 0 +} +run_test 162c "fid2path works with paths 100 or more directories deep" + test_169() { # do directio so as not to populate the page cache log "creating a 10 Mb file" @@ -10863,31 +10963,32 @@ test_181() { # bug 22177 run_test 181 "Test open-unlinked dir ========================" test_182() { - [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - # disable MDC RPC lock wouldn't crash client local fcount=1000 - local tcount=4 + local tcount=10 mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir" -#define OBD_FAIL_MDC_RPCS_SEM 0x804 - $LCTL set_param fail_loc=0x804 - for (( i=0; i < $tcount; i++ )) ; do + $LCTL set_param mdc.*.rpc_stats=clear + + for (( i = 0; i < $tcount; i++ )) ; do mkdir $DIR/$tdir/$i + done + + for (( i = 0; i < $tcount; i++ )) ; do createmany -o $DIR/$tdir/$i/f- $fcount & done wait - for (( i=0; i < $tcount; i++ )) ; do + for (( i = 0; i < $tcount; i++ )) ; do unlinkmany $DIR/$tdir/$i/f- $fcount & done wait - rm -rf $DIR/$tdir + $LCTL get_param mdc.*.rpc_stats - $LCTL set_param fail_loc=0 + rm -rf $DIR/$tdir } -run_test 182 "Disable MDC RPCs semaphore wouldn't crash client ================" +run_test 182 "Test parallel modify metadata operations ================" test_183() { # LU-2275 remote_mds_nodsh && skip "remote MDS with nodsh" && return @@ -10985,7 +11086,7 @@ test_184c() { local ref2=$dir0/ref2 local file1=$dir0/file1 local file2=$dir0/file2 - # create a file large enough for the concurent test + # create a file large enough for the concurrent test dd if=/dev/urandom of=$ref1 bs=1M count=$((RANDOM % 50 + 20)) dd if=/dev/urandom of=$ref2 bs=1M count=$((RANDOM % 50 + 20)) echo "ref file size: ref1($(stat -c %s $ref1))," \ @@ -11054,6 +11155,41 @@ test_184d() { } run_test 184d "allow stripeless layouts swap" +test_184e() { + [[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.6.94) ]] || + { skip "Need MDS version at least 2.6.94"; return 0; } + check_swap_layouts_support && return 0 + [ -z "$(which getfattr 2>/dev/null)" ] && + skip "no getfattr command" && return 0 + + local file1=$DIR/$tdir/$tfile-1 + local file2=$DIR/$tdir/$tfile-2 + local file3=$DIR/$tdir/$tfile-3 + local lovea + + mkdir -p $DIR/$tdir + touch $file1 || error "create $file1 failed" + $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file2 || + error "create $file2 failed" + $OPENFILE -f O_CREAT:O_LOV_DELAY_CREATE $file3 || + error "create $file3 failed" + + $LFS swap_layouts $file1 $file2 || + error "swap $file1 $file2 layouts failed" + + lovea=$(getfattr -n trusted.lov $file1 | grep ^trusted) + [[ -z "$lovea" ]] || error "$file1 shouldn't have lovea" + + echo 123 > $file1 || error "Should be able to write into $file1" + + $LFS swap_layouts $file1 $file3 || + error "swap $file1 $file3 layouts failed" + + echo 123 > $file1 || error "Should be able to write into $file1" + + rm -rf $file1 $file2 $file3 +} +run_test 184e "Recreate layout after stripeless layout swaps" test_185() { # LU-2441 # LU-3553 - no volatile file support in old servers @@ -11135,6 +11271,7 @@ test_200() { local ost_range="$first_ost $last_ost $ost_step" local test_path=$POOL_ROOT/$POOL_DIR_NAME local file_dir=$POOL_ROOT/file_tst + local subdir=$test_path/subdir local rc=0 while : ; do @@ -11145,6 +11282,8 @@ test_200() { mkdir -p $test_path pool_set_dir $POOL $test_path || { rc=$? ; break; } pool_check_dir $POOL $test_path || { rc=$? ; break; } + mkdir -p $subdir + pool_check_dir $POOL $subdir || { rc=$? ; break; } pool_dir_rel_path $POOL $POOL_DIR_NAME $POOL_ROOT \ || { rc=$? ; break; } # former test_200e test_200f @@ -11798,7 +11937,7 @@ test_220() { #LU-325 local OSTIDX=0 test_mkdir -p $DIR/$tdir - local OST=$(lfs osts | grep ${OSTIDX}": " | \ + local OST=$($LFS osts | grep ${OSTIDX}": " | \ awk '{print $2}' | sed -e 's/_UUID$//') # on the mdt's osc @@ -11929,6 +12068,39 @@ test_224b() { # LU-1039, MRP-303 } run_test 224b "Don't panic on bulk IO failure" +test_224c() { # LU-6441 + [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + local pages_per_rpc=$($LCTL get_param \ + osc.*.max_pages_per_rpc) + local at_max=$($LCTL get_param -n at_max) + local timeout=$($LCTL get_param -n timeout) + local test_at="$LCTL get_param -n at_max" + local param_at="$FSNAME.sys.at_max" + local test_timeout="$LCTL get_param -n timeout" + local param_timeout="$FSNAME.sys.timeout" + + $LCTL set_param -n osc.*.max_pages_per_rpc=1024 + + set_conf_param_and_check client "$test_at" "$param_at" 0 || + error "conf_param at_max=0 failed" + set_conf_param_and_check client "$test_timeout" "$param_timeout" 5 || + error "conf_param timeout=5 failed" + + #define OBD_FAIL_PTLRPC_CLIENT_BULK_CB3 0x520 + $LCTL set_param fail_loc=0x520 + dd if=/dev/zero of=$DIR/$tfile bs=8MB count=1 + sync + $LCTL set_param fail_loc=0 + + set_conf_param_and_check client "$test_at" "$param_at" $at_max || + error "conf_param at_max=$at_max failed" + set_conf_param_and_check client "$test_timeout" "$param_timeout" \ + $timeout || error "conf_param timeout=$timeout failed" + + $LCTL set_param -n $pages_per_rpc +} +run_test 224c "Don't hang if one of md lost during large bulk RPC" + MDSSURVEY=${MDSSURVEY:-$(which mds-survey 2>/dev/null || true)} test_225a () { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return @@ -12211,8 +12383,8 @@ run_test 228c "NOT shrink the last entry in OI index node to recycle idle leaf" test_229() { # LU-2482, LU-3448 [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.4.53) ] && - skip "No HSM support on MDS of $(get_lustre_version)," \ - "need 2.4.53 at least" && return + skip "No HSM $(lustre_build_version $SINGLEMDS) MDS < 2.4.53" && + return [ $PARALLEL == "yes" ] && skip "skip parallel run" && return [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" && return @@ -12247,7 +12419,8 @@ test_230a() { [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return local MDTIDX=1 - mkdir -p $DIR/$tdir/test_230_local + test_mkdir $DIR/$tdir + test_mkdir -i0 -c1 $DIR/$tdir/test_230_local local mdt_idx=$($GETSTRIPE -M $DIR/$tdir/test_230_local) [ $mdt_idx -ne 0 ] && error "create local directory on wrong MDT $mdt_idx" @@ -12278,8 +12451,9 @@ test_230b() { local migrate_dir=$DIR/$tdir/migrate_dir local other_dir=$DIR/$tdir/other_dir - mkdir -p $migrate_dir - mkdir -p $other_dir + test_mkdir $DIR/$tdir + test_mkdir -i0 -c1 $migrate_dir + test_mkdir -i0 -c1 $other_dir for ((i=0; i<10; i++)); do mkdir -p $migrate_dir/dir_${i} createmany -o $migrate_dir/dir_${i}/f 10 || @@ -12309,10 +12483,10 @@ test_230b() { ln -s $other_dir/$tfile $migrate_dir/${tfile}_ln_other $LFS mv -v -M $MDTIDX $migrate_dir || - error "migrate remote dir error" + error "migrate remote dir error" echo "migratate to MDT1, then checking.." - for ((i=0; i<10; i++)); do + for ((i = 0; i < 10; i++)); do for file in $(find $migrate_dir/dir_${i}); do mdt_index=$($LFS getstripe -M $file) [ $mdt_index == $MDTIDX ] || @@ -12364,16 +12538,16 @@ test_230b() { stripe_count=$($LFS getstripe -c $migrate_dir/dir_default_stripe2) [ $stripe_count = 2 ] || - error "dir strpe_count $d != 2 after migration." + error "dir strpe_count $d != 2 after migration." stripe_count=$($LFS getstripe -c $migrate_dir/${tfile}_stripe2) [ $stripe_count = 2 ] || - error "file strpe_count $d != 2 after migration." + error "file strpe_count $d != 2 after migration." #migrate back to MDT0 MDTIDX=0 $LFS mv -v -M $MDTIDX $migrate_dir || - error "migrate remote dir error" + error "migrate remote dir error" echo "migrate back to MDT0, checking.." for file in $(find $migrate_dir); do @@ -12434,36 +12608,38 @@ test_230c() { local MDTIDX=1 local mdt_index local file + local migrate_dir=$DIR/$tdir/migrate_dir #If migrating directory fails in the middle, all entries of #the directory is still accessiable. - mkdir -p $DIR/$tdir - stat $DIR/$tdir - createmany -o $DIR/$tdir/f 10 || - error "create files under ${tdir} failed" + test_mkdir $DIR/$tdir + test_mkdir -i0 -c1 $migrate_dir + stat $migrate_dir + createmany -o $migrate_dir/f 10 || + error "create files under ${migrate_dir} failed" #failed after migrating 5 entries #OBD_FAIL_MIGRATE_ENTRIES 0x1801 do_facet mds1 lctl set_param fail_loc=0x20001801 do_facet mds1 lctl set_param fail_val=5 - local t=`ls $DIR/$tdir | wc -l` - $LFS mv -M $MDTIDX $DIR/$tdir && - error "migrate should failed after 5 entries" - local u=`ls $DIR/$tdir | wc -l` + local t=$(ls $migrate_dir | wc -l) + $LFS mv --mdt-index $MDTIDX $migrate_dir && + error "migrate should fail after 5 entries" + local u=$(ls $migrate_dir | wc -l) [ "$u" == "$t" ] || error "$u != $t during migration" - for file in $(find $DIR/$tdir); do + for file in $(find $migrate_dir); do stat $file || error "stat $file failed" done do_facet mds1 lctl set_param fail_loc=0 do_facet mds1 lctl set_param fail_val=0 - $LFS mv -M $MDTIDX $DIR/$tdir || + $LFS mv -M $MDTIDX $migrate_dir || error "migrate open files should failed with open files" echo "Finish migration, then checking.." - for file in $(find $DIR/$tdir); do + for file in $(find $migrate_dir); do mdt_index=$($LFS getstripe -M $file) [ $mdt_index == $MDTIDX ] || error "$file is not on MDT${MDTIDX}" @@ -12478,21 +12654,23 @@ test_230d() { [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return local MDTIDX=1 local mdt_index + local migrate_dir=$DIR/$tdir/migrate_dir local i local j - mkdir -p $DIR/$tdir + test_mkdir $DIR/$tdir + test_mkdir -i0 -c1 $migrate_dir for ((i=0; i<100; i++)); do - mkdir -p $DIR/$tdir/dir_${i} - createmany -o $DIR/$tdir/dir_${i}/f 100 || + test_mkdir -i0 -c1 $migrate_dir/dir_${i} + createmany -o $migrate_dir/dir_${i}/f 100 || error "create files under remote dir failed $i" done - $LFS mv -M $MDTIDX -v $DIR/$tdir || error "migrate remote dir error" + $LFS mv -M $MDTIDX -v $migrate_dir || error "migrate remote dir error" echo "Finish migration, then checking.." - for file in $(find $DIR/$tdir); do + for file in $(find $migrate_dir); do mdt_index=$($LFS getstripe -M $file) [ $mdt_index == $MDTIDX ] || error "$file is not on MDT${MDTIDX}" @@ -12689,11 +12867,11 @@ test_238() { ln $DIR/$tfile $DIR/$tfile.lnk touch $DIR/$tfile.new mv $DIR/$tfile.new $DIR/$tfile - local fid1=$(lfs path2fid $DIR/$tfile) - local fid2=$(lfs path2fid $DIR/$tfile.lnk) - local path1=$(lfs fid2path $FSNAME $fid1) + local fid1=$($LFS path2fid $DIR/$tfile) + local fid2=$($LFS path2fid $DIR/$tfile.lnk) + local path1=$($LFS fid2path $FSNAME "$fid1") [ $tfile == $path1 ] || error "linkea inconsistent: $tfile $fid1 $path1" - local path2=$(lfs fid2path $FSNAME $fid2) + local path2=$($LFS fid2path $FSNAME "$fid2") [ $tfile.lnk == $path2 ] || error "linkea inconsistent: $tfile.lnk $fid2 $path2!" rm -f $DIR/$tfile* @@ -12760,6 +12938,77 @@ test_241() { } run_test 241 "bio vs dio" +test_241b() { + dd if=/dev/zero of=$DIR/$tfile count=1 bs=40960 + ls -la $DIR/$tfile + test_241_dio 1000 & + PID=$! + test_241_dio 1000 + wait $PID +} +run_test 241b "dio vs dio" + +test_242() { + mkdir -p $DIR/$tdir + touch $DIR/$tdir/$tfile + + #define OBD_FAIL_MDS_READPAGE_PACK 0x105 + do_facet mds1 lctl set_param fail_loc=0x105 + /bin/ls $DIR/$tdir && error "ls $DIR/$tdir should fail" + + do_facet mds1 lctl set_param fail_loc=0 + /bin/ls $DIR/$tdir || error "ls $DIR/$tdir failed" +} +run_test 242 "mdt_readpage failure should not cause directory unreadable" + +test_243() +{ + test_mkdir -p $DIR/$tdir + group_lock_test -d $DIR/$tdir || error "A group lock test failed" +} +run_test 243 "various group lock tests" + +test_244() +{ + test_mkdir -p $DIR/$tdir + dd if=/dev/zero of=$DIR/$tdir/$tfile bs=1M count=35 + sendfile_grouplock $DIR/$tdir/$tfile || \ + error "sendfile+grouplock failed" + rm -rf $DIR/$tdir +} +run_test 244 "sendfile with group lock tests" + +test_250() { + [ "$(facet_fstype ost$(($($GETSTRIPE -i $DIR/$tfile) + 1)))" = "zfs" ] \ + && skip "no 16TB file size limit on ZFS" && return + + $SETSTRIPE -c 1 $DIR/$tfile + # ldiskfs extent file size limit is (16TB - 4KB - 1) bytes + local size=$((16 * 1024 * 1024 * 1024 * 1024 - 4096 - 1)) + $TRUNCATE $DIR/$tfile $size || error "truncate $tfile to $size failed" + dd if=/dev/zero of=$DIR/$tfile bs=10 count=1 oflag=append \ + conv=notrunc,fsync && error "append succeeded" + return 0 +} +run_test 250 "Write above 16T limit" + +test_251() { + $SETSTRIPE -c -1 -S 1048576 $DIR/$tfile + + #define OBD_FAIL_LLITE_LOST_LAYOUT 0x1407 + #Skip once - writing the first stripe will succeed + $LCTL set_param fail_loc=0xa0001407 fail_val=1 + $MULTIOP $DIR/$tfile o:O_RDWR:w2097152c 2>&1 | grep -q "short write" && + error "short write happened" + + $LCTL set_param fail_loc=0xa0001407 fail_val=1 + $MULTIOP $DIR/$tfile or2097152c 2>&1 | grep -q "short read" && + error "short read happened" + + rm -f $DIR/$tfile +} +run_test 251 "Handling short read and write correctly" + cleanup_test_300() { trap 0 umask $SAVE_UMASK @@ -12781,6 +13030,8 @@ test_striped_dir() { local mode=$(stat -c%a $DIR/$tdir/striped_dir) [ "$mode" = "755" ] || error "expect 755 got $mode" + $LFS getdirstripe $DIR/$tdir/striped_dir > /dev/null 2>&1 || + error "getdirstripe failed" stripe_count=$($LFS getdirstripe -c $DIR/$tdir/striped_dir) if [ "$stripe_count" != "2" ]; then error "stripe_count is $stripe_count, expect 2" @@ -12813,6 +13064,11 @@ test_striped_dir() { [ $(stat -c%h $DIR/$tdir/striped_dir) == '2' ] || error "nlink error after rmdir" + chattr +i $DIR/$tdir/striped_dir + createmany -o $DIR/$tdir/striped_dir/f 10 && + error "immutable flags not working under striped dir!" + chattr -i $DIR/$tdir/striped_dir + rmdir $DIR/$tdir/striped_dir || error "rmdir striped dir error" @@ -12942,19 +13198,16 @@ test_300e() { $LFS setdirstripe -i 0 -c 2 -t all_char $DIR/$tdir/striped_dir/stp_c || error "set striped dir under striped dir error" - mrename $DIR/$tdir/striped_dir/a $DIR/$tdir/striped_dir/b && - error "rename file under striped dir should fail" - - mrename $DIR/$tdir/striped_dir/dir_a $DIR/$tdir/striped_dir/dir_b && - error "rename dir under striped dir should fail" + mrename $DIR/$tdir/striped_dir/dir_a $DIR/$tdir/striped_dir/dir_b || + error "rename dir under striped dir fails" - mrename $DIR/$tdir/striped_dir/stp_a $DIR/$tdir/striped_dir/stp_b && - error "rename dir under different stripes should fail" + mrename $DIR/$tdir/striped_dir/stp_a $DIR/$tdir/striped_dir/stp_b || + error "rename dir under different stripes fails" mrename $DIR/$tdir/striped_dir/a $DIR/$tdir/striped_dir/c || error "rename file under striped dir should succeed" - mrename $DIR/$tdir/striped_dir/dir_a $DIR/$tdir/striped_dir/dir_c || + mrename $DIR/$tdir/striped_dir/dir_b $DIR/$tdir/striped_dir/dir_c || error "rename dir under striped dir should succeed" rm -rf $DIR/$tdir @@ -12986,74 +13239,127 @@ test_300f() { $LFS setdirstripe -i 0 -c 2 $DIR/$tdir/striped_dir/stp_b || error "create striped dir under striped dir fails" - mrename $DIR/$tdir/striped_dir/a $DIR/$tdir/striped_dir1/b && - error "rename file under different striped dir should fail" - - mrename $DIR/$tdir/striped_dir/dir_a $DIR/$tdir/striped_dir1/dir_b && + mrename $DIR/$tdir/striped_dir/dir_a $DIR/$tdir/striped_dir1/dir_b || error "rename dir under different striped dir should fail" - mrename $DIR/$tdir/striped_dir/stp_a $DIR/$tdir/striped_dir1/stp_b && + mrename $DIR/$tdir/striped_dir/stp_a $DIR/$tdir/striped_dir1/stp_b || error "rename striped dir under diff striped dir should fail" mrename $DIR/$tdir/striped_dir/a $DIR/$tdir/striped_dir1/a || error "rename file under diff striped dirs fails" - mrename $DIR/$tdir/striped_dir/dir_a $DIR/$tdir/striped_dir1/dir_a || - error "rename dir under diff striped dirs fails" - rm -rf $DIR/$tdir } run_test 300f "check rename cross striped directory" -test_300g() { - [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return +test_300_check_default_striped_dir() +{ + local dirname=$1 + local default_count=$2 + local default_index=$3 local stripe_count + local stripe_index + local dir_stripe_index 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 || + echo "checking $dirname $default_count $default_index" + $LFS setdirstripe -D -c $default_count -i $default_index \ + -t all_char $DIR/$tdir/$dirname || error "set default stripe on striped dir error" + stripe_count=$($LFS getdirstripe -D -c $DIR/$tdir/$dirname) + [ $stripe_count -eq $default_count ] || + error "expect $default_count get $stripe_count for $dirname" - stripe_count=$($LFS getdirstripe -D -c $DIR/$tdir/striped_dir) - [ $stripe_count -eq $MDSCOUNT ] || - error "default stripe wrong expect $MDSCOUNT get $stripe_count" + stripe_index=$($LFS getdirstripe -D -i $DIR/$tdir/$dirname) + [ $stripe_index -eq $default_index ] || + error "expect $default_index get $stripe_index for $dirname" - mkdir -p $DIR/$tdir/striped_dir/{test1,test2,test3,test4} + mkdir $DIR/$tdir/$dirname/{test1,test2,test3,test4} || + error "create dirs failed" - for dir in $(find $DIR/$tdir/striped_dir/*); do + createmany -o $DIR/$tdir/$dirname/f- 10 || error "create files failed" + unlinkmany $DIR/$tdir/$dirname/f- 10 || error "unlink files failed" + for dir in $(find $DIR/$tdir/$dirname/*); do stripe_count=$($LFS getdirstripe -c $dir) - [ $stripe_count -eq $MDSCOUNT ] || - error "expect $MDSCOUNT get $stripe_count for $dir" + [ $stripe_count -eq $default_count ] || + error "stripe count $default_count != $stripe_count for $dir" + + stripe_index=$($LFS getdirstripe -i $dir) + [ $default_index -eq -1 -o $stripe_index -eq $default_index ] || + error "$stripe_index != $default_index for $dir" + + #check default stripe + stripe_count=$($LFS getdirstripe -D -c $dir) + [ $stripe_count -eq $default_count ] || + error "default count $default_count != $stripe_count for $dir" + + stripe_index=$($LFS getdirstripe -D -i $dir) + [ $stripe_index -eq $default_index ] || + error "default index $default_index != $stripe_index for $dir" done + rmdir $DIR/$tdir/$dirname/* || error "rmdir failed" +} + +test_300g() { + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + local dir + local stripe_count + local stripe_index + + mkdir $DIR/$tdir + mkdir $DIR/$tdir/normal_dir + + test_300_check_default_striped_dir normal_dir $MDSCOUNT 1 + test_300_check_default_striped_dir normal_dir 1 0 + test_300_check_default_striped_dir normal_dir 2 1 + test_300_check_default_striped_dir normal_dir 2 -1 - 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 || + #delete default stripe information + echo "delete default stripeEA" + $LFS setdirstripe -d $DIR/$tdir/normal_dir || error "set default stripe on striped dir error" - mkdir -p $DIR/$tdir/striped_dir/{test1,test2,test3,test4} + mkdir -p $DIR/$tdir/normal_dir/{test1,test2,test3,test4} + for dir in $(find $DIR/$tdir/normal_dir/*); do + stripe_count=$($LFS getdirstripe -c $dir) + [ $stripe_count -eq 0 ] || + error "expect 1 get $stripe_count for $dir" + stripe_index=$($LFS getdirstripe -i $dir) + [ $stripe_index -eq 0 ] || + error "expect 0 get $stripe_index for $dir" + done +} +run_test 300g "check default striped directory for normal directory" - rmdir $DIR/$tdir/striped_dir/* || error "rmdir2 failed" +test_300h() { + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + local dir + local stripe_count - #change default stripe count to 1 - $LFS setdirstripe -D -c 1 -t all_char $DIR/$tdir/striped_dir || + mkdir $DIR/$tdir + $LFS setdirstripe -i 0 -c $MDSCOUNT -t all_char \ + $DIR/$tdir/striped_dir || + error "set striped dir error" + + test_300_check_default_striped_dir striped_dir $MDSCOUNT 1 + test_300_check_default_striped_dir striped_dir 1 0 + test_300_check_default_striped_dir striped_dir 2 1 + test_300_check_default_striped_dir striped_dir 2 -1 + + #delete default stripe information + $LFS setdirstripe -d $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 ] || + [ $stripe_count -eq 0 ] || 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" +run_test 300h "check default striped directory for striped directory" -test_300h() { +test_300i() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return local stripe_count @@ -13091,7 +13397,81 @@ test_300h() { return 0 } -run_test 300h "client handle unknown hash type striped directory" +run_test 300i "client handle unknown hash type striped directory" + +prepare_remote_file() { + mkdir $DIR/$tdir/src_dir || + error "create remote source failed" + + cp /etc/hosts $DIR/$tdir/src_dir/a || error + touch $DIR/$tdir/src_dir/a + + $LFS mkdir -i 1 $DIR/$tdir/tgt_dir || + error "create remote target dir failed" + + touch $DIR/$tdir/tgt_dir/b + + mrename $DIR/$tdir/src_dir/a $DIR/$tdir/tgt_dir/b || + error "rename dir cross MDT failed!" + + $CHECKSTAT -t file $DIR/$tdir/src_dir/a && + error "src_child still exists after rename" + + $CHECKSTAT -t file $DIR/$tdir/tgt_dir/b || + error "missing file(a) after rename" + + diff /etc/hosts $DIR/$tdir/tgt_dir/b || + error "diff after rename" +} + +test_310a() { + [[ $MDSCOUNT -lt 2 ]] && skip "needs >= 4 MDTs" && return + [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + local remote_file=$DIR/$tdir/tgt_dir/b + + mkdir -p $DIR/$tdir + + prepare_remote_file || error "prepare remote file failed" + + #open-unlink file + $OPENUNLINK $remote_file $remote_file || error + $CHECKSTAT -a $remote_file || error +} +run_test 310a "open unlink remote file" + +test_310b() { + [[ $MDSCOUNT -lt 2 ]] && skip "needs >= 4 MDTs" && return + [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + local remote_file=$DIR/$tdir/tgt_dir/b + + mkdir -p $DIR/$tdir + + prepare_remote_file || error "prepare remote file failed" + + ln $remote_file $DIR/$tfile || error "link failed for remote file" + $MULTIOP $DIR/$tfile Ouc || error "mulitop failed" + $CHECKSTAT -t file $remote_file || error "check file failed" +} +run_test 310b "unlink remote file with multiple links while open" + +test_310c() { + [[ $MDSCOUNT -lt 4 ]] && skip "needs >= 4 MDTs" && return + [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + local remote_file=$DIR/$tdir/tgt_dir/b + + mkdir -p $DIR/$tdir + + prepare_remote_file || error "prepare remote file failed" + + ln $remote_file $DIR/$tfile || error "link failed for remote file" + multiop_bg_pause $remote_file O_uc || + error "mulitop failed for remote file" + MULTIPID=$! + $MULTIOP $DIR/$tfile Ouc + kill -USR1 $MULTIPID + wait $MULTIPID +} +run_test 310c "open-unlink remote file with multiple links" test_400a() { # LU-1606, was conf-sanity test_74 local extra_flags=''