Whamcloud - gitweb
LU-3528 mdt: check object exists for remote directory 71/8371/8
authorwang di <di.wang@intel.com>
Tue, 17 Dec 2013 00:06:22 +0000 (16:06 -0800)
committerOleg Drokin <oleg.drokin@intel.com>
Fri, 20 Dec 2013 02:20:13 +0000 (02:20 +0000)
Check whether the remote object exists before enqueue and
getattr to avoid LBUG.

Remove unnecssary remote object exist check in mdd_object_lock.

Signed-off-by: wang di <di.wang@intel.com>
Change-Id: Ia634a8c7b9cd2810515e854163c5fdd6bdf8716f
Reviewed-on: http://review.whamcloud.com/8371
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: John L. Hammond <john.hammond@intel.com>
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/mdd/mdd_object.c
lustre/mdt/mdt_handler.c
lustre/mdt/mdt_reint.c

index 69d4c30..52a0cf6 100644 (file)
@@ -2004,7 +2004,6 @@ static int mdd_object_lock(const struct lu_env *env,
                           void *policy)
 {
        struct mdd_object *mdd_obj = md2mdd_obj(obj);
                           void *policy)
 {
        struct mdd_object *mdd_obj = md2mdd_obj(obj);
-       LASSERT(mdd_object_exists(mdd_obj));
        return dt_object_lock(env, mdd_object_child(mdd_obj), lh,
                              einfo, policy);
 }
        return dt_object_lock(env, mdd_object_child(mdd_obj), lh,
                              einfo, policy);
 }
index 8daf7e1..1ad4f40 100644 (file)
@@ -1325,6 +1325,14 @@ static int mdt_getattr_name_lock(struct mdt_thread_info *info,
                }
                 if (rc == 0) {
                         /* Finally, we can get attr for child. */
                }
                 if (rc == 0) {
                         /* Finally, we can get attr for child. */
+                       if (!mdt_object_exists(child)) {
+                               LU_OBJECT_DEBUG(D_INFO, info->mti_env,
+                                               &child->mot_obj,
+                                            "remote object doesn't exist.\n");
+                                mdt_object_unlock(info, child, lhc, 1);
+                               RETURN(-ENOENT);
+                       }
+
                         mdt_set_capainfo(info, 0, mdt_object_fid(child),
                                          BYPASS_CAPA);
                         rc = mdt_getattr_internal(info, child, 0);
                         mdt_set_capainfo(info, 0, mdt_object_fid(child),
                                          BYPASS_CAPA);
                         rc = mdt_getattr_internal(info, child, 0);
index 5b5a1b0..7e89ad6 100644 (file)
@@ -950,6 +950,13 @@ static int mdt_reint_link(struct mdt_thread_info *info,
         if (IS_ERR(ms))
                 GOTO(out_unlock_parent, rc = PTR_ERR(ms));
 
         if (IS_ERR(ms))
                 GOTO(out_unlock_parent, rc = PTR_ERR(ms));
 
+       if (!mdt_object_exists(ms)) {
+               mdt_object_put(info->mti_env, ms);
+               CDEBUG(D_INFO, "%s: "DFID" does not exist.\n",
+                      mdt_obd_name(info->mti_mdt), PFID(rr->rr_fid1));
+               GOTO(out_unlock_parent, rc = -ENOENT);
+       }
+
        if (mdt_object_remote(ms)) {
                mdt_object_put(info->mti_env, ms);
                CERROR("%s: source inode "DFID" on remote MDT from "DFID"\n",
        if (mdt_object_remote(ms)) {
                mdt_object_put(info->mti_env, ms);
                CERROR("%s: source inode "DFID" on remote MDT from "DFID"\n",