Whamcloud - gitweb
LU-966 mdd: mdd object may not be exist
[fs/lustre-release.git] / lustre / mdt / mdt_reint.c
index 78a6874..ef422a9 100644 (file)
@@ -250,7 +250,8 @@ int mdt_lookup_version_check(struct mdt_thread_info *info,
         info->mti_ver[idx] = ENOENT_VERSION;
         if (rc == 0) {
                 struct mdt_object *child;
-                child = mdt_object_find(info->mti_env, info->mti_mdt, fid);
+                child = mdt_object_find(info->mti_env, info->mti_mdt, fid,
+                                        MDT_OBJ_MAY_NOT_EXIST);
                 if (likely(!IS_ERR(child))) {
                         mdt_obj_version_get(info, child, &info->mti_ver[idx]);
                         mdt_object_put(info->mti_env, child);
@@ -291,7 +292,7 @@ static int mdt_md_create(struct mdt_thread_info *info)
         mdt_lock_pdo_init(lh, LCK_PW, rr->rr_name, rr->rr_namelen);
 
         parent = mdt_object_find_lock(info, rr->rr_fid1, lh,
-                                      MDS_INODELOCK_UPDATE);
+                                      MDS_INODELOCK_UPDATE, MDT_OBJ_MUST_EXIST);
         if (IS_ERR(parent))
                 RETURN(PTR_ERR(parent));
 
@@ -313,7 +314,8 @@ static int mdt_md_create(struct mdt_thread_info *info)
         /* save version of file name for replay, it must be ENOENT here */
         mdt_enoent_version_save(info, 1);
 
-        child = mdt_object_find(info->mti_env, mdt, rr->rr_fid2);
+        child = mdt_object_find(info->mti_env, mdt, rr->rr_fid2,
+                                MDT_OBJ_MAY_NOT_EXIST);
         if (likely(!IS_ERR(child))) {
                 struct md_object *next = mdt_object_child(parent);
 
@@ -379,7 +381,8 @@ static int mdt_md_mkobj(struct mdt_thread_info *info)
 
         repbody = req_capsule_server_get(info->mti_pill, &RMF_MDT_BODY);
 
-        o = mdt_object_find(info->mti_env, mdt, info->mti_rr.rr_fid2);
+        o = mdt_object_find(info->mti_env, mdt, info->mti_rr.rr_fid2,
+                            MDT_OBJ_MAY_NOT_EXIST);
         if (!IS_ERR(o)) {
                 struct md_object *next = mdt_object_child(o);
 
@@ -495,7 +498,8 @@ static int mdt_reint_setattr(struct mdt_thread_info *info,
                 ldlm_request_cancel(req, info->mti_dlm_req, 0);
 
         repbody = req_capsule_server_get(info->mti_pill, &RMF_MDT_BODY);
-        mo = mdt_object_find(info->mti_env, info->mti_mdt, rr->rr_fid1);
+        mo = mdt_object_find(info->mti_env, info->mti_mdt, rr->rr_fid1,
+                             MDT_OBJ_MUST_EXIST);
         if (IS_ERR(mo))
                 GOTO(out, rc = PTR_ERR(mo));
 
@@ -696,7 +700,7 @@ static int mdt_reint_unlink(struct mdt_thread_info *info,
                                   rr->rr_namelen);
         }
         mp = mdt_object_find_lock(info, rr->rr_fid1, parent_lh,
-                                  MDS_INODELOCK_UPDATE);
+                                  MDS_INODELOCK_UPDATE, MDT_OBJ_MUST_EXIST);
         if (IS_ERR(mp)) {
                 rc = PTR_ERR(mp);
                 /* errors are possible here in cross-ref cases, see below */
@@ -739,7 +743,8 @@ static int mdt_reint_unlink(struct mdt_thread_info *info,
                  GOTO(out_unlock_parent, rc);
 
         /* We will lock the child regardless it is local or remote. No harm. */
-        mc = mdt_object_find(info->mti_env, info->mti_mdt, child_fid);
+        mc = mdt_object_find(info->mti_env, info->mti_mdt, child_fid,
+                             MDT_OBJ_MUST_EXIST);
         if (IS_ERR(mc))
                 GOTO(out_unlock_parent, rc = PTR_ERR(mc));
         child_lh = &info->mti_lh[MDT_LH_CHILD];
@@ -827,7 +832,8 @@ static int mdt_reint_link(struct mdt_thread_info *info,
                 lhs = &info->mti_lh[MDT_LH_CHILD];
                 mdt_lock_reg_init(lhs, LCK_EX);
                 ms = mdt_object_find_lock(info, rr->rr_fid1, lhs,
-                                          MDS_INODELOCK_UPDATE);
+                                          MDS_INODELOCK_UPDATE,
+                                          MDT_OBJ_MUST_EXIST);
                 if (IS_ERR(ms))
                         RETURN(PTR_ERR(ms));
 
@@ -847,7 +853,7 @@ static int mdt_reint_link(struct mdt_thread_info *info,
         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);
+                                  MDS_INODELOCK_UPDATE, MDT_OBJ_MUST_EXIST);
         if (IS_ERR(mp))
                 RETURN(PTR_ERR(mp));
 
@@ -859,7 +865,8 @@ static int mdt_reint_link(struct mdt_thread_info *info,
         lhs = &info->mti_lh[MDT_LH_CHILD];
         mdt_lock_reg_init(lhs, LCK_EX);
 
-        ms = mdt_object_find(info->mti_env, info->mti_mdt, rr->rr_fid1);
+        ms = mdt_object_find(info->mti_env, info->mti_mdt, rr->rr_fid1,
+                             MDT_OBJ_MUST_EXIST);
         if (IS_ERR(ms))
                 GOTO(out_unlock_parent, rc = PTR_ERR(ms));
 
@@ -958,7 +965,8 @@ static int mdt_reint_rename_tgt(struct mdt_thread_info *info)
         mdt_lock_pdo_init(lh_tgtdir, LCK_PW, rr->rr_tgt,
                           rr->rr_tgtlen);
         mtgtdir = mdt_object_find_lock(info, rr->rr_fid1, lh_tgtdir,
-                                       MDS_INODELOCK_UPDATE);
+                                       MDS_INODELOCK_UPDATE,
+                                       MDT_OBJ_MUST_EXIST);
         if (IS_ERR(mtgtdir))
                 RETURN(PTR_ERR(mtgtdir));
 
@@ -981,7 +989,8 @@ static int mdt_reint_rename_tgt(struct mdt_thread_info *info)
                 mdt_lock_reg_init(lh_tgt, LCK_EX);
 
                 mtgt = mdt_object_find_lock(info, tgt_fid, lh_tgt,
-                                            MDS_INODELOCK_LOOKUP);
+                                            MDS_INODELOCK_LOOKUP,
+                                            MDT_OBJ_MUST_EXIST);
                 if (IS_ERR(mtgt))
                         GOTO(out_unlock_tgtdir, rc = PTR_ERR(mtgt));
 
@@ -1077,7 +1086,8 @@ static int mdt_rename_sanity(struct mdt_thread_info *info, struct lu_fid *fid)
 
         do {
                 LASSERT(fid_is_sane(&dst_fid));
-                dst = mdt_object_find(info->mti_env, info->mti_mdt, &dst_fid);
+                dst = mdt_object_find(info->mti_env, info->mti_mdt, &dst_fid,
+                                      MDT_OBJ_MUST_EXIST);
                 if (!IS_ERR(dst)) {
                         rc = mdo_is_subdir(info->mti_env,
                                            mdt_object_child(dst), fid,
@@ -1150,7 +1160,8 @@ static int mdt_reint_rename(struct mdt_thread_info *info,
         mdt_lock_pdo_init(lh_srcdirp, LCK_PW, rr->rr_name,
                           rr->rr_namelen);
         msrcdir = mdt_object_find_lock(info, rr->rr_fid1, lh_srcdirp,
-                                       MDS_INODELOCK_UPDATE);
+                                       MDS_INODELOCK_UPDATE,
+                                       MDT_OBJ_MUST_EXIST);
         if (IS_ERR(msrcdir))
                 GOTO(out_rename_lock, rc = PTR_ERR(msrcdir));
 
@@ -1174,7 +1185,7 @@ static int mdt_reint_rename(struct mdt_thread_info *info,
                 }
         } else {
                 mtgtdir = mdt_object_find(info->mti_env, info->mti_mdt,
-                                          rr->rr_fid2);
+                                          rr->rr_fid2, MDT_OBJ_MUST_EXIST);
                 if (IS_ERR(mtgtdir))
                         GOTO(out_unlock_source, rc = PTR_ERR(mtgtdir));
 
@@ -1183,10 +1194,7 @@ static int mdt_reint_rename(struct mdt_thread_info *info,
                 if (rc)
                         GOTO(out_put_target, rc);
 
-                rc = mdt_object_exists(mtgtdir);
-                if (rc == 0) {
-                        GOTO(out_put_target, rc = -ESTALE);
-                } else if (rc > 0) {
+                if (mdt_object_exists(mtgtdir) > 0) {
                         /* we lock the target dir if it is local */
                         rc = mdt_object_lock(info, mtgtdir, lh_tgtdirp,
                                              MDS_INODELOCK_UPDATE,
@@ -1208,7 +1216,8 @@ static int mdt_reint_rename(struct mdt_thread_info *info,
         if (lu_fid_eq(old_fid, rr->rr_fid1) || lu_fid_eq(old_fid, rr->rr_fid2))
                 GOTO(out_unlock_target, rc = -EINVAL);
 
-        mold = mdt_object_find(info->mti_env, info->mti_mdt, old_fid);
+        mold = mdt_object_find(info->mti_env, info->mti_mdt, old_fid,
+                               MDT_OBJ_MUST_EXIST);
         if (IS_ERR(mold))
                 GOTO(out_unlock_target, rc = PTR_ERR(mold));
 
@@ -1241,7 +1250,8 @@ static int mdt_reint_rename(struct mdt_thread_info *info,
                         GOTO(out_unlock_old, rc = -EINVAL);
 
                 mdt_lock_reg_init(lh_newp, LCK_EX);
-                mnew = mdt_object_find(info->mti_env, info->mti_mdt, new_fid);
+                mnew = mdt_object_find(info->mti_env, info->mti_mdt, new_fid,
+                                       MDT_OBJ_MAY_NOT_EXIST);
                 if (IS_ERR(mnew))
                         GOTO(out_unlock_old, rc = PTR_ERR(mnew));