Whamcloud - gitweb
(1) fix a bug about lock in rename: we should lock the target dir and target object...
authorhuanghua <huanghua>
Fri, 20 Oct 2006 06:55:39 +0000 (06:55 +0000)
committerhuanghua <huanghua>
Fri, 20 Oct 2006 06:55:39 +0000 (06:55 +0000)
(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
lustre/mdt/mdt_open.c
lustre/mdt/mdt_reint.c
lustre/tests/sanity.sh
lustre/tests/test-framework.sh
lustre/utils/loadmod_all.sh

index 6a1771f..f6463b6 100644 (file)
@@ -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. */
index 1fc4ae9..87067b6 100644 (file)
@@ -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. */
index 3911547..bed8558 100644 (file)
@@ -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);
index 016661b..95b5a96 100644 (file)
@@ -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
index e5a5b1a..ef69c1d 100644 (file)
@@ -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`
index c9bfcab..3b09ed6 100755 (executable)
@@ -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