X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Ftests%2Fsanityn.sh;h=7ecfa9de7adf05caf0a154be8e808964471b5d63;hb=5700f5bc3c5bb0e65ca84f34c7b642066d8489e2;hp=35d9d3c834d4833dd040d89934203240e20b9bb6;hpb=e4cf956f93a4384d19ea73e601a6651710703492;p=fs%2Flustre-release.git diff --git a/lustre/tests/sanityn.sh b/lustre/tests/sanityn.sh index 35d9d3c..7ecfa9d 100644 --- a/lustre/tests/sanityn.sh +++ b/lustre/tests/sanityn.sh @@ -26,7 +26,6 @@ SETSTRIPE=${SETSTRIPE:-lstripe} MCREATE=${MCREATE:-mcreate} OPENFILE=${OPENFILE:-openfile} OPENUNLINK=${OPENUNLINK:-openunlink} -TRUNCATE=${TRUNCATE:-truncate} export TMP=${TMP:-/tmp} MOUNT_2=${MOUNT_2:-"yes"} CHECK_GRANT=${CHECK_GRANT:-"yes"} @@ -65,7 +64,7 @@ rm -rf $DIR1/[df][0-9]* $DIR1/lnk # $RUNAS_ID may get set incorrectly somewhere else [ $UID -eq 0 -a $RUNAS_ID -eq 0 ] && error "\$RUNAS_ID set to 0, but \$UID is also 0!" -check_runas_id $RUNAS_ID $RUNAS_ID $RUNAS +check_runas_id $RUNAS_ID $RUNAS_GID $RUNAS build_test_filter @@ -148,7 +147,7 @@ run_test 4 "fstat validation on multiple mount points ==========" test_5() { mcreate $DIR1/f5 - truncate $DIR2/f5 100 + $TRUNCATE $DIR2/f5 100 $CHECKSTAT -t file -s 100 $DIR1/f5 || error rm $DIR1/f5 } @@ -208,13 +207,13 @@ test_10b() { yes "R" | head -c 4000 >$TMP/f10b-seed dd if=$TMP/f10b-seed of=$DIR1/f10b bs=3k count=1 || error "dd $DIR1" - truncate $DIR1/f10b 4096 || error "truncate 4096" + $TRUNCATE $DIR1/f10b 4096 || error "truncate 4096" dd if=$DIR2/f10b of=$TMP/f10b-lustre bs=4k count=1 || error "dd $DIR2" # create a test file locally to compare dd if=$TMP/f10b-seed of=$TMP/f10b bs=3k count=1 || error "dd random" - truncate $TMP/f10b 4096 || error "truncate 4096" + $TRUNCATE $TMP/f10b 4096 || error "truncate 4096" cmp $TMP/f10b $TMP/f10b-lustre || error "file miscompare" rm $TMP/f10b $TMP/f10b-lustre $TMP/f10b-seed } @@ -284,7 +283,7 @@ test_14b() { # bug 3192, 7040 cp -p `which multiop` $DIR1/d14/multiop || error "cp failed" MULTIOP_PROG=$DIR1/d14/multiop multiop_bg_pause $TMP/test14.junk O_c || return 1 MULTIOP_PID=$! - truncate $DIR2/d14/multiop 0 && kill -9 $MULTIOP_PID && \ + $TRUNCATE $DIR2/d14/multiop 0 && kill -9 $MULTIOP_PID && \ error "expected truncate error, got success" kill -USR1 $MULTIOP_PID || return 2 wait $MULTIOP_PID || return 3 @@ -439,7 +438,7 @@ test_23() { # Bug 5972 } run_test 23 " others should see updated atime while another read====" -test_24() { +test_24a() { touch $DIR1/$tfile lfs df || error "lfs df failed" lfs df -ih || error "lfs df -ih failed" @@ -455,7 +454,14 @@ test_24() { lctl --device %$OSC recover lfs df || error "lfs df with reactivated OSC failed" } -run_test 24 "lfs df [-ih] [path] test =========================" +run_test 24a "lfs df [-ih] [path] test =========================" + +test_24b() { + touch $DIR1/$tfile + fsnum=`lfs df | grep -c "filesystem summary:"` + [ $fsnum -eq 2 ] || error "lfs df shows $fsnum != 2 filesystems." +} +run_test 24b "lfs df should show both filesystems ===============" test_25() { [ `lctl get_param -n mdc.*-mdc-*.connect_flags | grep -c acl` -lt 2 ] && \ @@ -466,13 +472,13 @@ test_25() { chmod 0755 $DIR1/$tdir/f1 || error "chmod 0755 $DIR1/$tdir/f1" $RUNAS $CHECKSTAT $DIR2/$tdir/f1 || error "checkstat $DIR2/$tdir/f1 #1" - setfacl -m u:$RUNAS_ID:--- $DIR1/$tdir || error "setfacl $DIR2/$tdir #1" + setfacl -m u:$RUNAS_ID:--- -m g:$RUNAS_GID:--- $DIR1/$tdir || error "setfacl $DIR2/$tdir #1" $RUNAS $CHECKSTAT $DIR2/$tdir/f1 && error "checkstat $DIR2/$tdir/f1 #2" - setfacl -m u:$RUNAS_ID:r-x $DIR1/$tdir || error "setfacl $DIR2/$tdir #2" + setfacl -m u:$RUNAS_ID:r-x -m g:$RUNAS_GID:r-x $DIR1/$tdir || error "setfacl $DIR2/$tdir #2" $RUNAS $CHECKSTAT $DIR2/$tdir/f1 || error "checkstat $DIR2/$tdir/f1 #3" - setfacl -m u:$RUNAS_ID:--- $DIR1/$tdir || error "setfacl $DIR2/$tdir #3" + setfacl -m u:$RUNAS_ID:--- -m g:$RUNAS_GID:--- $DIR1/$tdir || error "setfacl $DIR2/$tdir #3" $RUNAS $CHECKSTAT $DIR2/$tdir/f1 && error "checkstat $DIR2/$tdir/f1 #4" - setfacl -x u:$RUNAS_ID: $DIR1/$tdir || error "setfacl $DIR2/$tdir #4" + setfacl -x u:$RUNAS_ID: -x g:$RUNAS_GID: $DIR1/$tdir || error "setfacl $DIR2/$tdir #4" $RUNAS $CHECKSTAT $DIR2/$tdir/f1 || error "checkstat $DIR2/$tdir/f1 #5" rm -rf $DIR1/$tdir @@ -766,13 +772,22 @@ run_test 33a "commit on sharing, cross crete/delete, 2 clients, benchmark" # End commit on sharing tests +get_ost_lock_timeouts() { + local nodes=${1:-$(comma_list $(osts_nodes))} + + local locks=$(do_nodes $nodes \ + "lctl get_param -n ldlm.namespaces.filter-*.lock_timeouts" | calc_sum) + + echo $locks +} + test_34() { #16129 local OPER local lock_in local lock_out for OPER in notimeout timeout ; do rm $DIR1/$tfile 2>/dev/null - lock_in=$(do_nodes $(osts_nodes) "lctl get_param -n ldlm.namespaces.filter-*.lock_timeouts" | calc_sum) + lock_in=$(get_ost_lock_timeouts) if [ $OPER == "timeout" ] ; then for j in `seq $OSTCOUNT`; do #define OBD_FAIL_PTLRPC_HPREQ_TIMEOUT 0x511 @@ -793,7 +808,7 @@ test_34() { #16129 dd of=/dev/null if=$DIR2/$tfile > /dev/null 2>&1 # wait for a lock timeout sleep 4 - lock_out=$(do_nodes $(osts_nodes) "lctl get_param -n ldlm.namespaces.filter-*.lock_timeouts" | calc_sum) + lock_out=$(get_ost_lock_timeouts) if [ $OPER == "timeout" ] ; then if [ $lock_in == $lock_out ]; then error "no lock timeout happened" @@ -918,6 +933,943 @@ test_37() { # bug 18695 } run_test 37 "check i_size is not updated for directory on close (bug 18695) ==============" +# this should be set to past +TEST_39_MTIME=`date -d "1 year ago" +%s` + +# bug 11063 +test_39a() { + local client1=${CLIENT1:-`hostname`} + local client2=${CLIENT2:-`hostname`} + + do_node $client1 "touch $DIR1/$tfile" + + do_node $client1 "touch -m -d @$TEST_39_MTIME $DIR1/$tfile" + local mtime1=`do_node $client2 "stat -c %Y $DIR1/$tfile"` + [ "$mtime1" = $TEST_39_MTIME ] || \ + error "mtime is not set to past: $mtime1, should be $TEST_39_MTIME" + + local d1=`do_node $client1 date +%s` + do_node $client1 'echo hello >> '$DIR1/$tfile + local d2=`do_node $client1 date +%s` + + local mtime2=`do_node $client2 "stat -c %Y $DIR1/$tfile"` + [ "$mtime2" -ge "$d1" ] && [ "$mtime2" -le "$d2" ] || \ + error "mtime is not updated on write: $d1 <= $mtime2 <= $d2" + + do_node $client1 "mv $DIR1/$tfile $DIR1/$tfile-1" + + for (( i=0; i < 2; i++ )) ; do + local mtime3=`do_node $client2 "stat -c %Y $DIR1/$tfile-1"` + [ "$mtime2" = "$mtime3" ] || \ + error "mtime ($mtime2) changed (to $mtime3) on rename" + + cancel_lru_locks osc + if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi + done +} +run_test 39a "test from 11063 ==================================" + +test_39b() { + local client1=${CLIENT1:-`hostname`} + local client2=${CLIENT2:-`hostname`} + + touch $DIR1/$tfile + + local mtime1=`stat -c %Y $DIR1/$tfile` + local mtime2=`do_node $client2 "stat -c %Y $DIR1/$tfile"` + + sleep 1 + touch -m -d @$TEST_39_MTIME $DIR1/$tfile + + for (( i=0; i < 2; i++ )) ; do + local mtime3=`stat -c %Y $DIR1/$tfile` + local mtime4=`do_node $client2 "stat -c %Y $DIR1/$tfile"` + + [ "$mtime3" = "$mtime4" ] || \ + error "different mtime on clients: $mtime3, $mtime4" + [ "$mtime3" = $TEST_39_MTIME ] || \ + error "lost mtime: $mtime3, should be $TEST_39_MTIME" + + cancel_lru_locks osc + if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi + done +} +run_test 39b "11063 problem 1 ==================================" + +test_39c() { + local client1=${CLIENT1:-`hostname`} + local client2=${CLIENT2:-`hostname`} + + echo hello > $DIR1/$tfile + + local mtime1=`stat -c %Y $DIR1/$tfile` + local mtime2=`do_node $client2 "stat -c %Y $DIR1/$tfile"` + [ "$mtime1" = "$mtime2" ] || \ + error "create: different mtime on clients: $mtime1, $mtime2" + + sleep 1 + $TRUNCATE $DIR1/$tfile 1 + + for (( i=0; i < 2; i++ )) ; do + local mtime3=`stat -c %Y $DIR1/$tfile` + local mtime4=`do_node $client2 "stat -c %Y $DIR1/$tfile"` + + [ "$mtime3" = "$mtime4" ] || \ + error "different mtime on clients: $mtime3, $mtime4" + [ "$mtime3" -gt $mtime2 ] || \ + error "truncate did not update mtime: $mtime2, $mtime3" + + cancel_lru_locks osc + if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi + done +} +run_test 39c "check truncate mtime update ======================" + +# check that pid exists hence second operation wasn't blocked by first one +# if it is so then there is no conflict, return 0 +# else second operation is conflicting with first one, return 1 +check_pdo_conflict() { + local pid=$1 + local conflict=0 + if [[ `ps --pid $pid | wc -l` == 1 ]]; then + conflict=1 + echo "Conflict" + else + echo "No conflict" + fi + return $conflict +} + +# pdirop tests +# test 40: check non-blocking operations +test_40a() { +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145 + mkdir $DIR1/$tfile & + PID1=$! + sleep 1 + touch $DIR2/$tfile-2 + check_pdo_conflict $PID1 || error "create is blocked" + mkdir $DIR2/$tfile-3 + check_pdo_conflict $PID1 || error "mkdir is blocked" + link $DIR2/$tfile-2 $DIR2/$tfile-4 + check_pdo_conflict $PID1 || error "link is blocked" + mv $DIR2/$tfile-2 $DIR2/$tfile-5 + check_pdo_conflict $PID1 || error "rename is blocked" + stat $DIR2/$tfile-3 $DIR2/$tfile-4 > /dev/null + check_pdo_conflict $PID1 || error "getattr is blocked" + rm $DIR2/$tfile-4 $DIR2/$tfile-5 + rmdir $DIR2/$tfile-3 + check_pdo_conflict $PID1 || error "unlink is blocked" + # all operations above shouldn't wait the first one + check_pdo_conflict $PID1 || error "parallel operation is blocked" + wait $PID1 + rm -r $DIR1/* + return 0 +} +run_test 40a "pdirops: create vs others ==============" + +test_40b() { +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145 + touch $DIR1/$tfile & + PID1=$! + sleep 1 + # open|create + touch $DIR2/$tfile-2 + check_pdo_conflict $PID1 || error "create is blocked" + mkdir $DIR2/$tfile-3 + check_pdo_conflict $PID1 || error "mkdir is blocked" + link $DIR2/$tfile-2 $DIR2/$tfile-4 + check_pdo_conflict $PID1 || error "link is blocked" + mv $DIR2/$tfile-2 $DIR2/$tfile-5 + check_pdo_conflict $PID1 || error "rename is blocked" + stat $DIR2/$tfile-3 $DIR2/$tfile-4 > /dev/null + check_pdo_conflict $PID1 || error "getattr is blocked" + rm $DIR2/$tfile-4 $DIR2/$tfile-5 + rmdir $DIR2/$tfile-3 + check_pdo_conflict $PID1 || error "unlink is blocked" + # all operations above shouldn't wait the first one + check_pdo_conflict $PID1 || error "parallel operation is blocked" + wait $PID1 + rm -r $DIR1/* + return 0 +} +run_test 40b "pdirops: open|create and others ==============" + +test_40c() { + touch $DIR1/$tfile +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145 + link $DIR1/$tfile $DIR1/$tfile-0 & + PID1=$! + sleep 1 + # open|create + touch $DIR2/$tfile-2 + check_pdo_conflict $PID1 || error "create is blocked" + mkdir $DIR2/$tfile-3 + check_pdo_conflict $PID1 || error "mkdir is blocked" + link $DIR2/$tfile-2 $DIR2/$tfile-4 + check_pdo_conflict $PID1 || error "link is blocked" + mv $DIR2/$tfile-2 $DIR2/$tfile-5 + check_pdo_conflict $PID1 || error "rename is blocked" + stat $DIR2/$tfile-3 $DIR2/$tfile-4 > /dev/null + check_pdo_conflict $PID1 || error "getattr is blocked" + rm $DIR2/$tfile-4 $DIR2/$tfile-5 + rmdir $DIR2/$tfile-3 + check_pdo_conflict $PID1 || error "unlink is blocked" + # all operations above shouldn't wait the first one + check_pdo_conflict $PID1 || error "parallel operation is blocked" + wait $PID1 + rm -r $DIR1/* + return 0 +} +run_test 40c "pdirops: link and others ==============" + +test_40d() { + touch $DIR1/$tfile +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145 + rm $DIR1/$tfile & + PID1=$! + sleep 1 + # open|create + touch $DIR2/$tfile-2 + check_pdo_conflict $PID1 || error "create is blocked" + mkdir $DIR2/$tfile-3 + check_pdo_conflict $PID1 || error "mkdir is blocked" + link $DIR2/$tfile-2 $DIR2/$tfile-4 + check_pdo_conflict $PID1 || error "link is blocked" + mv $DIR2/$tfile-2 $DIR2/$tfile-5 + check_pdo_conflict $PID1 || error "rename is blocked" + stat $DIR2/$tfile-3 $DIR2/$tfile-4 > /dev/null + check_pdo_conflict $PID1 || error "getattr is blocked" + rm $DIR2/$tfile-4 $DIR2/$tfile-5 + rmdir $DIR2/$tfile-3 + check_pdo_conflict $PID1 || error "unlink is blocked" + # all operations above shouldn't wait the first one + check_pdo_conflict $PID1 || error "parallel operation is blocked" + wait $PID1 + return 0 +} +run_test 40d "pdirops: unlink and others ==============" + +test_40e() { + touch $DIR1/$tfile +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145 + mv $DIR1/$tfile $DIR1/$tfile-0 & + PID1=$! + sleep 1 + # open|create + touch $DIR2/$tfile-2 + check_pdo_conflict $PID1 || error "create is blocked" + mkdir $DIR2/$tfile-3 + check_pdo_conflict $PID1 || error "mkdir is blocked" + link $DIR2/$tfile-2 $DIR2/$tfile-4 + check_pdo_conflict $PID1 || error "link is blocked" + stat $DIR2/$tfile-3 $DIR2/$tfile-4 > /dev/null + check_pdo_conflict $PID1 || error "getattr is blocked" + rm $DIR2/$tfile-4 $DIR2/$tfile-2 + rmdir $DIR2/$tfile-3 + check_pdo_conflict $PID1 || error "unlink is blocked" + # all operations above shouldn't wait the first one + check_pdo_conflict $PID1 || error "parallel operation is blocked" + wait $PID1 + rm -r $DIR1/* + return 0 +} +run_test 40e "pdirops: rename and others ==============" + +# test 41: create blocking operations +test_41a() { +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145 + multiop $DIR1/$tfile oO_CREAT:O_RDWR:c & + PID1=$! + sleep 1 + mkdir $DIR2/$tfile && error "mkdir must fail" + check_pdo_conflict $PID1 && { wait $PID1; echo "mkdir isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 41a "pdirops: create vs mkdir ==============" + +test_41b() { +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145 + multiop $DIR1/$tfile oO_CREAT:O_RDWR:c & + PID1=$! + sleep 1 + multiop $DIR2/$tfile oO_CREAT:O_EXCL:c && error "create must fail" + check_pdo_conflict $PID1 && { wait $PID1; error "create isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 41b "pdirops: create vs create ==============" + +test_41c() { + touch $DIR1/$tfile-2 +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145 + multiop $DIR1/$tfile oO_CREAT:O_RDWR:c & + PID1=$! + sleep 1 + link $DIR2/$tfile-2 $DIR2/$tfile && error "link must fail" + check_pdo_conflict $PID1 && { wait $PID1; error "link isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 41c "pdirops: create vs link ==============" + +test_41d() { +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145 + multiop $DIR1/$tfile oO_CREAT:O_RDWR:c & + PID1=$! + sleep 1 + rm $DIR2/$tfile || error "unlink must succeed" + check_pdo_conflict $PID1 && { wait $PID1; error "unlink isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 41d "pdirops: create vs unlink ==============" + +test_41e() { + touch $DIR1/$tfile-2 +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145 + multiop $DIR1/$tfile oO_CREAT:O_RDWR:c & + PID1=$! + sleep 1 + mv $DIR2/$tfile-2 $DIR2/$tfile || error "rename must succeed" + check_pdo_conflict $PID1 && { wait $PID1; error "rename isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 41e "pdirops: create and rename (tgt) ==============" + +test_41f() { +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145 + multiop $DIR1/$tfile oO_CREAT:O_RDWR:c & + PID1=$! + sleep 1 + mv $DIR2/$tfile $DIR2/$tfile-2 || error "rename must succeed" + check_pdo_conflict $PID1 && { wait $PID1; error "rename isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 41f "pdirops: create and rename (src) ==============" + +test_41g() { +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145 + multiop $DIR1/$tfile oO_CREAT:O_RDWR:c & + PID1=$! + sleep 1 + stat $DIR2/$tfile > /dev/null || error "stat must succeed" + check_pdo_conflict $PID1 && { wait $PID1; error "getattr isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 41g "pdirops: create vs getattr ==============" + +test_41h() { +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145 + multiop $DIR1/$tfile oO_CREAT:O_RDWR:c & + PID1=$! + sleep 1 + ls -lia $DIR2/ > /dev/null + check_pdo_conflict $PID1 && { wait $PID1; error "readdir isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 41h "pdirops: create vs readdir ==============" + +# test 42: unlink and blocking operations +test_42a() { +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145 + mkdir $DIR1/$tfile & + PID1=$! + sleep 1 + mkdir $DIR2/$tfile && error "mkdir must fail" + check_pdo_conflict $PID1 && { wait $PID1; error "mkdir isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 42a "pdirops: mkdir vs mkdir ==============" + +test_42b() { +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145 + mkdir $DIR1/$tfile & + PID1=$! + sleep 1 + multiop $DIR2/$tfile oO_CREAT:O_EXCL:c && error "create must fail" + check_pdo_conflict $PID1 && { wait $PID1; error "create isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 42b "pdirops: mkdir vs create ==============" + +test_42c() { + touch $DIR1/$tfile-2 +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145 + mkdir $DIR1/$tfile & + PID1=$! + sleep 1 + link $DIR2/$tfile-2 $DIR2/$tfile && error "link must fail" + check_pdo_conflict $PID1 && { wait $PID1; error "link isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 42c "pdirops: mkdir vs link ==============" + +test_42d() { +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145 + mkdir $DIR1/$tfile & + PID1=$! + sleep 1 + rmdir $DIR2/$tfile || error "unlink must succeed" + check_pdo_conflict $PID1 && { wait $PID1; error "unlink isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 42d "pdirops: mkdir vs unlink ==============" + +test_42e() { + touch $DIR1/$tfile-2 +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145 + mkdir $DIR1/$tfile & + PID1=$! + sleep 1 + mv -T $DIR2/$tfile-2 $DIR2/$tfile && error "rename must fail" + check_pdo_conflict $PID1 && { wait $PID1; error "rename isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 42e "pdirops: mkdir and rename (tgt) ==============" + +test_42f() { +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145 + mkdir $DIR1/$tfile & + PID1=$! + sleep 1 + mv $DIR2/$tfile $DIR2/$tfile-2 || error "rename must succeed" + check_pdo_conflict $PID1 && { wait $PID1; error "rename isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 42f "pdirops: mkdir and rename (src) ==============" + +test_42g() { +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145 + mkdir $DIR1/$tfile & + PID1=$! + sleep 1 + stat $DIR2/$tfile > /dev/null || error "stat must succeed" + check_pdo_conflict $PID1 && { wait $PID1; error "getattr isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 42g "pdirops: mkdir vs getattr ==============" + +test_42h() { +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145 + mkdir $DIR1/$tfile & + PID1=$! + sleep 1 + ls -lia $DIR2/ > /dev/null + check_pdo_conflict $PID1 && { wait $PID1; error "readdir isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 42h "pdirops: mkdir vs readdir ==============" + +# test 43: unlink and blocking operations +test_43a() { + touch $DIR1/$tfile +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145 + rm $DIR1/$tfile & + PID1=$! + sleep 1 + mkdir $DIR2/$tfile || error "mkdir must succeed" + check_pdo_conflict $PID1 && { wait $PID1; error "mkdir isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 43a "pdirops: unlink vs mkdir ==============" + +test_43b() { + touch $DIR1/$tfile +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145 + rm $DIR1/$tfile & + PID1=$! + sleep 1 + multiop $DIR2/$tfile oO_CREAT:O_EXCL:c || error "create must succeed" + check_pdo_conflict $PID1 && { wait $PID1; error "create isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 43b "pdirops: unlink vs create ==============" + +test_43c() { + touch $DIR1/$tfile + touch $DIR1/$tfile-2 +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145 + rm $DIR1/$tfile & + PID1=$! + sleep 1 + link $DIR2/$tfile-2 $DIR2/$tfile || error "link must succeed" + check_pdo_conflict $PID1 && { wait $PID1; error "link isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 43c "pdirops: unlink vs link ==============" + +test_43d() { + touch $DIR1/$tfile +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145 + rm $DIR1/$tfile & + PID1=$! + sleep 1 + rm $DIR2/$tfile && error "unlink must fail" + check_pdo_conflict $PID1 && { wait $PID1; error "unlink isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 43d "pdirops: unlink vs unlink ==============" + +test_43e() { + touch $DIR1/$tfile + touch $DIR1/$tfile-2 +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145 + rm $DIR1/$tfile & + PID1=$! + sleep 1 + mv -u $DIR2/$tfile-2 $DIR2/$tfile || error "rename must succeed" + check_pdo_conflict $PID1 && { wait $PID1; error "rename isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 43e "pdirops: unlink and rename (tgt) ==============" + +test_43f() { + touch $DIR1/$tfile +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145 + rm $DIR1/$tfile & + PID1=$! + sleep 1 + mv $DIR2/$tfile $DIR2/$tfile-2 && error "rename must fail" + check_pdo_conflict $PID1 && { wait $PID1; error "rename isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 43f "pdirops: unlink and rename (src) ==============" + +test_43g() { + touch $DIR1/$tfile +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145 + rm $DIR1/$tfile & + PID1=$! + sleep 1 + stat $DIR2/$tfile > /dev/null && error "stat must fail" + check_pdo_conflict $PID1 && { wait $PID1; error "getattr isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 43g "pdirops: unlink vs getattr ==============" + +test_43h() { + touch $DIR1/$tfile +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145 + rm $DIR1/$tfile & + PID1=$! + sleep 1 + ls -lia $DIR2/ > /dev/null + check_pdo_conflict $PID1 && { wait $PID1; error "readdir isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 43h "pdirops: unlink vs readdir ==============" + +# test 44: rename tgt and blocking operations +test_44a() { + touch $DIR1/$tfile-2 +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK2 0x146 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000146 + mv $DIR1/$tfile-2 $DIR1/$tfile & + PID1=$! + sleep 1 + mkdir $DIR2/$tfile && error "mkdir must fail" + check_pdo_conflict $PID1 && { wait $PID1; error "mkdir isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 44a "pdirops: rename tgt vs mkdir ==============" + +test_44b() { + touch $DIR1/$tfile-2 +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK2 0x146 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000146 + mv $DIR1/$tfile-2 $DIR1/$tfile & + PID1=$! + sleep 1 + multiop $DIR2/$tfile oO_CREAT:O_EXCL:c && error "create must fail" + check_pdo_conflict $PID1 && { wait $PID1; error "create isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 44b "pdirops: rename tgt vs create ==============" + +test_44c() { + touch $DIR1/$tfile-2 + touch $DIR1/$tfile-3 +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK2 0x146 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000146 + mv $DIR1/$tfile-2 $DIR1/$tfile & + PID1=$! + sleep 1 + link $DIR2/$tfile-3 $DIR2/$tfile && error "link must fail" + check_pdo_conflict $PID1 && { wait $PID1; error "link isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 44c "pdirops: rename tgt vs link ==============" + +test_44d() { + touch $DIR1/$tfile-2 +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK2 0x146 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000146 + mv $DIR1/$tfile-2 $DIR1/$tfile & + PID1=$! + sleep 1 + rm $DIR2/$tfile || error "unlink must succeed" + check_pdo_conflict $PID1 && { wait $PID1; error "unlink isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 44d "pdirops: rename tgt vs unlink ==============" + +test_44e() { + touch $DIR1/$tfile + touch $DIR1/$tfile-2 + touch $DIR1/$tfile-3 +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK2 0x146 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000146 + mv $DIR1/$tfile-2 $DIR1/$tfile & + PID1=$! + sleep 1 + mv $DIR2/$tfile-3 $DIR2/$tfile || error "rename must succeed" + check_pdo_conflict $PID1 && { wait $PID1; error "rename isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 44e "pdirops: rename tgt and rename (tgt) ==============" + +test_44f() { + touch $DIR1/$tfile-2 + touch $DIR1/$tfile-3 +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK2 0x146 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000146 + mv $DIR1/$tfile-2 $DIR1/$tfile & + PID1=$! + sleep 1 + mv $DIR2/$tfile $DIR2/$tfile-3 || error "rename must succeed" + check_pdo_conflict $PID1 && { wait $PID1; error "rename isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 44f "pdirops: rename tgt and rename (src) ==============" + +test_44g() { + touch $DIR1/$tfile-2 +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK2 0x146 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000146 + mv $DIR1/$tfile-2 $DIR1/$tfile & + PID1=$! + sleep 1 + stat $DIR2/$tfile > /dev/null || error "stat must succeed" + check_pdo_conflict $PID1 && { wait $PID1; error "getattr isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 44g "pdirops: rename tgt vs getattr ==============" + +test_44h() { + touch $DIR1/$tfile-2 +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK2 0x146 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000146 + mv $DIR1/$tfile-2 $DIR1/$tfile & + PID1=$! + sleep 1 + ls -lia $DIR2/ > /dev/null + check_pdo_conflict $PID1 && { wait $PID1; error "readdir isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 44h "pdirops: rename tgt vs readdir ==============" + +# test 45: rename src and blocking operations +test_45a() { + touch $DIR1/$tfile +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145 + mv $DIR1/$tfile $DIR1/$tfile-2 & + PID1=$! + sleep 1 + mkdir $DIR2/$tfile || error "mkdir must succeed" + check_pdo_conflict $PID1 && { wait $PID1; error "mkdir isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 45a "pdirops: rename src vs mkdir ==============" + +test_45b() { + touch $DIR1/$tfile +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145 + mv $DIR1/$tfile $DIR1/$tfile-2 & + PID1=$! + sleep 1 + multiop $DIR2/$tfile oO_CREAT:O_EXCL:c || error "create must succeed" + check_pdo_conflict $PID1 && { wait $PID1; error "create isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 45b "pdirops: rename src vs create ==============" + +test_45c() { + touch $DIR1/$tfile + touch $DIR1/$tfile-3 +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145 + mv $DIR1/$tfile $DIR1/$tfile-2 & + PID1=$! + sleep 1 + link $DIR2/$tfile-3 $DIR2/$tfile || error "link must succeed" + check_pdo_conflict $PID1 && { wait $PID1; error "link isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 45c "pdirops: rename src vs link ==============" + +test_45d() { + touch $DIR1/$tfile +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145 + mv $DIR1/$tfile $DIR1/$tfile-2 & + PID1=$! + sleep 1 + rm $DIR2/$tfile && error "unlink must fail" + check_pdo_conflict $PID1 && { wait $PID1; error "unlink isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 45d "pdirops: rename src vs unlink ==============" + +test_45e() { + touch $DIR1/$tfile + touch $DIR1/$tfile-3 +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145 + mv $DIR1/$tfile $DIR1/$tfile-2 & + PID1=$! + sleep 1 + mv $DIR2/$tfile-3 $DIR2/$tfile || error "rename must succeed" + check_pdo_conflict $PID1 && { wait $PID1; error "rename isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 45e "pdirops: rename src and rename (tgt) ==============" + +test_45f() { + touch $DIR1/$tfile +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145 + mv $DIR1/$tfile $DIR1/$tfile-2 & + PID1=$! + sleep 1 + mv $DIR2/$tfile $DIR2/$tfile-3 && error "rename must fail" + check_pdo_conflict $PID1 && { wait $PID1; error "rename isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 45f "pdirops: rename src and rename (src) ==============" + +test_45g() { + touch $DIR1/$tfile +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145 + mv $DIR1/$tfile $DIR1/$tfile-2 & + PID1=$! + sleep 1 + stat $DIR2/$tfile > /dev/null && "stat must fail" + check_pdo_conflict $PID1 && { wait $PID1; error "getattr isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 45g "pdirops: rename src vs getattr ==============" + +test_45h() { + touch $DIR1/$tfile +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145 + mv $DIR1/$tfile $DIR1/$tfile-2 & + PID1=$! + sleep 1 + ls -lia $DIR2/ > /dev/null + check_pdo_conflict $PID1 && { wait $PID1; error "readdir isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 45h "pdirops: unlink vs readdir ==============" + +# test 46: link and blocking operations +test_46a() { + touch $DIR1/$tfile-2 +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145 + link $DIR1/$tfile-2 $DIR1/$tfile & + PID1=$! + sleep 1 + mkdir $DIR2/$tfile && error "mkdir must fail" + check_pdo_conflict $PID1 && { wait $PID1; error "mkdir isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 46a "pdirops: link vs mkdir ==============" + +test_46b() { + touch $DIR1/$tfile-2 +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145 + link $DIR1/$tfile-2 $DIR1/$tfile & + PID1=$! + sleep 1 + multiop $DIR2/$tfile oO_CREAT:O_EXCL:c && error "create must fail" + check_pdo_conflict $PID1 && { wait $PID1; error "create isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 46b "pdirops: link vs create ==============" + +test_46c() { + touch $DIR1/$tfile-2 +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145 + link $DIR1/$tfile-2 $DIR1/$tfile & + PID1=$! + sleep 1 + link $DIR2/$tfile $DIR2/$tfile && error "link must fail" + check_pdo_conflict $PID1 && { wait $PID1; error "link isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 46c "pdirops: link vs link ==============" + +test_46d() { + touch $DIR1/$tfile-2 +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145 + link $DIR1/$tfile-2 $DIR1/$tfile & + PID1=$! + sleep 1 + rm $DIR2/$tfile || error "unlink must succeed" + check_pdo_conflict $PID1 && { wait $PID1; error "unlink isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 46d "pdirops: link vs unlink ==============" + +test_46e() { + touch $DIR1/$tfile-2 + touch $DIR1/$tfile-3 +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145 + link $DIR1/$tfile-2 $DIR1/$tfile & + PID1=$! + sleep 1 + mv $DIR2/$tfile-3 $DIR2/$tfile || error "rename must succeed" + check_pdo_conflict $PID1 && { wait $PID1; error "rename isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 46e "pdirops: link and rename (tgt) ==============" + +test_46f() { + touch $DIR1/$tfile-2 + touch $DIR1/$tfile-3 +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145 + link $DIR1/$tfile-2 $DIR1/$tfile & + PID1=$! + sleep 1 + mv $DIR2/$tfile $DIR2/$tfile-3 || error "rename must succeed" + check_pdo_conflict $PID1 && { wait $PID1; error "rename isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 46f "pdirops: link and rename (src) ==============" + +test_46g() { + touch $DIR1/$tfile-2 +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145 + link $DIR1/$tfile-2 $DIR1/$tfile & + PID1=$! + sleep 1 + stat $DIR2/$tfile > /dev/null || error "stat must succeed" + check_pdo_conflict $PID1 && { wait $PID1; error "getattr isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 46g "pdirops: link vs getattr ==============" + +test_46h() { + touch $DIR1/$tfile-2 +#define OBD_FAIL_ONCE|OBD_FAIL_MDS_PDO_LOCK 0x145 + do_facet $SINGLEMDS lctl set_param fail_loc=0x80000145 + link $DIR1/$tfile-2 $DIR1/$tfile & + PID1=$! + sleep 1 + ls -lia $DIR2/ > /dev/null + check_pdo_conflict $PID1 && { wait $PID1; error "readdir isn't blocked"; } + rm -r $DIR1/* + return 0 +} +run_test 46h "pdirops: link vs readdir ==============" + +test_50() { + trunc_size=4096 + dd if=/dev/zero of=$DIR1/$tfile bs=1K count=10 +#define OBD_FAIL_OSC_CP_ENQ_RACE 0x410 + do_facet client "lctl set_param fail_loc=0x410" + $TRUNCATE $DIR2/$tfile $trunc_size + do_facet client "lctl set_param fail_loc=0x0" + sleep 3 + size=`stat -c %s $DIR2/$tfile` + [ $size -eq $trunc_size ] || error "wrong size" +} +run_test 50 "osc lvb attrs: enqueue vs. CP AST ==============" + log "cleanup: ======================================================" [ "$(mount | grep $MOUNT2)" ] && umount $MOUNT2