Whamcloud - gitweb
LU-966 mdd: mdd object may not be exist
authorBobi Jam <bobijam@whamcloud.com>
Mon, 9 Jan 2012 10:23:41 +0000 (18:23 +0800)
committerOleg Drokin <green@whamcloud.com>
Fri, 20 Jan 2012 03:13:15 +0000 (22:13 -0500)
If MDT device has been checked with fsck, some mdd objects
could be removed, so that recovery replay could act on non-existing
objects.

Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: If3a3b72ee70ab2513978ed968c9598ddde11c085
Reviewed-on: http://review.whamcloud.com/1928
Reviewed-by: Fan Yong <yong.fan@whamcloud.com>
Reviewed-by: Mikhail Pershin <tappro@whamcloud.com>
Tested-by: Hudson
Tested-by: Maloo <whamcloud.maloo@gmail.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
lustre/include/obd.h
lustre/mdt/mdt_handler.c
lustre/mdt/mdt_internal.h
lustre/mdt/mdt_open.c
lustre/mdt/mdt_recovery.c
lustre/mdt/mdt_reint.c
lustre/mdt/mdt_xattr.c

index 03e5921..965fd22 100644 (file)
@@ -1737,4 +1737,16 @@ static inline int client_should_resend(int resend, struct client_obd *cli)
                cfs_atomic_read(&cli->cl_resends) > resend : 1;
 }
 
                cfs_atomic_read(&cli->cl_resends) > resend : 1;
 }
 
+/**
+ * Return device name for this device
+ *
+ * XXX: lu_device is declared before obd_device, while a pointer pointing
+ * back to obd_device in lu_device, so this helper function defines here
+ * instead of in lu_object.h
+ */
+static inline const char *lu_dev_name(const struct lu_device *lu_dev)
+{
+        return lu_dev->ld_obd->obd_name;
+}
+
 #endif /* __OBD_H */
 #endif /* __OBD_H */
index 37dd329..021b681 100644 (file)
@@ -325,7 +325,8 @@ static int mdt_getstatus(struct mdt_thread_info *info)
                 struct mdt_object  *root;
                 struct lustre_capa *capa;
 
                 struct mdt_object  *root;
                 struct lustre_capa *capa;
 
-                root = mdt_object_find(info->mti_env, mdt, &repbody->fid1);
+                root = mdt_object_find(info->mti_env, mdt, &repbody->fid1,
+                                       MDT_OBJ_MUST_EXIST);
                 if (IS_ERR(root))
                         RETURN(PTR_ERR(root));
 
                 if (IS_ERR(root))
                         RETURN(PTR_ERR(root));
 
@@ -995,7 +996,8 @@ static int mdt_getattr_name_lock(struct mdt_thread_info *info,
          *step 3: find the child object by fid & lock it.
          *        regardless if it is local or remote.
          */
          *step 3: find the child object by fid & lock it.
          *        regardless if it is local or remote.
          */
-        child = mdt_object_find(info->mti_env, info->mti_mdt, child_fid);
+        child = mdt_object_find(info->mti_env, info->mti_mdt, child_fid,
+                                MDT_OBJ_MUST_EXIST);
 
         if (unlikely(IS_ERR(child)))
                 GOTO(out_parent, rc = PTR_ERR(child));
 
         if (unlikely(IS_ERR(child)))
                 GOTO(out_parent, rc = PTR_ERR(child));
@@ -1031,13 +1033,6 @@ relock:
                 mdt_lock_handle_init(lhc);
                 mdt_lock_reg_init(lhc, LCK_PR);
 
                 mdt_lock_handle_init(lhc);
                 mdt_lock_reg_init(lhc, LCK_PR);
 
-                if (mdt_object_exists(child) == 0) {
-                        LU_OBJECT_DEBUG(D_WARNING, info->mti_env,
-                                        &child->mot_obj.mo_lu,
-                                        "Object doesn't exist!\n");
-                        GOTO(out_child, rc = -ENOENT);
-                }
-
                 if (!(child_bits & MDS_INODELOCK_UPDATE)) {
                         struct md_attr *ma = &info->mti_attr;
 
                 if (!(child_bits & MDS_INODELOCK_UPDATE)) {
                         struct md_attr *ma = &info->mti_attr;
 
@@ -2066,7 +2061,8 @@ static struct mdt_object *mdt_obj(struct lu_object *o)
 
 struct mdt_object *mdt_object_find(const struct lu_env *env,
                                    struct mdt_device *d,
 
 struct mdt_object *mdt_object_find(const struct lu_env *env,
                                    struct mdt_device *d,
-                                   const struct lu_fid *f)
+                                   const struct lu_fid *f,
+                                   enum mdt_obj_exist check_exist)
 {
         struct lu_object *o;
         struct mdt_object *m;
 {
         struct lu_object *o;
         struct mdt_object *m;
@@ -2075,9 +2071,16 @@ struct mdt_object *mdt_object_find(const struct lu_env *env,
         CDEBUG(D_INFO, "Find object for "DFID"\n", PFID(f));
         o = lu_object_find(env, &d->mdt_md_dev.md_lu_dev, f, NULL);
         if (unlikely(IS_ERR(o)))
         CDEBUG(D_INFO, "Find object for "DFID"\n", PFID(f));
         o = lu_object_find(env, &d->mdt_md_dev.md_lu_dev, f, NULL);
         if (unlikely(IS_ERR(o)))
-                m = (struct mdt_object *)o;
+                RETURN((struct mdt_object *)o);
         else
                 m = mdt_obj(o);
         else
                 m = mdt_obj(o);
+
+        if (check_exist == MDT_OBJ_MUST_EXIST && mdt_object_exists(m) == 0) {
+                mdt_object_put(env, m);
+                CERROR("%s: object "DFID" not found: rc = -2\n",
+                       mdt_obj_dev_name(m), PFID(f));
+                RETURN(ERR_PTR(-ENOENT));
+        }
         RETURN(m);
 }
 
         RETURN(m);
 }
 
@@ -2354,11 +2357,12 @@ void mdt_object_unlock(struct mdt_thread_info *info, struct mdt_object *o,
 struct mdt_object *mdt_object_find_lock(struct mdt_thread_info *info,
                                         const struct lu_fid *f,
                                         struct mdt_lock_handle *lh,
 struct mdt_object *mdt_object_find_lock(struct mdt_thread_info *info,
                                         const struct lu_fid *f,
                                         struct mdt_lock_handle *lh,
-                                        __u64 ibits)
+                                        __u64 ibits,
+                                        enum mdt_obj_exist check_exist)
 {
         struct mdt_object *o;
 
 {
         struct mdt_object *o;
 
-        o = mdt_object_find(info->mti_env, info->mti_mdt, f);
+        o = mdt_object_find(info->mti_env, info->mti_mdt, f, check_exist);
         if (!IS_ERR(o)) {
                 int rc;
 
         if (!IS_ERR(o)) {
                 int rc;
 
@@ -2462,10 +2466,11 @@ static int mdt_body_unpack(struct mdt_thread_info *info, __u32 flags)
                 mdt_set_capainfo(info, 0, &body->fid1,
                                  req_capsule_client_get(pill, &RMF_CAPA1));
 
                 mdt_set_capainfo(info, 0, &body->fid1,
                                  req_capsule_client_get(pill, &RMF_CAPA1));
 
-        obj = mdt_object_find(env, info->mti_mdt, &body->fid1);
+        obj = mdt_object_find(env, info->mti_mdt, &body->fid1,
+                              MDT_OBJ_MAY_NOT_EXIST);
         if (!IS_ERR(obj)) {
                 if ((flags & HABEO_CORPUS) &&
         if (!IS_ERR(obj)) {
                 if ((flags & HABEO_CORPUS) &&
-                    !mdt_object_exists(obj)) {
+                    mdt_object_exists(obj) == 0) {
                         mdt_object_put(env, obj);
                         /* for capability renew ENOENT will be handled in
                          * mdt_renew_capa */
                         mdt_object_put(env, obj);
                         /* for capability renew ENOENT will be handled in
                          * mdt_renew_capa */
@@ -5366,19 +5371,16 @@ static int mdt_fid2path(const struct lu_env *env, struct mdt_device *mdt,
         if (!fid_is_sane(&fp->gf_fid))
                 RETURN(-EINVAL);
 
         if (!fid_is_sane(&fp->gf_fid))
                 RETURN(-EINVAL);
 
-        obj = mdt_object_find(env, mdt, &fp->gf_fid);
+        obj = mdt_object_find(env, mdt, &fp->gf_fid, MDT_OBJ_MUST_EXIST);
         if (obj == NULL || IS_ERR(obj)) {
         if (obj == NULL || IS_ERR(obj)) {
-                CDEBUG(D_IOCTL, "no object "DFID": %ld\n",PFID(&fp->gf_fid),
+                CDEBUG(D_IOCTL, "%s: no object "DFID": %ld\n",
+                       mdt2obd_dev(mdt)->obd_name, PFID(&fp->gf_fid),
                        PTR_ERR(obj));
                        PTR_ERR(obj));
-                RETURN(-EINVAL);
+                RETURN(obj == NULL ? -EINVAL : PTR_ERR(obj));
         }
 
         }
 
-        rc = lu_object_exists(&obj->mot_obj.mo_lu);
-        if (rc <= 0) {
-                if (rc == -1)
-                        rc = -EREMOTE;
-                else
-                        rc = -ENOENT;
+        if (lu_object_exists(&obj->mot_obj.mo_lu) < 0) {
+                rc = -EREMOTE;
                 mdt_object_put(env, obj);
                 CDEBUG(D_IOCTL, "nonlocal object "DFID": %d\n",
                        PFID(&fp->gf_fid), rc);
                 mdt_object_put(env, obj);
                 CDEBUG(D_IOCTL, "nonlocal object "DFID": %d\n",
                        PFID(&fp->gf_fid), rc);
@@ -5476,9 +5478,13 @@ static int mdt_ioc_version_get(struct mdt_thread_info *mti, void *karg)
         lh = &mti->mti_lh[MDT_LH_PARENT];
         mdt_lock_reg_init(lh, LCK_CR);
 
         lh = &mti->mti_lh[MDT_LH_PARENT];
         mdt_lock_reg_init(lh, LCK_CR);
 
-        obj = mdt_object_find_lock(mti, fid, lh, MDS_INODELOCK_UPDATE);
-        if (IS_ERR(obj))
+        obj = mdt_object_find_lock(mti, fid, lh, MDS_INODELOCK_UPDATE,
+                                   MDT_OBJ_MUST_EXIST);
+        if (IS_ERR(obj)) {
+                if (PTR_ERR(obj) == -ENOENT)
+                        *(__u64 *)data->ioc_inlbuf2 = ENOENT_VERSION;
                 RETURN(PTR_ERR(obj));
                 RETURN(PTR_ERR(obj));
+        }
 
         rc = mdt_object_exists(obj);
         if (rc < 0) {
 
         rc = mdt_object_exists(obj);
         if (rc < 0) {
@@ -5488,15 +5494,13 @@ static int mdt_ioc_version_get(struct mdt_thread_info *mti, void *karg)
                  * fid, this is error to find remote object here
                  */
                 CERROR("nonlocal object "DFID"\n", PFID(fid));
                  * fid, this is error to find remote object here
                  */
                 CERROR("nonlocal object "DFID"\n", PFID(fid));
-        } else if (rc == 0) {
-                 *(__u64 *)data->ioc_inlbuf2 = ENOENT_VERSION;
-                rc = -ENOENT;
-        } else {
+        } else if (rc > 0) {
                 version = dt_version_get(mti->mti_env, mdt_obj2dt(obj));
                *(__u64 *)data->ioc_inlbuf2 = version;
                 rc = 0;
         }
         mdt_object_unlock_put(mti, obj, lh, 1);
                 version = dt_version_get(mti->mti_env, mdt_obj2dt(obj));
                *(__u64 *)data->ioc_inlbuf2 = version;
                 rc = 0;
         }
         mdt_object_unlock_put(mti, obj, lh, 1);
+
         RETURN(rc);
 }
 
         RETURN(rc);
 }
 
index 7782a11..b2889ed 100644 (file)
@@ -413,6 +413,11 @@ enum mdt_txn_op {
         MDT_TXN_LAST_RCVD_WRITE_OP,
 };
 
         MDT_TXN_LAST_RCVD_WRITE_OP,
 };
 
+enum mdt_obj_exist{
+        MDT_OBJ_MUST_EXIST,
+        MDT_OBJ_MAY_NOT_EXIST,
+};
+
 static inline const struct md_device_operations *
 mdt_child_ops(struct mdt_device * m)
 {
 static inline const struct md_device_operations *
 mdt_child_ops(struct mdt_device * m)
 {
@@ -485,6 +490,11 @@ static inline void mdt_export_evict(struct obd_export *exp)
         class_export_put(exp);
 }
 
         class_export_put(exp);
 }
 
+static inline const char *mdt_obj_dev_name(const struct mdt_object *obj)
+{
+        return lu_dev_name(obj->mot_obj.mo_lu.lo_dev);
+}
+
 int mdt_get_disposition(struct ldlm_reply *rep, int flag);
 void mdt_set_disposition(struct mdt_thread_info *info,
                         struct ldlm_reply *rep, int flag);
 int mdt_get_disposition(struct ldlm_reply *rep, int flag);
 void mdt_set_disposition(struct mdt_thread_info *info,
                         struct ldlm_reply *rep, int flag);
@@ -514,11 +524,13 @@ void mdt_object_unlock(struct mdt_thread_info *,
 
 struct mdt_object *mdt_object_find(const struct lu_env *,
                                    struct mdt_device *,
 
 struct mdt_object *mdt_object_find(const struct lu_env *,
                                    struct mdt_device *,
-                                   const struct lu_fid *);
+                                   const struct lu_fid *,
+                                   enum mdt_obj_exist check_exist);
 struct mdt_object *mdt_object_find_lock(struct mdt_thread_info *,
                                         const struct lu_fid *,
                                         struct mdt_lock_handle *,
 struct mdt_object *mdt_object_find_lock(struct mdt_thread_info *,
                                         const struct lu_fid *,
                                         struct mdt_lock_handle *,
-                                        __u64);
+                                        __u64 ibits,
+                                        enum mdt_obj_exist check_exist);
 void mdt_object_unlock_put(struct mdt_thread_info *,
                            struct mdt_object *,
                            struct mdt_lock_handle *,
 void mdt_object_unlock_put(struct mdt_thread_info *,
                            struct mdt_object *,
                            struct mdt_lock_handle *,
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.
                  */
                  * 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."
                 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;
                 }
                         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."
                 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;
 
         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))
         if (IS_ERR(o))
-                RETURN(rc = PTR_ERR(o));
+                RETURN(PTR_ERR(o));
 
         rc = mdt_object_exists(o);
         if (rc > 0) {
 
         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);
                 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);
                 /* 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,
 }
 
 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;
                                 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)) {
 
         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"
                         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;
         }
 
                         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);
 
         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");
                 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 |
         }
         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)
                              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)
 
         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) {
 
         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"
                 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);
 
         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);
         mdt_object_put(env, o);
+out_parent:
         if (parent != NULL)
                 mdt_object_put(env, parent);
         return rc;
         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;
 
         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));
 
         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) ||
                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);
 
                 /* 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,
                           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));
 
         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);
         }
 
                 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));
 
         if (IS_ERR(child))
                 GOTO(out_parent, result = PTR_ERR(child));
 
index 2ea6ed8..bfd5042 100644 (file)
@@ -163,7 +163,7 @@ static int mdt_last_rcvd_header_write(const struct lu_env *env,
 }
 
 static int mdt_last_rcvd_read(const struct lu_env *env, struct mdt_device *mdt,
 }
 
 static int mdt_last_rcvd_read(const struct lu_env *env, struct mdt_device *mdt,
-                              struct lsd_client_data *lcd, loff_t *off, 
+                              struct lsd_client_data *lcd, loff_t *off,
                               int index)
 {
         struct mdt_thread_info *mti;
                               int index)
 {
         struct mdt_thread_info *mti;
@@ -1089,7 +1089,8 @@ static void mdt_reconstruct_create(struct mdt_thread_info *mti,
                 return;
 
         /* if no error, so child was created with requested fid */
                 return;
 
         /* if no error, so child was created with requested fid */
-        child = mdt_object_find(mti->mti_env, mdt, mti->mti_rr.rr_fid2);
+        child = mdt_object_find(mti->mti_env, mdt, mti->mti_rr.rr_fid2,
+                                MDT_OBJ_MUST_EXIST);
         if (IS_ERR(child)) {
                 rc = PTR_ERR(child);
                 LCONSOLE_WARN("Child "DFID" lookup error %d."
         if (IS_ERR(child)) {
                 rc = PTR_ERR(child);
                 LCONSOLE_WARN("Child "DFID" lookup error %d."
@@ -1131,7 +1132,8 @@ static void mdt_reconstruct_setattr(struct mdt_thread_info *mti,
                 return;
 
         body = req_capsule_server_get(mti->mti_pill, &RMF_MDT_BODY);
                 return;
 
         body = req_capsule_server_get(mti->mti_pill, &RMF_MDT_BODY);
-        obj = mdt_object_find(mti->mti_env, mdt, mti->mti_rr.rr_fid1);
+        obj = mdt_object_find(mti->mti_env, mdt, mti->mti_rr.rr_fid1,
+                              MDT_OBJ_MUST_EXIST);
         if (IS_ERR(obj)) {
                 int rc = PTR_ERR(obj);
                 LCONSOLE_WARN(""DFID" lookup error %d."
         if (IS_ERR(obj)) {
                 int rc = PTR_ERR(obj);
                 LCONSOLE_WARN(""DFID" lookup error %d."
index 9922b82..523003c 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;
         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);
                 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,
         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));
 
         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);
 
         /* 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);
 
         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);
 
 
         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);
 
         if (!IS_ERR(o)) {
                 struct md_object *next = mdt_object_child(o);
 
@@ -488,7 +491,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);
                 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));
 
         if (IS_ERR(mo))
                 GOTO(out, rc = PTR_ERR(mo));
 
@@ -690,7 +694,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,
                                   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 */
         if (IS_ERR(mp)) {
                 rc = PTR_ERR(mp);
                 /* errors are possible here in cross-ref cases, see below */
@@ -733,7 +737,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. */
                  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];
         if (IS_ERR(mc))
                 GOTO(out_unlock_parent, rc = PTR_ERR(mc));
         child_lh = &info->mti_lh[MDT_LH_CHILD];
@@ -821,7 +826,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,
                 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));
 
                 if (IS_ERR(ms))
                         RETURN(PTR_ERR(ms));
 
@@ -841,7 +847,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,
         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));
 
         if (IS_ERR(mp))
                 RETURN(PTR_ERR(mp));
 
@@ -853,7 +859,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);
 
         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));
 
         if (IS_ERR(ms))
                 GOTO(out_unlock_parent, rc = PTR_ERR(ms));
 
@@ -952,7 +959,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,
         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));
 
         if (IS_ERR(mtgtdir))
                 RETURN(PTR_ERR(mtgtdir));
 
@@ -975,7 +983,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,
                 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));
 
                 if (IS_ERR(mtgt))
                         GOTO(out_unlock_tgtdir, rc = PTR_ERR(mtgt));
 
@@ -1071,7 +1080,8 @@ static int mdt_rename_sanity(struct mdt_thread_info *info, struct lu_fid *fid)
 
         do {
                 LASSERT(fid_is_sane(&dst_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,
                 if (!IS_ERR(dst)) {
                         rc = mdo_is_subdir(info->mti_env,
                                            mdt_object_child(dst), fid,
@@ -1144,7 +1154,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,
         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));
 
         if (IS_ERR(msrcdir))
                 GOTO(out_rename_lock, rc = PTR_ERR(msrcdir));
 
@@ -1168,7 +1179,7 @@ static int mdt_reint_rename(struct mdt_thread_info *info,
                 }
         } else {
                 mtgtdir = mdt_object_find(info->mti_env, info->mti_mdt,
                 }
         } 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));
 
                 if (IS_ERR(mtgtdir))
                         GOTO(out_unlock_source, rc = PTR_ERR(mtgtdir));
 
@@ -1177,10 +1188,7 @@ static int mdt_reint_rename(struct mdt_thread_info *info,
                 if (rc)
                         GOTO(out_put_target, rc);
 
                 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,
                         /* we lock the target dir if it is local */
                         rc = mdt_object_lock(info, mtgtdir, lh_tgtdirp,
                                              MDS_INODELOCK_UPDATE,
@@ -1202,7 +1210,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);
 
         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));
 
         if (IS_ERR(mold))
                 GOTO(out_unlock_target, rc = PTR_ERR(mold));
 
@@ -1235,7 +1244,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);
                         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));
 
                 if (IS_ERR(mnew))
                         GOTO(out_unlock_old, rc = PTR_ERR(mnew));
 
index f3b5537..0a34a9b 100644 (file)
@@ -359,7 +359,8 @@ int mdt_reint_setxattr(struct mdt_thread_info *info,
         /* ACLs were sent to clients under LCK_CR locks, so taking LCK_EX
          * to cancel them. */
         mdt_lock_reg_init(lh, LCK_EX);
         /* ACLs were sent to clients under LCK_CR locks, so taking LCK_EX
          * to cancel them. */
         mdt_lock_reg_init(lh, LCK_EX);
-        obj = mdt_object_find_lock(info, rr->rr_fid1, lh, lockpart);
+        obj = mdt_object_find_lock(info, rr->rr_fid1, lh, lockpart,
+                                   MDT_OBJ_MUST_EXIST);
         if (IS_ERR(obj))
                 GOTO(out, rc =  PTR_ERR(obj));
 
         if (IS_ERR(obj))
                 GOTO(out, rc =  PTR_ERR(obj));