From 41ab260642f4923106da3567d7c75e1ca3c61ea4 Mon Sep 17 00:00:00 2001 From: tappro Date: Wed, 17 Jun 2009 20:59:31 +0000 Subject: [PATCH] Branch HEAD b=19550 i=rread Remove loop for obd refcount waiting and add asserts against possible obd refcount leaks --- lustre/mdt/mdt_handler.c | 21 --------------------- lustre/obdclass/genops.c | 4 +++- lustre/obdclass/obd_config.c | 1 + 3 files changed, 4 insertions(+), 22 deletions(-) diff --git a/lustre/mdt/mdt_handler.c b/lustre/mdt/mdt_handler.c index 39ffd89..c299486 100644 --- a/lustre/mdt/mdt_handler.c +++ b/lustre/mdt/mdt_handler.c @@ -4328,30 +4328,9 @@ static void mdt_fini(const struct lu_env *env, struct mdt_device *m) struct lu_device *d = &m->mdt_md_dev.md_lu_dev; struct lu_site *ls = d->ld_site; struct obd_device *obd = mdt2obd_dev(m); - int waited = 0; ENTRY; target_recovery_fini(obd); - /* At this point, obd exports might still be on the "obd_zombie_exports" - * list, and obd_zombie_impexp_thread() is trying to destroy them. - * We wait a little bit until all exports (except the self-export) - * have been destroyed, because the whole mdt stack might be accessed - * in mdt_destroy_export(). This will not be a long time, maybe one or - * two seconds are enough. This is not a problem while umounting. - * - * The three references that should be remaining are the - * obd_self_export and the attach and setup references. - */ - while (atomic_read(&obd->obd_refcount) > 3) { - cfs_schedule_timeout(CFS_TASK_UNINT, cfs_time_seconds(1)); - ++waited; - if (waited > 5 && IS_PO2(waited)) - LCONSOLE_WARN("Waiting for obd_zombie_impexp_thread " - "more than %d seconds to destroy all " - "the exports. The current obd refcount =" - " %d. Is it stuck there?\n", - waited, atomic_read(&obd->obd_refcount)); - } ping_evictor_stop(); diff --git a/lustre/obdclass/genops.c b/lustre/obdclass/genops.c index 3b28d9f..a74ee18 100644 --- a/lustre/obdclass/genops.c +++ b/lustre/obdclass/genops.c @@ -1064,8 +1064,10 @@ int class_disconnect(struct obd_export *export) /* class_cleanup(), abort_recovery(), and class_fail_export() * all end up in here, and if any of them race we shouldn't * call extra class_export_puts(). */ - if (already_disconnected) + if (already_disconnected) { + LASSERT(hlist_unhashed(&export->exp_nid_hash)); GOTO(no_disconn, already_disconnected); + } CDEBUG(D_IOCTL, "disconnect: cookie "LPX64"\n", export->exp_handle.h_cookie); diff --git a/lustre/obdclass/obd_config.c b/lustre/obdclass/obd_config.c index 759d0de..a6917f1 100644 --- a/lustre/obdclass/obd_config.c +++ b/lustre/obdclass/obd_config.c @@ -576,6 +576,7 @@ int class_cleanup(struct obd_device *obd, struct lustre_cfg *lcfg) struct obd_device *class_incref(struct obd_device *obd, const char *scope, const void *source) { + LASSERT(!obd->obd_stopping); lu_ref_add_atomic(&obd->obd_reference, scope, source); atomic_inc(&obd->obd_refcount); CDEBUG(D_INFO, "incref %s (%p) now %d\n", obd->obd_name, obd, -- 1.8.3.1