From 4bd8634593f8d95348fa0908b0bd06f3228b2cbd Mon Sep 17 00:00:00 2001 From: Mikhail Pershin Date: Wed, 21 Apr 2010 11:43:20 -0700 Subject: [PATCH] b=22161 Use LCK_PW for parent lock in mdt_link(). Pdirops test set i=adilger i=bzzz i=rread --- lustre/include/obd_support.h | 2 + lustre/mdt/mdt_handler.c | 10 +- lustre/mdt/mdt_reint.c | 3 +- lustre/tests/sanityn.sh | 832 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 841 insertions(+), 6 deletions(-) diff --git a/lustre/include/obd_support.h b/lustre/include/obd_support.h index bd83911..591e098 100644 --- a/lustre/include/obd_support.h +++ b/lustre/include/obd_support.h @@ -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 diff --git a/lustre/mdt/mdt_handler.c b/lustre/mdt/mdt_handler.c index ab757f6..a6f1a60 100644 --- a/lustre/mdt/mdt_handler.c +++ b/lustre/mdt/mdt_handler.c @@ -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); } diff --git a/lustre/mdt/mdt_reint.c b/lustre/mdt/mdt_reint.c index 60dbfc2..045aa20 100644 --- a/lustre/mdt/mdt_reint.c +++ b/lustre/mdt/mdt_reint.c @@ -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, diff --git a/lustre/tests/sanityn.sh b/lustre/tests/sanityn.sh index 80ad91e..2058aa8 100644 --- a/lustre/tests/sanityn.sh +++ b/lustre/tests/sanityn.sh @@ -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 -- 1.8.3.1