+# 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
+ sleep 1 # to ensure OP1 is finished on client if OP2 is blocked by OP1
+ 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 =============="
+
+test_60() {
+ [[ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.3.0) ]] ||
+ { skip "Need MDS version at least 2.3.0"; return; }
+ # Create a file
+ mkdir -p $DIR1/$tdir
+ file1=$DIR1/$tdir/file
+ file2=$DIR2/$tdir/file
+
+ echo orig > $file2 || error "Could not create $file2"
+ version=$($LFS data_version $file1)
+
+ # Append data
+ echo append >> $file2 || error "Could not append to $file2"
+ version2=$($LFS data_version $file1)
+ [ "$version" != "$version2" ] ||
+ error "append did not change data version: $version"
+
+ # Overwrite data
+ echo overwrite > $file2 || error "Could not overwrite $file2"
+ version3=$($LFS data_version $file1)
+ [ "$version2" != "$version3" ] ||
+ error "overwrite did not change data version: $version2"
+
+ # Truncate before EOF
+ $TRUNCATE $file2 3 || error "Could not truncate $file2"
+ version4=$($LFS data_version $file1)
+ [ "$version3" != "$version4" ] ||
+ error "truncate did not change data version: $version3"
+
+ # Truncate after EOF
+ $TRUNCATE $file2 123456 || error "Could not truncate $file2"
+ version5=$($LFS data_version $file1)
+ [ "$version4" != "$version5" ] ||
+ error "truncate did not change data version: $version4"
+
+ # Chmod do not change version
+ chmod 400 $file2 || error "Could not chmod 400 $file2"
+ version6=$($LFS data_version $file1)
+ [ "$version5" == "$version6" ] ||
+ error "chmod should not change data version: $version5 != $version6"
+
+ # Chown do not change version
+ chown $RUNAS_ID $file2 || error "Could not chown $RUNAS_ID $file2"
+ version7=$($LFS data_version $file1)
+ [ "$version5" == "$version7" ] ||
+ error "chown should not change data version: $version5 != $version7"
+}
+run_test 60 "Verify data_version behaviour"
+