From: shadow Date: Tue, 31 Mar 2009 07:22:05 +0000 (+0000) Subject: don't leak obd reference on failed llog setup X-Git-Tag: v1_8_0_110~147 X-Git-Url: https://git.whamcloud.com/gitweb?a=commitdiff_plain;h=fbb4838efed12712ef4dd8c5d646afa7a94ac3c3;p=fs%2Flustre-release.git don't leak obd reference on failed llog setup Branch b1_8 b=18896 i=tappro i=rread --- diff --git a/lustre/ChangeLog b/lustre/ChangeLog index 857d69a..a01dd5b 100644 --- a/lustre/ChangeLog +++ b/lustre/ChangeLog @@ -190,6 +190,13 @@ Details : create_count always drops to the min value (=32) because grow_count information, please refer to bugzilla 17630. Severity : normal +Frequency : rare, on failed llog setup +Bugzilla : 18896 +Descriptoin: don't leak obd reference on failed llog setup +Details : for failed llog setup - mgc forget call class_destroy_import for + client import, move destroy import to more generic place. + +Severity : normal Frequency : rare Bugzilla : 18902 Descriptoin: allow kill process which wait statahead result diff --git a/lustre/ldlm/ldlm_lib.c b/lustre/ldlm/ldlm_lib.c index bf00227..6152596 100644 --- a/lustre/ldlm/ldlm_lib.c +++ b/lustre/ldlm/ldlm_lib.c @@ -361,7 +361,13 @@ err: int client_obd_cleanup(struct obd_device *obddev) { + struct client_obd *cli = &obddev->u.cli; ENTRY; + + /* cleanup can be called for never connected obd */ + if (cli->cl_import) + class_destroy_import(cli->cl_import); + ldlm_put_ref(); RETURN(0); } diff --git a/lustre/mdc/mdc_request.c b/lustre/mdc/mdc_request.c index f29c1eb..2cfc156 100644 --- a/lustre/mdc/mdc_request.c +++ b/lustre/mdc/mdc_request.c @@ -1466,9 +1466,7 @@ static int mdc_precleanup(struct obd_device *obd, enum obd_cleanup_stage stage) imp = obd->u.cli.cl_import; CERROR("client import never connected\n"); ptlrpc_invalidate_import(imp); - class_destroy_import(imp); up_write(&obd->u.cli.cl_sem); - obd->u.cli.cl_import = NULL; } rc = obd_llog_finish(obd, 0); if (rc != 0) diff --git a/lustre/osc/osc_request.c b/lustre/osc/osc_request.c index 2e75753..3b4915b 100644 --- a/lustre/osc/osc_request.c +++ b/lustre/osc/osc_request.c @@ -4214,19 +4214,10 @@ static int osc_precleanup(struct obd_device *obd, enum obd_cleanup_stage stage) /* If we set up but never connected, the client import will not have been cleaned. */ if (obd->u.cli.cl_import) { - struct obd_import *imp; - down_write(&obd->u.cli.cl_sem); - imp = obd->u.cli.cl_import; + struct obd_import *imp = obd->u.cli.cl_import; CDEBUG(D_CONFIG, "%s: client import never connected\n", obd->obd_name); ptlrpc_invalidate_import(imp); - if (imp->imp_rq_pool) { - ptlrpc_free_rq_pool(imp->imp_rq_pool); - imp->imp_rq_pool = NULL; - } - class_destroy_import(imp); - up_write(&obd->u.cli.cl_sem); - obd->u.cli.cl_import = NULL; } rc = obd_llog_finish(obd, 0); if (rc != 0) @@ -4244,6 +4235,7 @@ static int osc_precleanup(struct obd_device *obd, enum obd_cleanup_stage stage) int osc_cleanup(struct obd_device *obd) { struct osc_creator *oscc = &obd->u.cli.cl_oscc; + struct obd_import *imp = obd->u.cli.cl_import; int rc; ENTRY; @@ -4259,6 +4251,11 @@ int osc_cleanup(struct obd_device *obd) lquota_cleanup(quota_interface, obd); cache_destroy(obd->u.cli.cl_cache); + if (imp && imp->imp_rq_pool) { + ptlrpc_free_rq_pool(imp->imp_rq_pool); + imp->imp_rq_pool = NULL; + } + rc = client_obd_cleanup(obd); ptlrpcd_decref();