X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Ftests%2Fsanity.sh;h=94dd3cdfc0bdd804c06dab7ed013f6002625f173;hp=a7031caba3c1a363f5bbbb9f2d4bf7ac414a4e85;hb=79e65c81349f539aa2960a1889144ce71d91351e;hpb=458495d255088dd316bcd9b525b5dd0d20930225 diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh index a7031ca..94dd3cd 100644 --- a/lustre/tests/sanity.sh +++ b/lustre/tests/sanity.sh @@ -58,7 +58,7 @@ init_test_env $@ . ${CONFIG:=$LUSTRE/tests/cfg/${NAME}.sh} init_logging -[ "$SLOW" = "no" ] && EXCEPT_SLOW="24o 27m 64b 68 71 77f 78 115 124b" +[ "$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 @@ -193,6 +193,25 @@ test_3() { } 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 || + error "Create remote directory failed" + + touch $DIR/$remote_dir/$tfile || + error "Create file under remote directory failed" + + rmdir $DIR/$remote_dir && + error "Expect error removing in-use dir $DIR/$remote_dir" + + test -d $DIR/$remote_dir || error "Remote directory disappeared" +} +run_test 4 "mkdir; touch dir/file; rmdir; checkdir (expect error)" + test_5() { test_mkdir -p $DIR/$tdir || error "mkdir $tdir failed" test_mkdir $DIR/$tdir/d2 || error "mkdir $tdir/d2 failed" @@ -447,6 +466,10 @@ test_17g() { [ $(lustre_version_code $SINGLEMDS) -le $(version_code 2.3.55) ] && TESTS="4094 4095" + # skip long symlink name for rhel6.5. + # rhel6.5 has a limit (PATH_MAX - sizeof(struct filename)) + grep -q '6.5' /etc/redhat-release && TESTS="59 60 61 4062 4063" + for i in $TESTS; do local SYMNAME=$(str_repeat 'x' $i) ln -s $SYMNAME $DIR/$tdir/f$i || error "failed $i-char symlink" @@ -571,7 +594,7 @@ test_17m() { echo "stop and checking mds${mds_index}: $cmd" # e2fsck should not return error - stop mds${mds_index} -f + stop mds${mds_index} do_facet mds${mds_index} $cmd || rc=$? start mds${mds_index} $devname $MDS_MOUNT_OPTS @@ -588,7 +611,9 @@ check_fs_consistency_17n() { local cmd local rc=0 - for mdt_index in $(seq 1 $MDSCOUNT); do + # create/unlink in 17n only change 2 MDTs(MDT1/MDT2), + # so it only check MDT1/MDT2 instead of all of MDTs. + for mdt_index in $(seq 1 2); do devname=$(mdsdevname $mdt_index) cmd="$E2FSCK -fnvd $devname" @@ -626,14 +651,35 @@ test_17n() { error "create files under remote dir failed $i" done - check_fs_consistency_17n || error "e2fsck report error" + check_fs_consistency_17n || + error "e2fsck report error after create files under remote dir" + + for ((i=0;i<10;i++)); do + rm -rf $DIR/$tdir/remote_dir_${i} || + error "destroy remote dir error $i" + done + + check_fs_consistency_17n || + error "e2fsck report error after unlink files under remote dir" + + [ $(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 + 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} || + error "migrate remote dir error $i" + done + check_fs_consistency_17n || error "e2fsck report error after migration" for ((i=0;i<10;i++)); do rm -rf $DIR/$tdir/remote_dir_${i} || error "destroy remote dir error $i" done - check_fs_consistency_17n || error "e2fsck report error" + check_fs_consistency_17n || error "e2fsck report error after unlink" } run_test 17n "run e2fsck against master/slave MDT which contains remote dir" @@ -786,9 +832,9 @@ test_24c() { run_test 24c "rename directory to non-existent target" test_24d() { - test_mkdir $DIR/$tdir - test_mkdir $DIR/$tdir/d$testnum.1 - test_mkdir $DIR/$tdir/d$testnum.2 + test_mkdir -c1 $DIR/$tdir + test_mkdir -c1 $DIR/$tdir/d$testnum.1 + test_mkdir -c1 $DIR/$tdir/d$testnum.2 mrename $DIR/$tdir/d$testnum.1 $DIR/$tdir/d$testnum.2 $CHECKSTAT -a $DIR/$tdir/d$testnum.1 || error "d$testnum.1 exists" $CHECKSTAT -t dir $DIR/$tdir/d$testnum.2 || error "d$testnum.2 not dir" @@ -827,10 +873,10 @@ test_24g() { run_test 24g "mkdir .../R7{a,b}/d; mv .../R7a/d .../R7b/e ======" test_24h() { - test_mkdir $DIR/R8a - test_mkdir $DIR/R8b - test_mkdir $DIR/R8a/d - test_mkdir $DIR/R8b/e + test_mkdir -c1 $DIR/R8a + test_mkdir -c1 $DIR/R8b + test_mkdir -c1 $DIR/R8a/d + test_mkdir -c1 $DIR/R8b/e mrename $DIR/R8a/d $DIR/R8b/e $CHECKSTAT -a $DIR/R8a/d || error $CHECKSTAT -t dir $DIR/R8b/e || error @@ -1718,26 +1764,7 @@ check_seq_oid() local dev=$(ostdevname $ost) local oid_hex - if [ $(facet_fstype ost$ost) != ldiskfs ]; then - echo "Currently only works with ldiskfs-based OSTs" - continue - fi - - log "want: stripe:$stripe_nr ost:$obdidx oid:$oid/$hex seq:$seq" - - #don't unmount/remount the OSTs if we don't need to do that - # LU-2577 changes filter_fid to be smaller, so debugfs needs - # update too, until that use mount/ll_decode_filter_fid/mount - local dir=$(facet_mntpt ost$ost) - local opts=${OST_MOUNT_OPTS} - - if ! do_facet ost$ost test -b ${dev}; then - opts=$(csa_add "$opts" -o loop) - fi - - stop ost$ost - do_facet ost$ost mount -t $(facet_fstype ost$ost) $opts $dev $dir || - { error "mounting $dev as $FSTYPE failed"; return 3; } + log "want: stripe:$stripe_nr ost:$obdidx oid:$oid/$hex seq:$seq" seq=$(echo $seq | sed -e "s/^0x//g") if [ $seq == 0 ]; then @@ -1745,25 +1772,48 @@ check_seq_oid() else oid_hex=$(echo $hex | sed -e "s/^0x//g") fi - local obj_file=$(do_facet ost$ost find $dir/O/$seq -name $oid_hex) - local ff=$(do_facet ost$ost $LL_DECODE_FILTER_FID $obj_file) - do_facet ost$ost umount -d $dir - start ost$ost $dev $OST_MOUNT_OPTS + local obj_file="O/$seq/d$((oid %32))/$oid_hex" - # re-enable when debugfs will understand new filter_fid - #local ff=$(do_facet ost$ost "$DEBUGFS -c -R 'stat $obj_file' \ - # $dev 2>/dev/null" | grep "parent=") + local ff + # + # Don't unmount/remount the OSTs if we don't need to do that. + # LU-2577 changes filter_fid to be smaller, so debugfs needs + # update too, until that use mount/ll_decode_filter_fid/mount. + # Re-enable when debugfs will understand new filter_fid. + # + if false && [ $(facet_fstype ost$ost) == ldiskfs ]; then + ff=$(do_facet ost$ost "$DEBUGFS -c -R 'stat $obj_file' \ + $dev 2>/dev/null" | grep "parent=") + else + stop ost$ost + mount_fstype ost$ost + ff=$(do_facet ost$ost $LL_DECODE_FILTER_FID \ + $(facet_mntpt ost$ost)/$obj_file) + unmount_fstype ost$ost + start ost$ost $dev $OST_MOUNT_OPTS + fi - [ -z "$ff" ] && error "$obj_file: no filter_fid info" + [ -z "$ff" ] && error "$obj_file: no filter_fid info" - echo "$ff" | sed -e 's#.*objid=#got: objid=#' + echo "$ff" | sed -e 's#.*objid=#got: objid=#' - # /mnt/O/0/d23/23: objid=23 seq=0 parent=[0x200000400:0x1e:0x1] - # fid: objid=23 seq=0 parent=[0x200000400:0x1e:0x0] stripe=1 - local ff_parent=$(echo $ff|sed -e 's/.*parent=.//') - local ff_pseq=$(echo $ff_parent | cut -d: -f1) - local ff_poid=$(echo $ff_parent | cut -d: -f2) - local ff_pstripe=$(echo $ff_parent | sed -e 's/.*stripe=//') + # /mnt/O/0/d23/23: objid=23 seq=0 parent=[0x200000400:0x1e:0x1] + # fid: objid=23 seq=0 parent=[0x200000400:0x1e:0x0] stripe=1 + local ff_parent=$(echo $ff|sed -e 's/.*parent=.//') + local ff_pseq=$(echo $ff_parent | cut -d: -f1) + local ff_poid=$(echo $ff_parent | cut -d: -f2) + local ff_pstripe + if echo $ff_parent | grep -q 'stripe='; then + ff_pstripe=$(echo $ff_parent | sed -e 's/.*stripe=//') + else + # + # $LL_DECODE_FILTER_FID does not print "stripe="; look + # into f_ver in this case. See the comment on + # ff_parent. + # + ff_pstripe=$(echo $ff_parent | cut -d: -f3 | + sed -e 's/\]//') + fi # compare lmm_seq and filter_fid->ff_parent.f_seq [ $ff_pseq = $lmm_seq ] || @@ -1771,7 +1821,7 @@ check_seq_oid() # compare lmm_object_id and filter_fid->ff_parent.f_oid [ $ff_poid = $lmm_oid ] || error "FF parent OID $ff_poid != $lmm_oid" - [ $ff_pstripe = $stripe_nr ] || + (($ff_pstripe == $stripe_nr)) || error "FF stripe $ff_pstripe != $stripe_nr" stripe_nr=$((stripe_nr + 1)) @@ -2034,76 +2084,74 @@ test_31f() { # bug 4554 run_test 31f "remove of open directory with open-unlink file ===" test_31g() { - echo "-- cross directory link --" - test_mkdir $DIR/d31ga - test_mkdir $DIR/d31gb - touch $DIR/d31ga/f - ln $DIR/d31ga/f $DIR/d31gb/g - $CHECKSTAT -t file $DIR/d31ga/f || error "source" - [ `stat -c%h $DIR/d31ga/f` == '2' ] || error "source nlink" - $CHECKSTAT -t file $DIR/d31gb/g || error "target" - [ `stat -c%h $DIR/d31gb/g` == '2' ] || error "target nlink" + echo "-- cross directory link --" + test_mkdir -c1 $DIR/${tdir}ga + test_mkdir -c1 $DIR/${tdir}gb + touch $DIR/${tdir}ga/f + ln $DIR/${tdir}ga/f $DIR/${tdir}gb/g + $CHECKSTAT -t file $DIR/${tdir}ga/f || error "source" + [ `stat -c%h $DIR/${tdir}ga/f` == '2' ] || error "source nlink" + $CHECKSTAT -t file $DIR/${tdir}gb/g || error "target" + [ `stat -c%h $DIR/${tdir}gb/g` == '2' ] || error "target nlink" } run_test 31g "cross directory link===============" test_31h() { - echo "-- cross directory link --" - test_mkdir $DIR/d31h - test_mkdir $DIR/d31h/dir - touch $DIR/d31h/f - ln $DIR/d31h/f $DIR/d31h/dir/g - $CHECKSTAT -t file $DIR/d31h/f || error "source" - [ `stat -c%h $DIR/d31h/f` == '2' ] || error "source nlink" - $CHECKSTAT -t file $DIR/d31h/dir/g || error "target" - [ `stat -c%h $DIR/d31h/dir/g` == '2' ] || error "target nlink" + echo "-- cross directory link --" + test_mkdir -c1 $DIR/${tdir} + test_mkdir -c1 $DIR/${tdir}/dir + touch $DIR/${tdir}/f + ln $DIR/${tdir}/f $DIR/${tdir}/dir/g + $CHECKSTAT -t file $DIR/${tdir}/f || error "source" + [ `stat -c%h $DIR/${tdir}/f` == '2' ] || error "source nlink" + $CHECKSTAT -t file $DIR/${tdir}/dir/g || error "target" + [ `stat -c%h $DIR/${tdir}/dir/g` == '2' ] || error "target nlink" } run_test 31h "cross directory link under child===============" test_31i() { - echo "-- cross directory link --" - test_mkdir $DIR/d31i - test_mkdir $DIR/d31i/dir - touch $DIR/d31i/dir/f - ln $DIR/d31i/dir/f $DIR/d31i/g - $CHECKSTAT -t file $DIR/d31i/dir/f || error "source" - [ `stat -c%h $DIR/d31i/dir/f` == '2' ] || error "source nlink" - $CHECKSTAT -t file $DIR/d31i/g || error "target" - [ `stat -c%h $DIR/d31i/g` == '2' ] || error "target nlink" + echo "-- cross directory link --" + test_mkdir -c1 $DIR/$tdir + test_mkdir -c1 $DIR/$tdir/dir + touch $DIR/$tdir/dir/f + ln $DIR/$tdir/dir/f $DIR/$tdir/g + $CHECKSTAT -t file $DIR/$tdir/dir/f || error "source" + [ `stat -c%h $DIR/$tdir/dir/f` == '2' ] || error "source nlink" + $CHECKSTAT -t file $DIR/$tdir/g || error "target" + [ `stat -c%h $DIR/$tdir/g` == '2' ] || error "target nlink" } run_test 31i "cross directory link under parent===============" - test_31j() { - test_mkdir $DIR/d31j - test_mkdir $DIR/d31j/dir1 - ln $DIR/d31j/dir1 $DIR/d31j/dir2 && error "ln for dir" - link $DIR/d31j/dir1 $DIR/d31j/dir3 && error "link for dir" - mlink $DIR/d31j/dir1 $DIR/d31j/dir4 && error "mlink for dir" - mlink $DIR/d31j/dir1 $DIR/d31j/dir1 && error "mlink to the same dir" + test_mkdir -c1 -p $DIR/$tdir + test_mkdir -c1 -p $DIR/$tdir/dir1 + ln $DIR/$tdir/dir1 $DIR/$tdir/dir2 && error "ln for dir" + link $DIR/$tdir/dir1 $DIR/$tdir/dir3 && error "link for dir" + mlink $DIR/$tdir/dir1 $DIR/$tdir/dir4 && error "mlink for dir" + mlink $DIR/$tdir/dir1 $DIR/$tdir/dir1 && error "mlink to the same dir" return 0 } run_test 31j "link for directory===============" - test_31k() { - test_mkdir $DIR/d31k - touch $DIR/d31k/s - touch $DIR/d31k/exist - mlink $DIR/d31k/s $DIR/d31k/t || error "mlink" - mlink $DIR/d31k/s $DIR/d31k/exist && error "mlink to exist file" - mlink $DIR/d31k/s $DIR/d31k/s && error "mlink to the same file" - mlink $DIR/d31k/s $DIR/d31k && error "mlink to parent dir" - mlink $DIR/d31k $DIR/d31k/s && error "mlink parent dir to target" - mlink $DIR/d31k/not-exist $DIR/d31k/foo && error "mlink non-existing to new" - mlink $DIR/d31k/not-exist $DIR/d31k/s && error "mlink non-existing to exist" + test_mkdir -c1 -p $DIR/$tdir + touch $DIR/$tdir/s + touch $DIR/$tdir/exist + mlink $DIR/$tdir/s $DIR/$tdir/t || error "mlink" + mlink $DIR/$tdir/s $DIR/$tdir/exist && error "mlink to exist file" + mlink $DIR/$tdir/s $DIR/$tdir/s && error "mlink to the same file" + mlink $DIR/$tdir/s $DIR/$tdir && error "mlink to parent dir" + mlink $DIR/$tdir $DIR/$tdir/s && error "mlink parent dir to target" + mlink $DIR/$tdir/not-exist $DIR/$tdir/foo && error "mlink non-existing to new" + mlink $DIR/$tdir/not-exist $DIR/$tdir/s && error "mlink non-existing to exist" return 0 } run_test 31k "link to file: the same, non-existing, dir===============" test_31m() { - test_mkdir $DIR/d31m + mkdir $DIR/d31m touch $DIR/d31m/s - test_mkdir $DIR/d31m2 + mkdir $DIR/d31m2 touch $DIR/d31m2/exist mlink $DIR/d31m/s $DIR/d31m2/t || error "mlink" mlink $DIR/d31m/s $DIR/d31m2/exist && error "mlink to exist file" @@ -2116,18 +2164,20 @@ test_31m() { run_test 31m "link to file: the same, non-existing, dir===============" test_31n() { - [ -e /proc/self/fd/173 ] && echo "skipping, fd 173 is in use" && return touch $DIR/$tfile || error "cannot create '$DIR/$tfile'" nlink=$(stat --format=%h $DIR/$tfile) [ ${nlink:--1} -eq 1 ] || error "nlink is $nlink, expected 1" - exec 173<$DIR/$tfile - trap "exec 173<&-" EXIT - nlink=$(stat --dereference --format=%h /proc/self/fd/173) + local fd=$(free_fd) + local cmd="exec $fd<$DIR/$tfile" + eval $cmd + cmd="exec $fd<&-" + trap "eval $cmd" EXIT + nlink=$(stat --dereference --format=%h /proc/self/fd/$fd) [ ${nlink:--1} -eq 1 ] || error "nlink is $nlink, expected 1" rm $DIR/$tfile || error "cannot remove '$DIR/$tfile'" - nlink=$(stat --dereference --format=%h /proc/self/fd/173) + nlink=$(stat --dereference --format=%h /proc/self/fd/$fd) [ ${nlink:--1} -eq 0 ] || error "nlink is $nlink, expected 0" - exec 173<&- + eval $cmd } run_test 31n "check link count of unlinked file" @@ -2156,7 +2206,7 @@ run_test 31o "duplicate hard links with same filename" cleanup_test32_mount() { trap 0 - $UMOUNT $DIR/$tdir/ext2-mountpoint + $UMOUNT -d $DIR/$tdir/ext2-mountpoint } test_32a() { @@ -2364,7 +2414,7 @@ run_test 32p "open d32p/symlink->tmp/symlink->lustre-root/$tfile" cleanup_testdir_mount() { trap 0 - $UMOUNT $DIR/$tdir + $UMOUNT -d $DIR/$tdir } test_32q() { @@ -3134,7 +3184,7 @@ run_test 39n "check that O_NOATIME is honored" test_39o() { TESTDIR=$DIR/$tdir/$tfile [ -e $TESTDIR ] && rm -rf $TESTDIR - mkdir -p $TESTDIR + test_mkdir -p $TESTDIR cd $TESTDIR links1=2 ls @@ -3151,6 +3201,30 @@ test_39o() { } run_test 39o "directory cached attributes updated after create ========" +test_39p() { + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + local MDTIDX=1 + TESTDIR=$DIR/$tdir/$tfile + [ -e $TESTDIR ] && rm -rf $TESTDIR + mkdir -p $TESTDIR + cd $TESTDIR + links1=2 + ls + $LFS mkdir -i $MDTIDX $TESTDIR/remote_dir1 + $LFS mkdir -i $MDTIDX $TESTDIR/remote_dir2 + ls + links2=$(stat -c %h .) + [ $(($links1 + 2)) != $links2 ] && + error "wrong links count $(($links1 + 2)) != $links2" + rmdir remote_dir2 + links3=$(stat -c %h .) + [ $(($links1 + 1)) != $links3 ] && + error "wrong links count $links1 != $links3" + return 0 +} +run_test 39p "remote directory cached attributes updated after create ========" + + test_40() { dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 $RUNAS $OPENFILE -f O_WRONLY:O_TRUNC $DIR/$tfile && @@ -3716,7 +3790,7 @@ run_test 51a "special situations: split htree with empty entry ==" export NUMTEST=70000 test_51b() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - local BASE=$DIR/$tdir + local BASE=$DIR/d${base}.${TESTSUITE} # cleanup the directory rm -fr $BASE @@ -3743,7 +3817,7 @@ test_51b() { run_test 51b "exceed 64k subdirectory nlink limit" test_51ba() { # LU-993 - local BASE=$DIR/$tdir + local BASE=$DIR/d${base}.${TESTSUITE} # unlink all but 100 subdirectories, then check it still works local LEFT=100 [ -f $BASE/fnum ] && local NUMPREV=$(cat $BASE/fnum) && rm $BASE/fnum @@ -3873,37 +3947,53 @@ test_53() { local ost_last_id local ostnum local node - local found=0 + local found=false + local support_last_seq=true + + [[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.3.60) ]] || + support_last_seq=false # only test MDT0000 - local mdtosc=$(get_mdtosc_proc_path $SINGLEMDS) - for value in $(do_facet $SINGLEMDS lctl get_param osc.$mdtosc.prealloc_last_id) ; do - param=$(echo ${value[0]} | cut -d "=" -f1) - ostname=$(echo $param | cut -d "." -f2 | cut -d - -f 1-2) - param_seq=$(echo ${param} | - sed -e s/prealloc_last_id/prealloc_last_seq/g) - mds_last_seq=$(do_facet $SINGLEMDS lctl get_param -n $param_seq) - mds_last=$(do_facet $SINGLEMDS lctl get_param -n $param) + local mdtosc=$(get_mdtosc_proc_path $SINGLEMDS) + local value + for value in $(do_facet $SINGLEMDS \ + $LCTL get_param osc.$mdtosc.prealloc_last_id) ; do + param=$(echo ${value[0]} | cut -d "=" -f1) + ostname=$(echo $param | cut -d "." -f2 | cut -d - -f 1-2) + + if $support_last_seq; then + param_seq=$(echo $param | + sed -e s/prealloc_last_id/prealloc_last_seq/g) + mds_last_seq=$(do_facet $SINGLEMDS \ + $LCTL get_param -n $param_seq) + fi + mds_last=$(do_facet $SINGLEMDS $LCTL get_param -n $param) ostnum=$(index_from_ostuuid ${ostname}_UUID) node=$(facet_active_host ost$((ostnum+1))) param="obdfilter.$ostname.last_id" - for ost_last in $(do_node $node lctl get_param -n $param) ; do - echo "$ostname.last_id=$ost_last ;MDS.last_id=$mds_last" - ost_last_id=$(echo $ost_last | awk -F':' '{print $2}' | - sed -e "s/^0x//g") - ost_last_seq=$(echo $ost_last | awk -F':' '{print $1}') - if [ $ost_last_seq = $mds_last_seq ]; then - if [ $ost_last_id != $mds_last ]; then - error "$ost_last != $mds_last_id" - else - found=1 - break - fi + for ost_last in $(do_node $node $LCTL get_param -n $param) ; do + echo "$ostname.last_id=$ost_last; MDS.last_id=$mds_last" + ost_last_id=$ost_last + + if $support_last_seq; then + ost_last_id=$(echo $ost_last | + awk -F':' '{print $2}' | + sed -e "s/^0x//g") + ost_last_seq=$(echo $ost_last | + awk -F':' '{print $1}') + [[ $ost_last_seq = $mds_last_seq ]] || continue + fi + + if [[ $ost_last_id != $mds_last ]]; then + error "$ost_last_id != $mds_last" + else + found=true + break fi done - done - [ $found = 0 ] && error "can not match last_seq/last_id for $mdtosc" + done + $found || error "can not match last_seq/last_id for $mdtosc" return 0 } run_test 53 "verify that MDS and OSTs agree on pre-creation ====" @@ -3938,6 +4028,16 @@ find_loop_dev() { done } +cleanup_54c() { + loopdev="$DIR/loop54c" + + trap 0 + $UMOUNT -d $tdir || rc=$? + losetup -d $loopdev || true + rm $loopdev + return $rc +} + test_54c() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return tfile="$DIR/f54c" @@ -3948,17 +4048,16 @@ test_54c() { [ -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=`page_size` seek=1024 count=1 > /dev/null + 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 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" - $UMOUNT $tdir - losetup -d $loopdev - rm $loopdev + cleanup_54c } run_test 54c "block device works in lustre =====================" @@ -4041,23 +4140,24 @@ run_test 56a "check $GETSTRIPE" NUMFILES=3 NUMDIRS=3 setup_56() { - local LOCAL_NUMFILES="$1" - local LOCAL_NUMDIRS="$2" - local MKDIR_PARAMS="$3" - - if [ ! -d "$TDIR" ] ; then - test_mkdir -p $TDIR - [ "$MKDIR_PARAMS" ] && $SETSTRIPE $MKDIR_PARAMS $TDIR - for i in `seq 1 $LOCAL_NUMFILES` ; do - touch $TDIR/file$i - done - for i in `seq 1 $LOCAL_NUMDIRS` ; do - test_mkdir $TDIR/dir$i - for j in `seq 1 $LOCAL_NUMFILES` ; do - touch $TDIR/dir$i/file$j - done - done - fi + local LOCAL_NUMFILES="$1" + local LOCAL_NUMDIRS="$2" + local MKDIR_PARAMS="$3" + local DIR_STRIPE_PARAMS="$4" + + if [ ! -d "$TDIR" ] ; then + test_mkdir -p $DIR_STRIPE_PARAMS $TDIR + [ "$MKDIR_PARAMS" ] && $SETSTRIPE $MKDIR_PARAMS $TDIR + for i in `seq 1 $LOCAL_NUMFILES` ; do + touch $TDIR/file$i + done + for i in `seq 1 $LOCAL_NUMDIRS` ; do + test_mkdir $DIR_STRIPE_PARAMS $TDIR/dir$i + for j in `seq 1 $LOCAL_NUMFILES` ; do + touch $TDIR/dir$i/file$j + done + done + fi } setup_56_special() { @@ -4185,7 +4285,6 @@ run_test 56n "check lfs find -type l =============================" test_56o() { TDIR=$DIR/${tdir}o setup_56 $NUMFILES $NUMDIRS - utime $TDIR/file1 > /dev/null || error "utime (1)" utime $TDIR/file2 > /dev/null || error "utime (2)" utime $TDIR/dir1 > /dev/null || error "utime (3)" @@ -4476,7 +4575,7 @@ test_56w() { TDIR=$DIR/${tdir}w rm -rf $TDIR || error "remove $TDIR failed" - setup_56 $NUMFILES $NUMDIRS "-c $OSTCOUNT" + setup_56 $NUMFILES $NUMDIRS "-c $OSTCOUNT" "-c1" local stripe_size stripe_size=$($GETSTRIPE -S -d $TDIR) || @@ -4572,6 +4671,9 @@ test_56x() { 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="" local dir0=$DIR/$tdir/$testnum @@ -4669,7 +4771,7 @@ test_57b() { 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) - if [ "$MDCFREE2" -lt "$((MDCFREE - 8))" ]; then + if [ "$MDCFREE2" -lt "$((MDCFREE - 16))" ]; then if [ "$MDSFREE" != "$MDSFREE2" ]; then error "MDC before $MDCFREE != after $MDCFREE2" else @@ -4787,10 +4889,11 @@ test_62() { #run_test 62 "verify obd_match failure doesn't LBUG (should -EIO)" # bug 2319 - oig_wait() interrupted causes crash because of invalid waitq. -test_63a() { # was test_63 +# Though this test is irrelevant anymore, it helped to reveal some +# other grant bugs (LU-4482), let's keep it. +test_63a() { # was test_63 [ $PARALLEL == "yes" ] && skip "skip parallel run" && return MAX_DIRTY_MB=`lctl get_param -n osc.*.max_dirty_mb | head -n 1` - lctl set_param -n osc.*.max_dirty_mb 0 for i in `seq 10` ; do dd if=/dev/zero of=$DIR/f63 bs=8k & sleep 5 @@ -4798,7 +4901,6 @@ test_63a() { # was test_63 sleep 1 done - lctl set_param -n osc.*.max_dirty_mb $MAX_DIRTY_MB rm -f $DIR/f63 || true } run_test 63a "Verify oig_wait interruption does not crash =======" @@ -5778,6 +5880,7 @@ cleanup_101a() { test_101a() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + [ $MDSCOUNT -ge 2 ] && skip "skip now for >= 2 MDTs" && return #LU-4322 local s local discard local nreads=10000 @@ -5921,89 +6024,89 @@ test_101c() { run_test 101c "check stripe_size aligned read-ahead =================" set_read_ahead() { - $LCTL get_param -n llite.*.max_read_ahead_mb | head -n 1 - $LCTL set_param -n llite.*.max_read_ahead_mb $1 > /dev/null 2>&1 + $LCTL get_param -n llite.*.max_read_ahead_mb | head -n 1 + $LCTL set_param -n llite.*.max_read_ahead_mb $1 > /dev/null 2>&1 } test_101d() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return local file=$DIR/$tfile - local size=${FILESIZE_101c:-500} + local sz_MB=${FILESIZE_101d:-500} local ra_MB=${READAHEAD_MB:-40} - local space=$(df -P $DIR | tail -n 1 | awk '{ print $4 }') - [ $space -gt $((size * 1024)) ] || - { skip "Need free space ${size}M, have ${space}K" && return; } + local free_MB=$(($(df -P $DIR | tail -n 1 | awk '{ print $4 }') / 1024)) + [ $free_MB -lt $sz_MB ] && + skip "Need free space ${sz_MB}M, have ${free_MB}M" && return - echo "Creating test file $file of size ${size}M with ${space}K free space" + echo "Create test file $file size ${sz_MB}M, ${free_MB}M free" $SETSTRIPE -c -1 $file || error "setstripe failed" - dd if=/dev/zero of=$file bs=1M count=$size || error "dd failed" + + dd if=/dev/zero of=$file bs=1M count=$sz_MB || error "dd failed" echo Cancel LRU locks on lustre client to flush the client cache cancel_lru_locks osc - echo Disable read-ahead - local old_READAHEAD=$(set_read_ahead 0) + echo Disable read-ahead + local old_READAHEAD=$(set_read_ahead 0) - echo Reading the test file $file with read-ahead disabled - time_ra_OFF=$(do_and_time "dd if=$file of=/dev/null bs=1M count=$size") + echo Reading the test file $file with read-ahead disabled + local raOFF=$(do_and_time "dd if=$file of=/dev/null bs=1M count=$sz_MB") - echo Cancel LRU locks on lustre client to flush the client cache - cancel_lru_locks osc - echo Enable read-ahead with ${ra_MB}MB - set_read_ahead $ra_MB + echo Cancel LRU locks on lustre client to flush the client cache + cancel_lru_locks osc + echo Enable read-ahead with ${ra_MB}MB + set_read_ahead $ra_MB - echo Reading the test file $file with read-ahead enabled - time_ra_ON=$(do_and_time "dd if=$file of=/dev/null bs=1M count=$size") + echo Reading the test file $file with read-ahead enabled + local raON=$(do_and_time "dd if=$file of=/dev/null bs=1M count=$sz_MB") - echo read-ahead disabled time read $time_ra_OFF - echo read-ahead enabled time read $time_ra_ON + echo "read-ahead disabled time read $raOFF" + echo "read-ahead enabled time read $raON" set_read_ahead $old_READAHEAD rm -f $file wait_delete_completed - [ $time_ra_ON -lt $time_ra_OFF ] || - error "read-ahead enabled time read (${time_ra_ON}s) is more than - read-ahead disabled time read (${time_ra_OFF}s) filesize ${size}M" + [ $raOFF -le 1 -o $raON -lt $raOFF ] || + error "readahead ${raON}s > no-readahead ${raOFF}s ${sz_MB}M" } -run_test 101d "file read with and without read-ahead enabled =================" +run_test 101d "file read with and without read-ahead enabled" test_101e() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - local file=$DIR/$tfile - local size=500 #KB - local count=100 - local blksize=1024 - - local space=$(df -P $DIR | tail -n 1 | awk '{ print $4 }') - local need_space=$((count * size)) - [ $space -gt $need_space ] || - { skip_env "Need free space $need_space, have $space" && return; } - - echo Creating $count ${size}K test files - for ((i = 0; i < $count; i++)); do - dd if=/dev/zero of=${file}_${i} bs=$blksize count=$size 2>/dev/null - done + local file=$DIR/$tfile + local size_KB=500 #KB + local count=100 + local bsize=1024 + + local free_KB=$(df -P $DIR | tail -n 1 | awk '{ print $4 }') + local need_KB=$((count * size_KB)) + [ $free_KB -le $need_KB ] && + skip_env "Need free space $need_KB, have $free_KB" && return + + echo "Creating $count ${size_KB}K test files" + for ((i = 0; i < $count; i++)); do + dd if=/dev/zero of=$file.$i bs=$bsize count=$size_KB 2>/dev/null + done - echo Cancel LRU locks on lustre client to flush the client cache - cancel_lru_locks osc + echo "Cancel LRU locks on lustre client to flush the client cache" + cancel_lru_locks osc - echo Reset readahead stats - $LCTL set_param -n llite.*.read_ahead_stats 0 + echo "Reset readahead stats" + $LCTL set_param -n llite.*.read_ahead_stats 0 - for ((i = 0; i < $count; i++)); do - dd if=${file}_${i} of=/dev/null bs=$blksize count=$size 2>/dev/null - done + for ((i = 0; i < $count; i++)); do + dd if=$file.$i of=/dev/null bs=$bsize count=$size_KB 2>/dev/null + done - local miss=$($LCTL get_param -n llite.*.read_ahead_stats | \ - get_named_value 'misses' | cut -d" " -f1 | calc_total) + local miss=$($LCTL get_param -n llite.*.read_ahead_stats | + get_named_value 'misses' | cut -d" " -f1 | calc_total) - for ((i = 0; i < $count; i++)); do - rm -rf ${file}_${i} 2>/dev/null - done + for ((i = 0; i < $count; i++)); do + rm -rf $file.$i 2>/dev/null + done - #10000 means 20% reads are missing in readahead - [ $miss -lt 10000 ] || error "misses too much for small reads" + #10000 means 20% reads are missing in readahead + [ $miss -lt 10000 ] || error "misses too much for small reads" } run_test 101e "check read-ahead for small read(1k) for small files(500k)" @@ -6377,6 +6480,94 @@ run_test 102m "Ensure listxattr fails on small bufffer ========" cleanup_test102 +getxattr() { # getxattr path name + # Return the base64 encoding of the value of xattr name on path. + local path=$1 + local name=$2 + + # # getfattr --absolute-names --encoding=base64 --name=trusted.lov $path + # file: $path + # trusted.lov=0s0AvRCwEAAAAGAAAAAAAAAAAEAAACAAAAAAAQAAEAA...AAAAAAAAA= + # + # We print just 0s0AvRCwEAAAAGAAAAAAAAAAAEAAACAAAAAAAQAAEAA...AAAAAAAAA= + + getfattr --absolute-names --encoding=base64 --name=$name $path | + awk -F= -v name=$name '$1 == name { + print substr($0, index($0, "=") + 1); + }' +} + +test_102n() { # LU-4101 mdt: protect internal xattrs + local file0=$DIR/$tfile.0 + local file1=$DIR/$tfile.1 + local xattr0=$TMP/$tfile.0 + local xattr1=$TMP/$tfile.1 + local name + local value + + if [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.5.50) ] + then + skip "MDT < 2.5.50 allows setxattr on internal trusted xattrs" + return + fi + + rm -rf $file0 $file1 $xattr0 $xattr1 + touch $file0 $file1 + + # Get 'before' xattrs of $file1. + getfattr --absolute-names --dump --match=- $file1 > $xattr0 + + for name in lov lma lmv link fid version som hsm lfsck_namespace; do + # Try to copy xattr from $file0 to $file1. + value=$(getxattr $file0 trusted.$name 2> /dev/null) + + setfattr --name=trusted.$name --value="$value" $file1 || + error "setxattr 'trusted.$name' failed" + + # Try to set a garbage xattr. + value=0sVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIGl0c2VsZi4= + + setfattr --name=trusted.$name --value="$value" $file1 || + error "setxattr 'trusted.$name' failed" + + # Try to remove the xattr from $file1. We don't care if this + # appears to succeed or fail, we just don't want there to be + # any changes or crashes. + setfattr --remove=$trusted.$name $file1 2> /dev/null + done + + # Get 'after' xattrs of file1. + getfattr --absolute-names --dump --match=- $file1 > $xattr1 + + if ! diff $xattr0 $xattr1; then + error "before and after xattrs of '$file1' differ" + fi + + rm -rf $file0 $file1 $xattr0 $xattr1 + + return 0 +} +run_test 102n "silently ignore setxattr on internal trusted xattrs" + +test_102p() { # LU-4703 setxattr did not check ownership + local testfile=$DIR/$tfile + + [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.5.56) ] && + skip "MDS needs to be at least 2.5.56" && return + + touch $testfile + + echo "setfacl as user..." + $RUNAS setfacl -m "u:$RUNAS_ID:rwx" $testfile + [ $? -ne 0 ] || error "setfacl by $RUNAS_ID was allowed on $testfile" + + echo "setfattr as user..." + setfacl -m "u:$RUNAS_ID:---" $testfile + $RUNAS setfattr -x system.posix_acl_access $testfile + [ $? -ne 0 ] || error "setfattr by $RUNAS_ID was allowed on $testfile" +} +run_test 102p "check setxattr(2) correctly fails without permission" + run_acl_subtest() { $LUSTRE/tests/acl/run $LUSTRE/tests/acl/$1.test @@ -6753,14 +6944,17 @@ test_116b() { # LU-2093 [ $PARALLEL == "yes" ] && skip "skip parallel run" && return #define OBD_FAIL_MDS_OSC_CREATE_FAIL 0x147 local old_rr - old_rr=$(do_facet $SINGLEMDS lctl get_param -n lov.*mdtlov*.qos_threshold_rr) - do_facet $SINGLEMDS lctl set_param lov.*mdtlov*.qos_threshold_rr 0 + old_rr=$(do_facet $SINGLEMDS lctl get_param -n \ + lo*.$FSNAME-MDT0000-mdtlov.qos_threshold_rr | head -1) + do_facet $SINGLEMDS lctl set_param \ + lo*.$FSNAME-MDT0000-mdtlov.qos_threshold_rr=0 mkdir -p $DIR/$tdir do_facet $SINGLEMDS lctl set_param fail_loc=0x147 createmany -o $DIR/$tdir/f- 20 || error "can't create" do_facet $SINGLEMDS lctl set_param fail_loc=0 rm -rf $DIR/$tdir - do_facet $SINGLEMDS lctl set_param lov.*mdtlov*.qos_threshold_rr $old_rr + do_facet $SINGLEMDS lctl set_param \ + lo*.$FSNAME-MDT0000-mdtlov.qos_threshold_rr=$old_rr } run_test 116b "QoS shouldn't LBUG if not enough OSTs found on the 2nd pass" @@ -7243,7 +7437,7 @@ run_test 119d "The DIO path should try to send a new rpc once one is completed" test_120a() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - test_mkdir -p $DIR/$tdir + test_mkdir -p $DIR/$tdir [ -z "`lctl get_param -n mdc.*.connect_flags | grep early_lock_cancel`" ] && \ skip "no early lock cancel on server" && return 0 @@ -7253,12 +7447,16 @@ test_120a() { # asynchronous object destroy at MDT could cause bl ast to client cancel_lru_locks osc - stat $DIR/$tdir > /dev/null - can1=`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}'` - test_mkdir $DIR/$tdir/d1 - can2=`lctl get_param -n ldlm.services.ldlm_canceld.stats | awk '/ldlm_cancel/ {print $2}'` - blk2=`lctl get_param -n ldlm.services.ldlm_cbd.stats | awk '/ldlm_bl_callback/ {print $2}'` + stat $DIR/$tdir > /dev/null + can1=$(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}') + test_mkdir -c1 $DIR/$tdir/d1 + can2=$(lctl get_param -n ldlm.services.ldlm_canceld.stats | + awk '/ldlm_cancel/ {print $2}') + blk2=$(lctl get_param -n ldlm.services.ldlm_cbd.stats | + awk '/ldlm_bl_callback/ {print $2}') [ $can1 -eq $can2 ] || error $((can2-can1)) "cancel RPC occured." [ $blk1 -eq $blk2 ] || error $((blk2-blk1)) "blocking RPC occured." lru_resize_enable mdc @@ -7268,8 +7466,8 @@ run_test 120a "Early Lock Cancel: mkdir test" test_120b() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - test_mkdir -p $DIR/$tdir - [ -z "`lctl get_param -n mdc.*.connect_flags | grep early_lock_cancel`" ] && \ + test_mkdir $DIR/$tdir + [ -z "$(lctl get_param -n mdc.*.connect_flags | grep early_lock_cancel)" ] && \ skip "no early lock cancel on server" && return 0 lru_resize_disable mdc lru_resize_disable osc @@ -7289,13 +7487,13 @@ run_test 120b "Early Lock Cancel: create test" test_120c() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - test_mkdir -p $DIR/$tdir - [ -z "`lctl get_param -n mdc.*.connect_flags | grep early_lock_cancel`" ] && \ - skip "no early lock cancel on server" && return 0 + test_mkdir -c1 $DIR/$tdir + [ -z "$(lctl get_param -n mdc.*.connect_flags | grep early_lock_cancel)" ] && \ + skip "no early lock cancel on server" && return 0 lru_resize_disable mdc lru_resize_disable osc - test_mkdir -p $DIR/$tdir/d1 - test_mkdir -p $DIR/$tdir/d2 + test_mkdir -p -c1 $DIR/$tdir/d1 + test_mkdir -p -c1 $DIR/$tdir/d2 touch $DIR/$tdir/d1/f1 cancel_lru_locks mdc stat $DIR/$tdir/d1 $DIR/$tdir/d2 $DIR/$tdir/d1/f1 > /dev/null @@ -7313,9 +7511,9 @@ run_test 120c "Early Lock Cancel: link test" test_120d() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - test_mkdir -p $DIR/$tdir - [ -z "`lctl get_param -n mdc.*.connect_flags | grep early_lock_cancel`" ] && \ - skip "no early lock cancel on server" && return 0 + test_mkdir -p -c1 $DIR/$tdir + [ -z "$(lctl get_param -n mdc.*.connect_flags | grep early_lock_cancel)" ] && \ + skip "no early lock cancel on server" && return 0 lru_resize_disable mdc lru_resize_disable osc touch $DIR/$tdir @@ -7335,7 +7533,7 @@ run_test 120d "Early Lock Cancel: setattr test" test_120e() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - test_mkdir -p $DIR/$tdir + test_mkdir -p -c1 $DIR/$tdir [ -z "`lctl get_param -n mdc.*.connect_flags | grep early_lock_cancel`" ] && \ skip "no early lock cancel on server" && return 0 lru_resize_disable mdc @@ -7365,11 +7563,11 @@ test_120f() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return [ -z "`lctl get_param -n mdc.*.connect_flags | grep early_lock_cancel`" ] && \ skip "no early lock cancel on server" && return 0 - test_mkdir -p $DIR/$tdir + test_mkdir -p -c1 $DIR/$tdir lru_resize_disable mdc lru_resize_disable osc - test_mkdir -p $DIR/$tdir/d1 - test_mkdir -p $DIR/$tdir/d2 + 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 @@ -7856,34 +8054,44 @@ test_129() { return fi remote_mds_nodsh && skip "remote MDS with nodsh" && return - ENOSPC=28 EFBIG=27 + rm -rf $DIR/$tdir test_mkdir -p $DIR/$tdir - MAX=$(stat -c%s "$DIR/$tdir") + # block size of mds1 + local MDT_DEV=$(mdsdevname ${SINGLEMDS//mds/}) + local MDSBLOCKSIZE=$($LCTL get_param -n mdc.*MDT0000*.blocksize) + local MAX=$((MDSBLOCKSIZE * 3)) set_dir_limits $MAX - local I=0 + local I=$(stat -c%s "$DIR/$tdir") local J=0 + local STRIPE_COUNT=1 + [ $MDSCOUNT -ge 2 ] && STRIPE_COUNT=$($LFS getdirstripe -c $DIR/$tdir) + MAX=$((MAX*STRIPE_COUNT)) while [ ! $I -gt $MAX ]; do $MULTIOP $DIR/$tdir/$J Oc rc=$? #check two errors ENOSPC for new version of ext4 max_dir_size patch #mainline kernel commit df981d03eeff7971ac7e6ff37000bfa702327ef1 #and EFBIG for previous versions - if [ $rc -eq $EFBIG -o $rc -eq $ENOSPC ] && [ $I -gt 0 ]; then + if [ $rc -eq $EFBIG -o $rc -eq $ENOSPC ]; then set_dir_limits 0 echo "return code $rc received as expected" - multiop $DIR/$tdir/$J Oc - rc=$? + multiop $DIR/$tdir/$J Oc || + error_exit "multiop failed w/o dir size limit" + I=$(stat -c%s "$DIR/$tdir") - if [ $I -gt $MAX ] && [ $rc -eq 0 ]; then - return 0 + + if [ $(lustre_version_code $SINGLEMDS) -lt \ + $(version_code 2.4.51) ] + then + [ $I -eq $MAX ] && return 0 else - error_exit "return code $rc current dir size $I " \ - "previous limit $MAX" + [ $I -gt $MAX ] && return 0 fi + error_exit "current dir size $I, previous limit $MAX" elif [ $rc -ne 0 ]; then set_dir_limits 0 error_exit "return code $rc received instead of expected " \ @@ -7894,7 +8102,7 @@ test_129() { done set_dir_limits 0 - error "exceeded dir size limit $MAX x $MDSCOUNT $MAX : $I bytes" + error "exceeded dir size limit $MAX($MDSCOUNT) : $I bytes" } run_test 129 "test directory size limit ========================" @@ -8884,8 +9092,10 @@ dot_lustre_fid_permission_check() { rm -f $test_dir/$tfile.1 echo "truncate fid $fid" $TRUNCATE $ffid 777 || error "truncate $ffid failed." - echo "link fid $fid" - ln -f $ffid $test_dir/tfile.lnk || error "link $ffid failed." + if [ $MDSCOUNT -lt 2 ]; then #FIXME when cross-MDT hard link is working + echo "link fid $fid" + ln -f $ffid $test_dir/tfile.lnk || error "link $ffid failed." + fi if [ -n $(lctl get_param -n mdc.*-mdc-*.connect_flags | grep acl) ]; then echo "setfacl fid $fid" setfacl -R -m u:bin:rwx $ffid || error "setfacl $ffid failed." @@ -9036,7 +9246,7 @@ test_154b() { local rc=0 mkdir -p $DIR/$tdir - $LFS mkdir -i $MDTIDX $remote_dir || + $LFS mkdir -i $MDTIDX -c $MDSCOUNT $remote_dir || error "create remote directory failed" cp /etc/hosts $remote_dir/$tfile @@ -9078,6 +9288,39 @@ test_154c() { } run_test 154c "lfs path2fid and fid2path multiple arguments" +test_154d() { + [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.5.53) ]] && + skip "Need MDS version at least 2.5.53" && return + + if remote_mds; then + nid=$($LCTL list_nids | sed "s/\./\\\./g") + else + nid="0@lo" + fi + local proc_ofile="mdt.*.exports.'$nid'.open_files" + local fd + local cmd + + rm -f $DIR/$tfile + touch $DIR/$tfile + + 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 + rc=$? + + cmd="exec $fd>/dev/null" + eval $cmd + if [ $rc -ne 0 ]; then + error "FID $fid not found in open files list $fid_list" + fi +} +run_test 154d "Verify open file fid" + test_155_small_load() { local temp=$TMP/$tfile local file=$DIR/$tfile @@ -9506,14 +9749,14 @@ run_test 160b "Verify that very long rename doesn't crash in changelog" test_161a() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return - test_mkdir -p $DIR/$tdir - cp /etc/hosts $DIR/$tdir/$tfile - test_mkdir $DIR/$tdir/foo1 - test_mkdir $DIR/$tdir/foo2 - ln $DIR/$tdir/$tfile $DIR/$tdir/foo1/sofia - ln $DIR/$tdir/$tfile $DIR/$tdir/foo2/zachary - ln $DIR/$tdir/$tfile $DIR/$tdir/foo1/luna - ln $DIR/$tdir/$tfile $DIR/$tdir/foo2/thor + test_mkdir -p -c1 $DIR/$tdir + cp /etc/hosts $DIR/$tdir/$tfile + test_mkdir -c1 $DIR/$tdir/foo1 + test_mkdir -c1 $DIR/$tdir/foo2 + ln $DIR/$tdir/$tfile $DIR/$tdir/foo1/sofia + ln $DIR/$tdir/$tfile $DIR/$tdir/foo2/zachary + ln $DIR/$tdir/$tfile $DIR/$tdir/foo1/luna + ln $DIR/$tdir/$tfile $DIR/$tdir/foo2/thor local FID=$($LFS path2fid $DIR/$tdir/$tfile | tr -d '[]') if [ "$($LFS fid2path $DIR $FID | wc -l)" != "5" ]; then $LFS fid2path $DIR $FID @@ -9866,6 +10109,15 @@ obdecho_test() { local pages=${3:-64} local rc=0 local id + + local count=10 + local obd_size=$(get_obd_size $node $OBD) + local page_size=$(get_page_size $node) + if [[ -n "$obd_size" ]]; then + local new_count=$((obd_size / (pages * page_size / 1024))) + [[ $new_count -ge $count ]] || count=$new_count + fi + do_facet $node "$LCTL attach echo_client ec ec_uuid" || rc=1 [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec setup $OBD" || rc=2; } @@ -9877,7 +10129,7 @@ obdecho_test() { [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec getattr $id" || rc=4; } [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec " \ - "test_brw 10 w v $pages $id" || rc=4; } + "test_brw $count w v $pages $id" || rc=4; } [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec destroy $id 1" || rc=4; } [ $rc -eq 0 -o $rc -gt 2 ] && { do_facet $node "$LCTL --device ec " \ @@ -10032,7 +10284,7 @@ test_184a() { check_swap_layouts_support && return 0 dir0=$DIR/$tdir/$testnum - test_mkdir -p $dir0 || error "creating dir $dir0" + test_mkdir -p -c1 $dir0 || error "creating dir $dir0" ref1=/etc/passwd ref2=/etc/group file1=$dir0/f1 @@ -10842,7 +11094,7 @@ test_208() { run_test 208 "Exclusive open" test_209() { - [[ $($LCTL get_param -n mdc.*.connect_flags) == ~disp_stripe ]] && + [ -z "$(lctl get_param -n mdc.*.connect_flags | grep disp_stripe)" ] && skip_env "must have disp_stripe" && return touch $DIR/$tfile @@ -11120,6 +11372,10 @@ test_219() { dd if=/dev/zero of=$DIR/$tfile bs=4096 count=1 seek=3 $LCTL set_param fail_loc=0x411 dd if=/dev/zero of=$DIR/$tfile bs=1024 count=1 seek=2 conv=notrunc + + # LU-4201 + dd if=/dev/zero of=$DIR/$tfile-2 bs=1024 count=1 + $CHECKSTAT -s 1024 $DIR/$tfile-2 || error "checkstat wrong size" } run_test 219 "LU-394: Write partial won't cause uncontiguous pages vec at LND" @@ -11537,6 +11793,9 @@ test_228c() { 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 [ $PARALLEL == "yes" ] && skip "skip parallel run" && return [ $OSTCOUNT -lt 2 ] && skip "needs >= 2 OSTs" && return @@ -11594,39 +11853,197 @@ test_230b() { [ $PARALLEL == "yes" ] && skip "skip parallel run" && return [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return local MDTIDX=1 - local remote_dir=$DIR/$tdir/remote_dir - local rc=0 + local mdt_index + local i + local file + local pid + local stripe_count + local migrate_dir=$DIR/$tdir/migrate_dir + local other_dir=$DIR/$tdir/other_dir + + mkdir -p $migrate_dir + mkdir -p $other_dir + for ((i=0; i<10; i++)); do + mkdir -p $migrate_dir/dir_${i} + createmany -o $migrate_dir/dir_${i}/f 10 || + error "create files under remote dir failed $i" + done + + cp /etc/passwd $migrate_dir/$tfile + cp /etc/passwd $other_dir/$tfile + mkdir -p $migrate_dir/dir_default_stripe2 + $LFS setstripe -c 2 $migrate_dir/dir_default_stripe2 + $LFS setstripe -c 2 $migrate_dir/${tfile}_stripe2 + + mkdir -p $other_dir + ln $migrate_dir/$tfile $other_dir/luna + ln $migrate_dir/$tfile $migrate_dir/sofia + ln $other_dir/$tfile $migrate_dir/david + ln -s $migrate_dir/$tfile $other_dir/zachary + ln -s $migrate_dir/$tfile $migrate_dir/${tfile}_ln + ln -s $other_dir/$tfile $migrate_dir/${tfile}_ln_other + + $LFS mv -v -M $MDTIDX $migrate_dir || + error "migrate remote dir error" + + echo "migratate to MDT1, then checking.." + 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 ] || + error "$file is not on MDT${MDTIDX}" + done + done + + # the multiple link file should still in MDT0 + mdt_index=$($LFS getstripe -M $migrate_dir/$tfile) + [ $mdt_index == 0 ] || + error "$file is not on MDT${MDTIDX}" + + diff /etc/passwd $migrate_dir/$tfile || + error "$tfile different after migration" + + diff /etc/passwd $other_dir/luna || + error "luna different after migration" + + diff /etc/passwd $migrate_dir/sofia || + error "sofia different after migration" + + diff /etc/passwd $migrate_dir/david || + error "david different after migration" + + diff /etc/passwd $other_dir/zachary || + error "zachary different after migration" + + diff /etc/passwd $migrate_dir/${tfile}_ln || + error "${tfile}_ln different after migration" + + diff /etc/passwd $migrate_dir/${tfile}_ln_other || + error "${tfile}_ln_other different after migration" + + stripe_count=$($LFS getstripe -c $migrate_dir/dir_default_stripe2) + [ $stripe_count = 2 ] || + 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." + + #migrate back to MDT0 + MDTIDX=0 + $LFS mv -v -M $MDTIDX $migrate_dir || + error "migrate remote dir error" + + echo "migrate back to MDT0, checking.." + for file in $(find $migrate_dir); do + mdt_index=$($LFS getstripe -M $file) + [ $mdt_index == $MDTIDX ] || + error "$file is not on MDT${MDTIDX}" + done + + diff /etc/passwd ${migrate_dir}/$tfile || + error "$tfile different after migration" + + diff /etc/passwd ${other_dir}/luna || + error "luna different after migration" + + diff /etc/passwd ${migrate_dir}/sofia || + error "sofia different after migration" + + diff /etc/passwd ${other_dir}/zachary || + error "zachary different after migration" + + diff /etc/passwd $migrate_dir/${tfile}_ln || + error "${tfile}_ln different after migration" + + diff /etc/passwd $migrate_dir/${tfile}_ln_other || + error "${tfile}_ln_other different after migration" + stripe_count=$($LFS getstripe -c ${migrate_dir}/dir_default_stripe2) + [ $stripe_count = 2 ] || + 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." + + rm -rf $DIR/$tdir || error "rm dir failed after migration" +} +run_test 230b "migrate directory" + +test_230c() { + [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + local MDTIDX=1 + local mdt_index + local file + + #If migrating directory fails in the middle, all entries of + #the directory is still accessiable. mkdir -p $DIR/$tdir - $LFS mkdir -i $MDTIDX $remote_dir || - error "create remote directory failed" + stat $DIR/$tdir + createmany -o $DIR/$tdir/f 10 || + error "create files under ${tdir} 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` + [ "$u" == "$t" ] || error "$u != $t during migration" - $LFS mkdir -i 0 $remote_dir/new_dir && - error "nested remote directory create succeed!" + for file in $(find $DIR/$tdir); do + stat $file || error "stat $file failed" + done - do_facet mds$((MDTIDX + 1)) lctl set_param mdt.*.enable_remote_dir=1 - $LFS mkdir -i 0 $remote_dir/new_dir || rc=$? - do_facet mds$((MDTIDX + 1)) lctl set_param mdt.*.enable_remote_dir=0 + do_facet mds1 lctl set_param fail_loc=0 + do_facet mds1 lctl set_param fail_val=0 - [ $rc -ne 0 ] && - error "create remote directory failed after set enable_remote_dir" + $LFS mv -M $MDTIDX $DIR/$tdir || + error "migrate open files should failed with open files" - rm -rf $remote_dir || error "first unlink remote directory failed" + echo "Finish migration, then checking.." + for file in $(find $DIR/$tdir); do + mdt_index=$($LFS getstripe -M $file) + [ $mdt_index == $MDTIDX ] || + error "$file is not on MDT${MDTIDX}" + done - $RUNAS -G$RUNAS_GID $LFS mkdir -i $MDTIDX $DIR/$tfile && - error "chown worked" + rm -rf $DIR/$tdir || error "rm dir failed after migration" +} +run_test 230c "check directory accessiblity if migration is failed" - do_facet mds$MDTIDX lctl set_param \ - mdt.*.enable_remote_dir_gid=$RUNAS_GID - $LFS mkdir -i $MDTIDX $remote_dir || rc=$? - do_facet mds$MDTIDX lctl set_param mdt.*.enable_remote_dir_gid=0 +test_230d() { + [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + local MDTIDX=1 + local mdt_index + local i + local j - [ $rc -ne 0 ] && - error "create remote dir failed after set enable_remote_dir_gid" + mkdir -p $DIR/$tdir + + for ((i=0; i<100; i++)); do + mkdir -p $DIR/$tdir/dir_${i} + createmany -o $DIR/$tdir/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" - rm -r $DIR/$tdir || error "second unlink remote directory failed" + echo "Finish migration, then checking.." + for file in $(find $DIR/$tdir); do + mdt_index=$($LFS getstripe -M $file) + [ $mdt_index == $MDTIDX ] || + error "$file is not on MDT${MDTIDX}" + done + + rm -rf $DIR/$tdir || error "rm dir failed after migration" } -run_test 230b "nested remote directory should be failed" +run_test 230d "check migrate big directory" test_231a() { @@ -11692,7 +12109,7 @@ test_232() { } run_test 232 "failed lock should not block umount" -test_233() { +test_233a() { [ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.3.64) ] || { skip "Need MDS version at least 2.3.64"; return; } @@ -11700,7 +12117,21 @@ test_233() { stat $MOUNT/.lustre/fid/$fid > /dev/null || error "cannot access $MOUNT using its FID '$fid'" } -run_test 233 "checking that OBF of the FS root succeeds" +run_test 233a "checking that OBF of the FS root succeeds" + +test_233b() { + [ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.5.90) ] || + { skip "Need MDS version at least 2.5.90"; return; } + + local fid=$($LFS path2fid $MOUNT/.lustre) + stat $MOUNT/.lustre/fid/$fid > /dev/null || + error "cannot access $MOUNT/.lustre using its FID '$fid'" + + fid=$($LFS path2fid $MOUNT/.lustre/fid) + stat $MOUNT/.lustre/fid/$fid > /dev/null || + error "cannot access $MOUNT/.lustre/fid using its FID '$fid'" +} +run_test 233b "checking that OBF of the FS .lustre succeeds" test_234() { local p="$TMP/sanityN-$TESTNAME.parameters" @@ -11745,7 +12176,7 @@ run_test 235 "LU-1715: flock deadlock detection does not work properly" #LU-2935 test_236() { check_swap_layouts_support && return 0 - test_mkdir -p $DIR/$tdir || error "mkdir $tdir failed" + test_mkdir -p -c1 $DIR/$tdir || error "mkdir $tdir failed" local ref1=/etc/passwd local ref2=/etc/group @@ -11756,11 +12187,14 @@ test_236() { cp $ref1 $file1 || error "cp $ref1 $file1 failed: rc = $?" $SETSTRIPE -c 2 $file2 || error "cannot setstripe on '$file2': rc = $?" cp $ref2 $file2 || error "cp $ref2 $file2 failed: rc = $?" - exec {FD}<>$file2 + local fd=$(free_fd) + local cmd="exec $fd<>$file2" + eval $cmd rm $file2 - $LFS swap_layouts $file1 /proc/self/fd/${FD} || - error "cannot swap layouts of '$file1' and /proc/self/fd/${FD}" - exec {FD}>&- + $LFS swap_layouts $file1 /proc/self/fd/${fd} || + error "cannot swap layouts of '$file1' and /proc/self/fd/${fd}" + cmd="exec $fd>&-" + eval $cmd cmp $ref2 $file1 || error "content compare failed ($ref2 != $file1)" #cleanup @@ -11768,6 +12202,247 @@ test_236() { } run_test 236 "Layout swap on open unlinked file" +# test to verify file handle related system calls +# (name_to_handle_at/open_by_handle_at) +# The new system calls are supported in glibc >= 2.14. + +test_237() { + echo "Test file_handle syscalls" > $DIR/$tfile + check_fhandle_syscalls $DIR/$tfile || + error "check_fhandle_syscalls failed" +} +run_test 237 "Verify name_to_handle_at/open_by_handle_at syscalls" + +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 || + error "set striped dir error" + + stripe_count=$($LFS getdirstripe -c $DIR/$tdir/striped_dir) + if [ "$stripe_count" != "2" ]; then + error "stripe_count is $stripe_count, expect 2" + fi + + stripe_index=$($LFS getdirstripe -i $DIR/$tdir/striped_dir) + if [ "$stripe_index" != "$mdt_index" ]; then + error "stripe_index is $stripe_index, expect $mdt_index" + fi + + [ $(stat -c%h $DIR/$tdir/striped_dir) == '2' ] || + error "nlink error after create striped dir" + + mkdir $DIR/$tdir/striped_dir/a + mkdir $DIR/$tdir/striped_dir/b + + stat $DIR/$tdir/striped_dir/a || + error "create dir under striped dir failed" + stat $DIR/$tdir/striped_dir/b || + error "create dir under striped dir failed" + + [ $(stat -c%h $DIR/$tdir/striped_dir) == '4' ] || + error "nlink error after mkdir" + + rmdir $DIR/$tdir/striped_dir/a + [ $(stat -c%h $DIR/$tdir/striped_dir) == '3' ] || + error "nlink error after rmdir" + + rmdir $DIR/$tdir/striped_dir/b + [ $(stat -c%h $DIR/$tdir/striped_dir) == '2' ] || + error "nlink error after rmdir" + + rmdir $DIR/$tdir/striped_dir || + error "rmdir striped dir error" + true +} + +test_300a() { + [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + + test_striped_dir 0 || error "failed on striped dir on MDT0" + test_striped_dir 1 || error "failed on striped dir on MDT0" +} +run_test 300a "basic striped dir sanity test" + +test_300b() { + [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + local i + local mtime1 + local mtime2 + local mtime3 + + test_mkdir $DIR/$tdir || error "mkdir fail" + $LFS setdirstripe -i 0 -c 2 -t all_char $DIR/$tdir/striped_dir || + error "set striped dir error" + for ((i=0; i<10; i++)); do + mtime1=$(stat -c %Y $DIR/$tdir/striped_dir) + sleep 1 + touch $DIR/$tdir/striped_dir/file_$i || + error "touch error $i" + mtime2=$(stat -c %Y $DIR/$tdir/striped_dir) + [ $mtime1 -eq $mtime2 ] && + error "mtime not change after create" + sleep 1 + rm -f $DIR/$tdir/striped_dir/file_$i || + error "unlink error $i" + mtime3=$(stat -c %Y $DIR/$tdir/striped_dir) + [ $mtime2 -eq $mtime3 ] && + error "mtime did not change after unlink" + done + true +} +run_test 300b "check ctime/mtime for striped dir" + +test_300c() { + [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + local file_count + + mkdir -p $DIR/$tdir + $LFS setdirstripe -i 0 -c 2 $DIR/$tdir/striped_dir || + error "set striped dir error" + + chown $RUNAS_ID:$RUNAS_GID $DIR/$tdir/striped_dir || + error "chown striped dir failed" + + $RUNAS createmany -o $DIR/$tdir/striped_dir/f 5000 || + error "create 5k files failed" + + file_count=$(ls $DIR/$tdir/striped_dir | wc -l) + + [ "$file_count" = 5000 ] || error "file count $file_count != 5000" + + rm -rf $DIR/$tdir +} +run_test 300c "chown && check ls under striped directory" + +test_300d() { + [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + local stripe_count + local file + + mkdir -p $DIR/$tdir + $SETSTRIPE -c 2 $DIR/$tdir + + #local striped directory + $LFS setdirstripe -i 0 -c 2 -t all_char $DIR/$tdir/striped_dir || + error "set striped dir error" + createmany -o $DIR/$tdir/striped_dir/f 10 || + error "create 10 files failed" + + #remote striped directory + $LFS setdirstripe -i 1 -c 2 $DIR/$tdir/remote_striped_dir || + error "set striped dir error" + createmany -o $DIR/$tdir/remote_striped_dir/f 10 || + error "create 10 files failed" + + for file in $(find $DIR/$tdir); do + stripe_count=$($GETSTRIPE -c $file) + [ $stripe_count -eq 2 ] || + error "wrong stripe $stripe_count for $file" + done + + rm -rf $DIR/$tdir +} +run_test 300d "check default stripe under striped directory" + +test_300e() { + [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + local stripe_count + local file + + mkdir -p $DIR/$tdir + + $LFS setdirstripe -i 0 -c 2 -t all_char $DIR/$tdir/striped_dir || + error "set striped dir error" + + touch $DIR/$tdir/striped_dir/a + touch $DIR/$tdir/striped_dir/b + touch $DIR/$tdir/striped_dir/c + + mkdir $DIR/$tdir/striped_dir/dir_a + mkdir $DIR/$tdir/striped_dir/dir_b + mkdir $DIR/$tdir/striped_dir/dir_c + + $LFS setdirstripe -i 0 -c 2 -t all_char $DIR/$tdir/striped_dir/stp_a || + error "set striped dir under striped dir error" + + $LFS setdirstripe -i 0 -c 2 -t all_char $DIR/$tdir/striped_dir/stp_b || + error "set striped dir under striped dir error" + + $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/stp_a $DIR/$tdir/striped_dir/stp_b && + error "rename dir under different stripes should fail" + + 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 || + error "rename dir under striped dir should succeed" + + rm -rf $DIR/$tdir +} +run_test 300e "check rename under striped directory" + +test_300f() { + [ $PARALLEL == "yes" ] && skip "skip parallel run" && return + [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return + local stripe_count + local file + + rm -rf $DIR/$tdir + mkdir -p $DIR/$tdir + + $LFS setdirstripe -i 0 -c 2 -t all_char $DIR/$tdir/striped_dir || + error "set striped dir error" + + $LFS setdirstripe -i 0 -c 2 -t all_char $DIR/$tdir/striped_dir1 || + error "set striped dir error" + + touch $DIR/$tdir/striped_dir/a + mkdir $DIR/$tdir/striped_dir/dir_a + $LFS setdirstripe -i 0 -c 2 $DIR/$tdir/striped_dir/stp_a || + error "create striped dir under striped dir fails" + + touch $DIR/$tdir/striped_dir1/b + mkdir $DIR/$tdir/striped_dir1/dir_b + $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 && + error "rename dir under different striped dir should fail" + + 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" + # # tests that do cleanup/setup should be run at the end # @@ -11787,6 +12462,7 @@ test_900() { run_test 900 "umount should not race with any mgc requeue thread" complete $SECONDS +[ -f $EXT2_DEV ] && rm $EXT2_DEV || true check_and_cleanup_lustre if [ "$I_MOUNTED" != "yes" ]; then lctl set_param debug="$OLDDEBUG" 2> /dev/null || true