Whamcloud - gitweb
LU-966 mdd: mdd object may not be exist
[fs/lustre-release.git] / lustre / mdt / mdt_open.c
index 90b26b2..6e886ad 100644 (file)
@@ -936,7 +936,8 @@ void mdt_reconstruct_open(struct mdt_thread_info *info,
                  * We failed after creation, but we do not know in which step
                  * we failed. So try to check the child object.
                  */
-                parent = mdt_object_find(env, mdt, rr->rr_fid1);
+                parent = mdt_object_find(env, mdt, rr->rr_fid1,
+                                         MDT_OBJ_MUST_EXIST);
                 if (IS_ERR(parent)) {
                         rc = PTR_ERR(parent);
                         LCONSOLE_WARN("Parent "DFID" lookup error %d."
@@ -947,7 +948,8 @@ void mdt_reconstruct_open(struct mdt_thread_info *info,
                         mdt_export_evict(exp);
                         RETURN_EXIT;
                 }
-                child = mdt_object_find(env, mdt, rr->rr_fid2);
+                child = mdt_object_find(env, mdt, rr->rr_fid2,
+                                        MDT_OBJ_MAY_NOT_EXIST);
                 if (IS_ERR(child)) {
                         rc = PTR_ERR(child);
                         LCONSOLE_WARN("Child "DFID" lookup error %d."
@@ -1007,9 +1009,10 @@ static int mdt_open_by_fid(struct mdt_thread_info* info,
         int                      rc;
         ENTRY;
 
-        o = mdt_object_find(info->mti_env, info->mti_mdt, rr->rr_fid2);
+        o = mdt_object_find(info->mti_env, info->mti_mdt, rr->rr_fid2,
+                            MDT_OBJ_MUST_EXIST);
         if (IS_ERR(o))
-                RETURN(rc = PTR_ERR(o));
+                RETURN(PTR_ERR(o));
 
         rc = mdt_object_exists(o);
         if (rc > 0) {
@@ -1020,9 +1023,7 @@ static int mdt_open_by_fid(struct mdt_thread_info* info,
                 rc = mo_attr_get(env, mdt_object_child(o), ma);
                 if (rc == 0)
                         rc = mdt_finish_open(info, NULL, o, flags, 0, rep);
-        } else if (rc == 0) {
-                rc = -ENOENT;
-        } else  {
+        } else if (rc < 0) {
                 /* the child object was created on remote server */
                 struct mdt_body *repbody;
                 repbody = req_capsule_server_get(info->mti_pill, &RMF_MDT_BODY);
@@ -1036,7 +1037,7 @@ static int mdt_open_by_fid(struct mdt_thread_info* info,
 }
 
 static int mdt_open_anon_by_fid(struct mdt_thread_info *info,
-                                struct ldlm_reply *rep, 
+                                struct ldlm_reply *rep,
                                 struct mdt_lock_handle *lhc)
 {
         const struct lu_env     *env   = info->mti_env;
@@ -1052,7 +1053,8 @@ static int mdt_open_anon_by_fid(struct mdt_thread_info *info,
 
         if (md_should_create(flags)) {
                 if (!lu_fid_eq(rr->rr_fid1, rr->rr_fid2)) {
-                        parent = mdt_object_find(env, mdt, rr->rr_fid1);
+                        parent = mdt_object_find(env, mdt, rr->rr_fid1,
+                                                 MDT_OBJ_MUST_EXIST);
                         if (IS_ERR(parent)) {
                                 CDEBUG(D_INODE, "Fail to find parent "DFID
                                        " for anonymous created %ld, try to"
@@ -1065,18 +1067,18 @@ static int mdt_open_anon_by_fid(struct mdt_thread_info *info,
                         ma->ma_need |= MA_PFID;
         }
 
-        o = mdt_object_find(env, mdt, rr->rr_fid2);
-        if (IS_ERR(o))
-                RETURN(rc = PTR_ERR(o));
+        o = mdt_object_find(env, mdt, rr->rr_fid2, MDT_OBJ_MUST_EXIST);
+        if (IS_ERR(o)) {
+                if (PTR_ERR(o) == -ENOENT)
+                        mdt_set_disposition(info, rep, (DISP_LOOKUP_EXECD |
+                                                        DISP_LOOKUP_NEG));
+                GOTO(out_parent, rc = PTR_ERR(o));
+        }
 
         rc = mdt_object_exists(o);
-        if (rc == 0) {
-                mdt_set_disposition(info, rep, (DISP_LOOKUP_EXECD |
-                                    DISP_LOOKUP_NEG));
-                GOTO(out, rc = -ENOENT);
-        } else if (rc < 0) {
+        if (rc < 0) {
                 CERROR("NFS remote open shouldn't happen.\n");
-                GOTO(out, rc);
+                GOTO(out_child, rc);
         }
         mdt_set_disposition(info, rep, (DISP_IT_EXECD |
                                         DISP_LOOKUP_EXECD |
@@ -1095,14 +1097,15 @@ static int mdt_open_anon_by_fid(struct mdt_thread_info *info,
                              MDS_INODELOCK_LOOKUP | MDS_INODELOCK_OPEN,
                              MDT_CROSS_LOCK);
         if (rc)
-                GOTO(out, rc);
+                GOTO(out_child, rc);
 
         rc = mo_attr_get(env, mdt_object_child(o), ma);
         if (rc)
-                GOTO(out, rc);
+                GOTO(out_child, rc);
 
         if (ma->ma_valid & MA_PFID) {
-                parent = mdt_object_find(env, mdt, &ma->ma_pfid);
+                parent = mdt_object_find(env, mdt, &ma->ma_pfid,
+                                         MDT_OBJ_MUST_EXIST);
                 if (IS_ERR(parent)) {
                         CDEBUG(D_INODE, "Fail to find parent "DFID
                                " for anonymous created %ld, try to"
@@ -1119,9 +1122,10 @@ static int mdt_open_anon_by_fid(struct mdt_thread_info *info,
         if (!(flags & MDS_OPEN_LOCK) || rc)
                 mdt_object_unlock(info, o, lhc, 1);
 
-        GOTO(out, rc);
-out:
+        GOTO(out_child, rc);
+out_child:
         mdt_object_put(env, o);
+out_parent:
         if (parent != NULL)
                 mdt_object_put(env, parent);
         return rc;
@@ -1143,7 +1147,8 @@ static int mdt_cross_open(struct mdt_thread_info* info,
         int                rc;
         ENTRY;
 
-        o = mdt_object_find(info->mti_env, info->mti_mdt, fid);
+        o = mdt_object_find(info->mti_env, info->mti_mdt, fid,
+                            MDT_OBJ_MAY_NOT_EXIST);
         if (IS_ERR(o))
                 RETURN(rc = PTR_ERR(o));
 
@@ -1235,7 +1240,7 @@ int mdt_reint_open(struct mdt_thread_info *info, struct mdt_lock_handle *lhc)
                ma->ma_attr.la_mode, msg_flags);
 
         if (req_is_replay(req) ||
-            (req->rq_export->exp_libclient && create_flags&MDS_OPEN_HAS_EA)) {
+            (req->rq_export->exp_libclient && create_flags & MDS_OPEN_HAS_EA)) {
                 /* This is a replay request or from liblustre with ea. */
                 result = mdt_open_by_fid(info, ldlm_rep);
 
@@ -1281,7 +1286,7 @@ int mdt_reint_open(struct mdt_thread_info *info, struct mdt_lock_handle *lhc)
                           LCK_PW : LCK_PR, 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))
                 GOTO(out, result = PTR_ERR(parent));
 
@@ -1325,7 +1330,8 @@ int mdt_reint_open(struct mdt_thread_info *info, struct mdt_lock_handle *lhc)
                 mdt_set_disposition(info, ldlm_rep, DISP_LOOKUP_POS);
         }
 
-        child = mdt_object_find(info->mti_env, mdt, child_fid);
+        child = mdt_object_find(info->mti_env, mdt, child_fid,
+                                MDT_OBJ_MAY_NOT_EXIST);
         if (IS_ERR(child))
                 GOTO(out_parent, result = PTR_ERR(child));