Whamcloud - gitweb
b=23127 osc lock granted fix
[fs/lustre-release.git] / lustre / tests / sanityn.sh
index 35d9d3c..dcb2fe9 100644 (file)
@@ -439,7 +439,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 +455,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 ] && \
@@ -918,6 +925,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