From 1bf196aaf5adb9a1c67886c0cd6a780ec6838040 Mon Sep 17 00:00:00 2001 From: Fan Yong Date: Mon, 18 Jul 2016 12:39:47 +0800 Subject: [PATCH 1/1] LU-8592 mdt: hold mdt_device::mdt_md_root until service stop 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 Change-Id: Ifd7adbce9a68da537f592c64117f4ecafb0a9ec4 Reviewed-on: http://review.whamcloud.com/22438 Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Lai Siyao Reviewed-by: Alex Zhuravlev Reviewed-by: Oleg Drokin --- lustre/mdt/mdt_handler.c | 10 +++++----- lustre/mdt/mdt_open.c | 20 ++++++++++++++++---- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/lustre/mdt/mdt_handler.c b/lustre/mdt/mdt_handler.c index 42e7f7d..c3e8cf1 100644 --- a/lustre/mdt/mdt_handler.c +++ b/lustre/mdt/mdt_handler.c @@ -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); diff --git a/lustre/mdt/mdt_open.c b/lustre/mdt/mdt_open.c index 8d64eb8..9bd929f 100644 --- a/lustre/mdt/mdt_open.c +++ b/lustre/mdt/mdt_open.c @@ -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)) -- 1.8.3.1