Whamcloud - gitweb
b=22161 Use LCK_PW for parent lock in mdt_link(). Pdirops test set
authorMikhail Pershin <tappro@sun.com>
Wed, 21 Apr 2010 18:43:20 +0000 (11:43 -0700)
committerRobert Read <robert.read@oracle.com>
Wed, 21 Apr 2010 18:43:20 +0000 (11:43 -0700)
i=adilger
i=bzzz
i=rread

lustre/include/obd_support.h
lustre/mdt/mdt_handler.c
lustre/mdt/mdt_reint.c
lustre/tests/sanityn.sh

index bd83911..591e098 100644 (file)
@@ -226,6 +226,8 @@ int obd_alloc_fail(const void *ptr, const char *name, const char *type,
 #define OBD_FAIL_MDS_REINT_DELAY         0x142
 #define OBD_FAIL_MDS_READLINK_EPROTO     0x143
 #define OBD_FAIL_MDS_OPEN_WAIT_CREATE    0x144
+#define OBD_FAIL_MDS_PDO_LOCK            0x145
+#define OBD_FAIL_MDS_PDO_LOCK2           0x146
 
 /* CMD */
 #define OBD_FAIL_MDS_IS_SUBDIR_NET       0x180
index ab757f6..a6f1a60 100644 (file)
@@ -2255,12 +2255,12 @@ int mdt_object_lock(struct mdt_thread_info *info, struct mdt_object *o,
                           res_id, LDLM_FL_LOCAL_ONLY | LDLM_FL_ATOMIC_CB,
                           &info->mti_exp->exp_handle.h_cookie);
         if (rc)
-                GOTO(out, rc);
-
-out:
-        if (rc)
                 mdt_object_unlock(info, o, lh, 1);
-
+        else if (unlikely(OBD_FAIL_PRECHECK(OBD_FAIL_MDS_PDO_LOCK)) &&
+                 lh->mlh_pdo_hash != 0 &&
+                 (lh->mlh_reg_mode == LCK_PW || lh->mlh_reg_mode == LCK_EX)) {
+                OBD_FAIL_TIMEOUT(OBD_FAIL_MDS_PDO_LOCK, 10);
+        }
 
         RETURN(rc);
 }
index 60dbfc2..045aa20 100644 (file)
@@ -667,7 +667,7 @@ static int mdt_reint_link(struct mdt_thread_info *info,
 
         /* step 1: find & lock the target parent dir */
         lhp = &info->mti_lh[MDT_LH_PARENT];
-        mdt_lock_pdo_init(lhp, LCK_EX, rr->rr_name,
+        mdt_lock_pdo_init(lhp, LCK_PW, rr->rr_name,
                           rr->rr_namelen);
         mp = mdt_object_find_lock(info, rr->rr_fid2, lhp,
                                   MDS_INODELOCK_UPDATE);
@@ -977,6 +977,7 @@ static int mdt_reint_rename(struct mdt_thread_info *info,
                                                  MDS_INODELOCK_UPDATE);
                          if (rc)
                                  GOTO(out_unlock_source, rc);
+                         OBD_FAIL_TIMEOUT(OBD_FAIL_MDS_PDO_LOCK2, 10);
                 }
         } else {
                 mtgtdir = mdt_object_find(info->mti_env, info->mti_mdt,
index 80ad91e..2058aa8 100644 (file)
@@ -1017,6 +1017,838 @@ test_39c() {
 }
 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 =============="
+
 log "cleanup: ======================================================"
 
 [ "$(mount | grep $MOUNT2)" ] && umount $MOUNT2