From fb65811277c5d47d78ea38cdc6e18159bccaa43e Mon Sep 17 00:00:00 2001 From: huanghua Date: Fri, 20 Oct 2006 06:55:39 +0000 Subject: [PATCH] (1) fix a bug about lock in rename: we should lock the target dir and target object if and only if they are local; (2) fix a typo bug in mdt_reint_link(): for partial link(), we should use fid1; (3) add some test case for link: cross node link. --- lustre/mdt/mdt_handler.c | 6 +++--- lustre/mdt/mdt_open.c | 8 ++++---- lustre/mdt/mdt_reint.c | 42 ++++++++++++++++++++++++++---------------- lustre/tests/sanity.sh | 32 ++++++++++++++++++++++++++++++++ lustre/tests/test-framework.sh | 4 ---- lustre/utils/loadmod_all.sh | 4 ---- 6 files changed, 65 insertions(+), 31 deletions(-) diff --git a/lustre/mdt/mdt_handler.c b/lustre/mdt/mdt_handler.c index 6a1771f..f6463b6 100644 --- a/lustre/mdt/mdt_handler.c +++ b/lustre/mdt/mdt_handler.c @@ -624,7 +624,7 @@ static int mdt_getattr_name_lock(struct mdt_thread_info *info, RETURN(err_serious(-EFAULT)); CDEBUG(D_INODE, "getattr with lock for "DFID"/%s, ldlm_rep = %p\n", - PFID(mdt_object_fid(parent)), name, ldlm_rep); + PFID(mdt_object_fid(parent)), name, ldlm_rep); mdt_set_disposition(info, ldlm_rep, DISP_LOOKUP_EXECD); @@ -648,8 +648,8 @@ static int mdt_getattr_name_lock(struct mdt_thread_info *info, /* Only getattr on the child. Parent is on another node. */ mdt_set_disposition(info, ldlm_rep, DISP_LOOKUP_POS); child = parent; - CDEBUG(D_INODE, "partial getattr_name child_fid = "DFID - ", ldlm_rep=%p\n", PFID(mdt_object_fid(child)), ldlm_rep); + CDEBUG(D_INODE, "partial getattr_name child_fid = "DFID", " + "ldlm_rep=%p\n", PFID(mdt_object_fid(child)), ldlm_rep); if (is_resent) { /* Do not take lock for resent case. */ diff --git a/lustre/mdt/mdt_open.c b/lustre/mdt/mdt_open.c index 1fc4ae9..87067b6 100644 --- a/lustre/mdt/mdt_open.c +++ b/lustre/mdt/mdt_open.c @@ -739,11 +739,11 @@ int mdt_reint_open(struct mdt_thread_info *info, struct mdt_lock_handle *lhc) GOTO(out, result = err_serious(-EOPNOTSUPP)); } - CDEBUG(D_INODE, "I am going to open "DFID"/("DFID":%s) " + CDEBUG(D_INODE, "I am going to open "DFID"/(%s->"DFID") " "cr_flag=0%o mode=0%06o msg_flag=0x%x\n", - PFID(rr->rr_fid1), PFID(rr->rr_fid2), - rr->rr_name, create_flags, la->la_mode, - lustre_msg_get_flags(req->rq_reqmsg)); + PFID(rr->rr_fid1), rr->rr_name, + PFID(rr->rr_fid2), create_flags, + la->la_mode, lustre_msg_get_flags(req->rq_reqmsg)); if (lustre_msg_get_flags(req->rq_reqmsg) & MSG_REPLAY) { /* This is a replay request. */ diff --git a/lustre/mdt/mdt_reint.c b/lustre/mdt/mdt_reint.c index 3911547..bed8558 100644 --- a/lustre/mdt/mdt_reint.c +++ b/lustre/mdt/mdt_reint.c @@ -48,6 +48,9 @@ static int mdt_md_create(struct mdt_thread_info *info) int rc; ENTRY; + DEBUG_REQ(D_INODE, mdt_info_req(info), "create (%s->"DFID") in "DFID, + rr->rr_name, PFID(rr->rr_fid2), PFID(rr->rr_fid1)); + repbody = req_capsule_server_get(&info->mti_pill, &RMF_MDT_BODY); lh = &info->mti_lh[MDT_LH_PARENT]; @@ -102,6 +105,9 @@ static int mdt_md_mkobj(struct mdt_thread_info *info) int rc; ENTRY; + DEBUG_REQ(D_INODE, mdt_info_req(info), "partial create "DFID"\n", + PFID(info->mti_rr.rr_fid2)); + repbody = req_capsule_server_get(&info->mti_pill, &RMF_MDT_BODY); o = mdt_object_find(info->mti_env, mdt, info->mti_rr.rr_fid2); @@ -462,7 +468,7 @@ static int mdt_reint_link(struct mdt_thread_info *info, int rc; ENTRY; - DEBUG_REQ(D_INODE, req, "link original "DFID" to "DFID" %s", + DEBUG_REQ(D_INODE, req, "link "DFID" to "DFID"/%s", PFID(rr->rr_fid1), PFID(rr->rr_fid2), rr->rr_name); if (MDT_FAIL_CHECK(OBD_FAIL_MDS_REINT_LINK)) @@ -472,7 +478,7 @@ static int mdt_reint_link(struct mdt_thread_info *info, /* MDT holding name ask us to add ref. */ lhs = &info->mti_lh[MDT_LH_CHILD]; lhs->mlh_reg_mode = LCK_EX; - ms = mdt_object_find_lock(info, rr->rr_fid2, lhs, + ms = mdt_object_find_lock(info, rr->rr_fid1, lhs, MDS_INODELOCK_UPDATE); if (IS_ERR(ms)) RETURN(PTR_ERR(ms)); @@ -529,15 +535,12 @@ static int mdt_reint_rename_tgt(struct mdt_thread_info *info) struct mdt_lock_handle *lh_tgt; struct lu_fid *tgt_fid = &info->mti_tmp_fid1; int rc; - ENTRY; - DEBUG_REQ(D_INODE, req, "rename_tgt "DFID" to "DFID" %s", - PFID(rr->rr_fid2), - PFID(rr->rr_fid1), rr->rr_tgt); + DEBUG_REQ(D_INODE, req, "rename_tgt: insert (%s->"DFID") in "DFID, + rr->rr_tgt, PFID(rr->rr_fid2), PFID(rr->rr_fid1)); /* step 1: lookup & lock the tgt dir */ - lh_tgt = &info->mti_lh[MDT_LH_CHILD]; lh_tgtdir = &info->mti_lh[MDT_LH_PARENT]; lh_tgtdir->mlh_reg_mode = LCK_EX; mtgtdir = mdt_object_find_lock(info, rr->rr_fid1, lh_tgtdir, @@ -557,6 +560,7 @@ static int mdt_reint_rename_tgt(struct mdt_thread_info *info) if (lu_fid_eq(tgt_fid, rr->rr_fid2)) GOTO(out_unlock_tgtdir, rc); + lh_tgt = &info->mti_lh[MDT_LH_CHILD]; lh_tgt->mlh_reg_mode = LCK_EX; mtgt = mdt_object_find_lock(info, tgt_fid, lh_tgt, @@ -671,6 +675,7 @@ static int mdt_reint_rename(struct mdt_thread_info *info, struct mdt_reint_record *rr = &info->mti_rr; struct req_capsule *pill = &info->mti_pill; struct md_attr *ma = &info->mti_attr; + struct ptlrpc_request *req = mdt_info_req(info); struct mdt_object *msrcdir; struct mdt_object *mtgtdir; struct mdt_object *mold; @@ -683,7 +688,6 @@ static int mdt_reint_rename(struct mdt_thread_info *info, struct lu_fid *new_fid = &info->mti_tmp_fid2; struct lustre_handle rename_lh = { 0 }; int rc; - ENTRY; rc = req_capsule_get_size(pill, &RMF_NAME, RCL_CLIENT); @@ -693,6 +697,10 @@ static int mdt_reint_rename(struct mdt_thread_info *info, RETURN(rc); } + DEBUG_REQ(D_INODE, req, "rename "DFID"/%s to "DFID"/%s", + PFID(rr->rr_fid1), rr->rr_name, + PFID(rr->rr_fid2), rr->rr_tgt); + rc = mdt_rename_lock(info, &rename_lh); if (rc) { CERROR("can't lock FS for rename, rc %d\n", rc); @@ -721,13 +729,16 @@ static int mdt_reint_rename(struct mdt_thread_info *info, if (IS_ERR(mtgtdir)) GOTO(out_unlock_source, rc = PTR_ERR(mtgtdir)); - rc = mdt_object_cr_lock(info, mtgtdir, lh_tgtdirp, - MDS_INODELOCK_UPDATE); - if (rc != 0) { - mdt_object_put(info->mti_env, mtgtdir); - GOTO(out_unlock_source, rc); + rc = mdt_object_exists(mtgtdir); + if (rc == 0) + GOTO(out_unlock_target, rc = -ESTALE); + else if (rc > 0) { + /* we lock the target dir iff it is local */ + rc = mdt_object_lock(info, mtgtdir, lh_tgtdirp, + MDS_INODELOCK_UPDATE); + if (rc != 0) + GOTO(out_unlock_target, rc); } - } /*step 3: find & lock the old object*/ @@ -773,8 +784,7 @@ static int mdt_reint_rename(struct mdt_thread_info *info, } else if (rc != -EREMOTE && rc != -ENOENT) GOTO(out_unlock_old, rc); - /* step 5: dome some checking ...*/ - /* step 6: rename it */ + /* step 5: rename it */ ma->ma_lmm = req_capsule_server_get(&info->mti_pill, &RMF_MDT_MD); ma->ma_lmm_size = req_capsule_get_size(&info->mti_pill, &RMF_MDT_MD, RCL_SERVER); diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh index 016661b..95b5a96 100644 --- a/lustre/tests/sanity.sh +++ b/lustre/tests/sanity.sh @@ -1254,6 +1254,38 @@ test_31f() { # bug 4554 } run_test 31f "remove of open directory with open-unlink file ===" +test_31g() { + echo "-- cross directory link --" + mkdir $DIR/d31g{a,b} + touch $DIR/d31ga/f + ln $DIR/d31ga/f $DIR/d31gb/g + $CHECKSTAT -t file $DIR/d31ga/f || error "source" + $CHECKSTAT -t file $DIR/d31gb/g || error "target" +} +run_test 31g "cross directory link===============" + +test_31h() { + echo "-- cross directory link --" + mkdir $DIR/d31h + mkdir $DIR/d31h/dir + touch $DIR/d31h/f + ln $DIR/d31h/f $DIR/d31h/dir/g + $CHECKSTAT -t file $DIR/d31h/f || error "source" + $CHECKSTAT -t file $DIR/d31h/dir/g || error "target" +} +run_test 31h "cross directory link under child===============" + +test_31i() { + echo "-- cross directory link --" + mkdir $DIR/d31i + mkdir $DIR/d31i/dir + touch $DIR/d31i/dir/f + ln $DIR/d31i/dir/f $DIR/d31i/g + $CHECKSTAT -t file $DIR/d31i/dir/f || error "source" + $CHECKSTAT -t file $DIR/d31i/g || error "target" +} +run_test 31i "cross directory link under parent===============" + test_32a() { echo "== more mountpoints and symlinks =================" [ -e $DIR/d32a ] && rm -fr $DIR/d32a diff --git a/lustre/tests/test-framework.sh b/lustre/tests/test-framework.sh index e5a5b1a..ef69c1d 100644 --- a/lustre/tests/test-framework.sh +++ b/lustre/tests/test-framework.sh @@ -138,11 +138,7 @@ load_modules() { load_module mgc/mgc load_module mgs/mgs load_module quota/lquota - load_module quota/quotacheck_test - load_module quota/quotactl_test - load_module obdclass/llog_test load_module obdecho/obdecho - load_module ldiskfs/quotafmt_test rm -f $TMP/ogdb-`hostname` diff --git a/lustre/utils/loadmod_all.sh b/lustre/utils/loadmod_all.sh index c9bfcab..3b09ed6 100755 --- a/lustre/utils/loadmod_all.sh +++ b/lustre/utils/loadmod_all.sh @@ -15,17 +15,13 @@ modprobe obdecho modprobe lustre modprobe mgc modprobe ldiskfs -modprobe quotafmt_test modprobe osc modprobe mdt modprobe lquota -modprobe quotactl_test -modprobe quotacheck_test modprobe cmm modprobe mdc modprobe fsfilt_ldiskfs modprobe lvfs -modprobe llog_test modprobe obdclass modprobe mdd modprobe fld -- 1.8.3.1