Whamcloud - gitweb
- simplify handling of same fids issue during link. mdt_reint_link() returns
authortappro <tappro>
Thu, 2 Nov 2006 01:13:38 +0000 (01:13 +0000)
committertappro <tappro>
Thu, 2 Nov 2006 01:13:38 +0000 (01:13 +0000)
  error immediately, mdd_link_sanity_check() check the source is dir at first,
  therefore src cannot be the same as tgt.

lustre/mdd/mdd_dir.c
lustre/mdt/mdt_reint.c

index f8b34a4..8621f69 100644 (file)
@@ -185,7 +185,7 @@ static int mdd_is_subdir(const struct lu_env *env,
 
 /* Check whether it may create the cobj under the pobj */
 static int mdd_may_create(const struct lu_env *env, struct mdd_object *pobj,
-                          struct mdd_object *cobj, int need_check, int lock)
+                          struct mdd_object *cobj, int need_check)
 {
         int rc = 0;
         ENTRY;
@@ -197,14 +197,8 @@ static int mdd_may_create(const struct lu_env *env, struct mdd_object *pobj,
                 RETURN(-ENOENT);
 
         if (need_check) {
-                if (lock) {
-                        rc = mdd_permission_internal_locked(env, pobj,
-                                                            (MAY_WRITE |
-                                                             MAY_EXEC));
-                } else {
-                        rc = mdd_permission_internal(env, pobj, (MAY_WRITE |
-                                                                 MAY_EXEC));
-                }
+                rc = mdd_permission_internal_locked(env, pobj,
+                                                    (MAY_WRITE | MAY_EXEC));
         }
         RETURN(rc);
 }
@@ -291,23 +285,19 @@ int mdd_link_sanity_check(const struct lu_env *env, struct mdd_object *tgt_obj,
         int rc = 0;
         ENTRY;
 
-        if (tgt_obj) {
-                /* 
-                 * Lock only if tgt and src not same object. This is because
-                 * mdd_link() already locked src and we try to lock it again we
-                 * have a problem.
-                 */
-                rc = mdd_may_create(env, tgt_obj, NULL, 1, (src_obj != tgt_obj));
-                if (rc)
-                        RETURN(rc);
-        }
-
         if (mdd_is_immutable(src_obj) || mdd_is_append(src_obj))
                 RETURN(-EPERM);
 
         if (S_ISDIR(mdd_object_type(src_obj)))
                 RETURN(-EPERM);
 
+        LASSERT(src_obj != tgt_obj);
+        if (tgt_obj) {
+                rc = mdd_may_create(env, tgt_obj, NULL, 1);
+                if (rc)
+                        RETURN(rc);
+        }
+
         RETURN(rc);
 }
 
@@ -774,7 +764,7 @@ static int mdd_rt_sanity_check(const struct lu_env *env,
                      mdd_dir_is_empty(env, tobj))
                                 RETURN(-ENOTEMPTY);
         } else {
-                rc = mdd_may_create(env, tgt_pobj, NULL, 1, 1);
+                rc = mdd_may_create(env, tgt_pobj, NULL, 1);
         }
 
         RETURN(rc);
@@ -1315,7 +1305,7 @@ static int mdd_rename_sanity_check(const struct lu_env *env,
 
         if (!tobj) {
                 rc = mdd_may_create(env, tgt_pobj, NULL,
-                                    (src_pobj != tgt_pobj), 1);
+                                    (src_pobj != tgt_pobj));
         } else {
                 mdd_read_lock(env, tobj);
                 rc = mdd_may_delete(env, tgt_pobj, tobj, src_is_dir,
index 56baa84..4c7799a 100644 (file)
@@ -477,6 +477,11 @@ static int mdt_reint_link(struct mdt_thread_info *info,
                 RETURN(rc);
         }
 
+        /* Invalid case so return error immediately instead of
+         * processing it */
+        if (lu_fid_eq(rr->rr_fid1, rr->rr_fid2))
+                RETURN(-EPERM);
+        
         /* 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,
@@ -489,21 +494,16 @@ static int mdt_reint_link(struct mdt_thread_info *info,
         /* step 2: find & lock the source */
         lhs = &info->mti_lh[MDT_LH_CHILD];
         mdt_lock_reg_init(lhs, LCK_EX);
-
-        if (lu_fid_eq(rr->rr_fid1, rr->rr_fid2)) {
-                mdt_object_get(info->mti_env, mp);
-                ms = mp;
-        } else {
-                ms = mdt_object_find(info->mti_env, info->mti_mdt, rr->rr_fid1);
-                if (IS_ERR(ms))
-                        GOTO(out_unlock_parent, rc = PTR_ERR(ms));
-                
-                rc = mdt_object_lock(info, ms, lhs, MDS_INODELOCK_UPDATE,
-                                     MDT_CROSS_LOCK);
-                if (rc != 0) {
-                        mdt_object_put(info->mti_env, ms);
-                        GOTO(out_unlock_parent, rc);
-                }
+        ms = mdt_object_find(info->mti_env, info->mti_mdt, rr->rr_fid1);
+        if (IS_ERR(ms))
+                GOTO(out_unlock_parent, rc = PTR_ERR(ms));
+        
+        rc = mdt_object_lock(info, ms, lhs, MDS_INODELOCK_UPDATE,
+                            MDT_CROSS_LOCK);
+        if (rc != 0) {
+                mdt_object_put(info->mti_env, ms);
+                GOTO(out_unlock_parent, rc);
         }
 
         /* step 3: link it */