Whamcloud - gitweb
LU-8592 mdt: hold mdt_device::mdt_md_root until service stop 38/22438/10
authorFan Yong <fan.yong@intel.com>
Mon, 18 Jul 2016 04:39:47 +0000 (12:39 +0800)
committerOleg Drokin <oleg.drokin@intel.com>
Thu, 13 Oct 2016 23:36:19 +0000 (23:36 +0000)
Otherwise, if someone is using such object, it may trigger
object reference ASSERTION(atomic_read(&o->lo_header->loh_ref) > 0).

Signed-off-by: Fan Yong <fan.yong@intel.com>
Change-Id: Ifd7adbce9a68da537f592c64117f4ecafb0a9ec4
Reviewed-on: http://review.whamcloud.com/22438
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Lai Siyao <lai.siyao@intel.com>
Reviewed-by: Alex Zhuravlev <alexey.zhuravlev@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/mdt/mdt_handler.c
lustre/mdt/mdt_open.c

index 42e7f7d..c3e8cf1 100644 (file)
@@ -4509,11 +4509,6 @@ static void mdt_fini(const struct lu_env *env, struct mdt_device *m)
        struct lfsck_stop        stop;
        ENTRY;
 
-       if (m->mdt_md_root != NULL) {
-               mdt_object_put(env, m->mdt_md_root);
-               m->mdt_md_root = NULL;
-       }
-
        stop.ls_status = LS_PAUSED;
        stop.ls_flags = 0;
        next->md_ops->mdo_iocontrol(env, next, OBD_IOC_STOP_LFSCK, 0, &stop);
@@ -4548,6 +4543,11 @@ static void mdt_fini(const struct lu_env *env, struct mdt_device *m)
                d->ld_obd->obd_namespace = m->mdt_namespace = NULL;
        }
 
+       if (m->mdt_md_root != NULL) {
+               mdt_object_put(env, m->mdt_md_root);
+               m->mdt_md_root = NULL;
+       }
+
        mdt_quota_fini(env, m);
 
        cfs_free_nidlist(&m->mdt_squash.rsi_nosquash_nids);
index 8d64eb8..9bd929f 100644 (file)
@@ -1189,10 +1189,22 @@ static int mdt_lock_root_xattr(struct mdt_thread_info *info,
                        return PTR_ERR(md_root);
 
                spin_lock(&mdt->mdt_lock);
-               if (mdt->mdt_md_root != NULL)
-                       mdt_object_put(info->mti_env, mdt->mdt_md_root);
-               mdt->mdt_md_root = md_root;
-               spin_unlock(&mdt->mdt_lock);
+               if (mdt->mdt_md_root != NULL) {
+                       spin_unlock(&mdt->mdt_lock);
+
+                       LASSERTF(mdt->mdt_md_root == md_root,
+                                "Different root object ("
+                                DFID") instances, %p, %p\n",
+                                PFID(&info->mti_tmp_fid1),
+                                mdt->mdt_md_root, md_root);
+                       LASSERT(atomic_read(
+                               &md_root->mot_obj.lo_header->loh_ref) > 1);
+
+                       mdt_object_put(info->mti_env, md_root);
+               } else {
+                       mdt->mdt_md_root = md_root;
+                       spin_unlock(&mdt->mdt_lock);
+               }
        }
 
        if (md_root->mot_cache_attr || !mdt_object_remote(md_root))