From 7e2daf1cd54d99f46e1bbb4b2d1a6f2269a4142e Mon Sep 17 00:00:00 2001 From: shadow Date: Thu, 15 Oct 2009 02:42:36 +0000 Subject: [PATCH] simplify disconnecting client export and avoid sending requests after client is dead. Branch HEAD b=19557 i=tappro i=shadow --- lustre/include/lustre_dlm.h | 1 - lustre/include/lustre_net.h | 2 ++ lustre/ldlm/ldlm_internal.h | 2 ++ lustre/ldlm/ldlm_lib.c | 37 +++++++++++++++++++++++++++++++++++++ lustre/ldlm/ldlm_lockd.c | 2 +- lustre/mdt/mdt_handler.c | 27 +++------------------------ lustre/mgs/mgs_handler.c | 23 +---------------------- lustre/obdecho/echo.c | 21 +-------------------- lustre/obdfilter/filter.c | 7 +------ 9 files changed, 48 insertions(+), 74 deletions(-) diff --git a/lustre/include/lustre_dlm.h b/lustre/include/lustre_dlm.h index 13794ac..042458e 100644 --- a/lustre/include/lustre_dlm.h +++ b/lustre/include/lustre_dlm.h @@ -974,7 +974,6 @@ struct ldlm_resource *ldlm_lock_convert(struct ldlm_lock *lock, int new_mode, __u32 *flags); void ldlm_lock_downgrade(struct ldlm_lock *lock, int new_mode); void ldlm_lock_cancel(struct ldlm_lock *lock); -void ldlm_cancel_locks_for_export(struct obd_export *export); void ldlm_reprocess_all(struct ldlm_resource *res); void ldlm_reprocess_all_ns(struct ldlm_namespace *ns); void ldlm_lock_dump(int level, struct ldlm_lock *lock, int pos); diff --git a/lustre/include/lustre_net.h b/lustre/include/lustre_net.h index 6d46b00..5f5e840 100644 --- a/lustre/include/lustre_net.h +++ b/lustre/include/lustre_net.h @@ -1319,6 +1319,8 @@ int client_import_del_conn(struct obd_import *imp, struct obd_uuid *uuid); int import_set_conn_priority(struct obd_import *imp, struct obd_uuid *uuid); void client_destroy_import(struct obd_import *imp); +int server_disconnect_export(struct obd_export *exp); + /* ptlrpc/pinger.c */ enum timeout_event { TIMEOUT_GRANT = 1 diff --git a/lustre/ldlm/ldlm_internal.h b/lustre/ldlm/ldlm_internal.h index c01a702..c3f6937 100644 --- a/lustre/ldlm/ldlm_internal.h +++ b/lustre/ldlm/ldlm_internal.h @@ -131,6 +131,8 @@ void ldlm_lock_add_to_lru(struct ldlm_lock *lock); void ldlm_lock_touch_in_lru(struct ldlm_lock *lock); void ldlm_lock_destroy_nolock(struct ldlm_lock *lock); +void ldlm_cancel_locks_for_export(struct obd_export *export); + /* ldlm_lockd.c */ int ldlm_bl_to_thread_lock(struct ldlm_namespace *ns, struct ldlm_lock_desc *ld, struct ldlm_lock *lock); diff --git a/lustre/ldlm/ldlm_lib.c b/lustre/ldlm/ldlm_lib.c index c9d52fd..334ee8b 100644 --- a/lustre/ldlm/ldlm_lib.c +++ b/lustre/ldlm/ldlm_lib.c @@ -548,6 +548,43 @@ int client_disconnect_export(struct obd_export *exp) RETURN(rc); } +int server_disconnect_export(struct obd_export *exp) +{ + int rc; + ENTRY; + + /* Disconnect early so that clients can't keep using export */ + rc = class_disconnect(exp); + /* close import for avoid sending any requests */ + if (exp->exp_imp_reverse) + ptlrpc_cleanup_imp(exp->exp_imp_reverse); + + if (exp->exp_obd->obd_namespace != NULL) + ldlm_cancel_locks_for_export(exp); + + /* complete all outstanding replies */ + spin_lock(&exp->exp_lock); + while (!list_empty(&exp->exp_outstanding_replies)) { + struct ptlrpc_reply_state *rs = + list_entry(exp->exp_outstanding_replies.next, + struct ptlrpc_reply_state, rs_exp_list); + struct ptlrpc_service *svc = rs->rs_service; + + spin_lock(&svc->srv_lock); + list_del_init(&rs->rs_exp_list); + spin_lock(&rs->rs_lock); + ptlrpc_schedule_difficult_reply(rs); + spin_unlock(&rs->rs_lock); + spin_unlock(&svc->srv_lock); + } + spin_unlock(&exp->exp_lock); + + /* release nid stat refererence */ + lprocfs_exp_cleanup(exp); + + RETURN(rc); +} + /* -------------------------------------------------------------------------- * from old lib/target.c * -------------------------------------------------------------------------- */ diff --git a/lustre/ldlm/ldlm_lockd.c b/lustre/ldlm/ldlm_lockd.c index 30b251e..9f3dc50 100644 --- a/lustre/ldlm/ldlm_lockd.c +++ b/lustre/ldlm/ldlm_lockd.c @@ -2538,7 +2538,6 @@ EXPORT_SYMBOL(ldlm_lock_change_resource); EXPORT_SYMBOL(ldlm_it2str); EXPORT_SYMBOL(ldlm_lock_dump); EXPORT_SYMBOL(ldlm_lock_dump_handle); -EXPORT_SYMBOL(ldlm_cancel_locks_for_export); EXPORT_SYMBOL(ldlm_reprocess_all_ns); EXPORT_SYMBOL(ldlm_lock_allow_match_locked); EXPORT_SYMBOL(ldlm_lock_allow_match); @@ -2603,6 +2602,7 @@ EXPORT_SYMBOL(client_obd_setup); EXPORT_SYMBOL(client_obd_cleanup); EXPORT_SYMBOL(client_connect_import); EXPORT_SYMBOL(client_disconnect_export); +EXPORT_SYMBOL(server_disconnect_export); EXPORT_SYMBOL(target_stop_recovery_thread); EXPORT_SYMBOL(target_handle_connect); EXPORT_SYMBOL(target_cleanup_recovery); diff --git a/lustre/mdt/mdt_handler.c b/lustre/mdt/mdt_handler.c index 6cc0c6c..3b75b40 100644 --- a/lustre/mdt/mdt_handler.c +++ b/lustre/mdt/mdt_handler.c @@ -5168,37 +5168,16 @@ out_lmm: static int mdt_obd_disconnect(struct obd_export *exp) { - struct mdt_device *mdt = mdt_dev(exp->exp_obd->obd_lu_dev); int rc; ENTRY; LASSERT(exp); class_export_get(exp); - /* Disconnect early so that clients can't keep using export */ - rc = class_disconnect(exp); - if (mdt->mdt_namespace != NULL || exp->exp_obd->obd_namespace != NULL) - ldlm_cancel_locks_for_export(exp); - - /* release nid stat refererence */ - lprocfs_exp_cleanup(exp); + rc = server_disconnect_export(exp); + if (rc != 0) + CDEBUG(D_IOCTL, "server disconnect error: %d\n", rc); - /* complete all outstanding replies */ - spin_lock(&exp->exp_lock); - while (!list_empty(&exp->exp_outstanding_replies)) { - struct ptlrpc_reply_state *rs = - list_entry(exp->exp_outstanding_replies.next, - struct ptlrpc_reply_state, rs_exp_list); - struct ptlrpc_service *svc = rs->rs_service; - - spin_lock(&svc->srv_lock); - list_del_init(&rs->rs_exp_list); - spin_lock(&rs->rs_lock); - ptlrpc_schedule_difficult_reply(rs); - spin_unlock(&rs->rs_lock); - spin_unlock(&svc->srv_lock); - } - spin_unlock(&exp->exp_lock); rc = mdt_mfd_cleanup(exp); class_export_put(exp); RETURN(rc); diff --git a/lustre/mgs/mgs_handler.c b/lustre/mgs/mgs_handler.c index bac0bff..d45f690 100644 --- a/lustre/mgs/mgs_handler.c +++ b/lustre/mgs/mgs_handler.c @@ -132,28 +132,7 @@ static int mgs_disconnect(struct obd_export *exp) class_export_get(exp); mgs_counter_incr(exp, LPROC_MGS_DISCONNECT); - /* Disconnect early so that clients can't keep using export */ - rc = class_disconnect(exp); - ldlm_cancel_locks_for_export(exp); - - lprocfs_exp_cleanup(exp); - - /* complete all outstanding replies */ - spin_lock(&exp->exp_lock); - while (!list_empty(&exp->exp_outstanding_replies)) { - struct ptlrpc_reply_state *rs = - list_entry(exp->exp_outstanding_replies.next, - struct ptlrpc_reply_state, rs_exp_list); - struct ptlrpc_service *svc = rs->rs_service; - - spin_lock(&svc->srv_lock); - list_del_init(&rs->rs_exp_list); - spin_lock(&rs->rs_lock); - ptlrpc_schedule_difficult_reply(rs); - spin_unlock(&rs->rs_lock); - spin_unlock(&svc->srv_lock); - } - spin_unlock(&exp->exp_lock); + rc = server_disconnect_export(exp); class_export_put(exp); RETURN(rc); diff --git a/lustre/obdecho/echo.c b/lustre/obdecho/echo.c index f63b4a2..67f9a0b 100644 --- a/lustre/obdecho/echo.c +++ b/lustre/obdecho/echo.c @@ -88,26 +88,7 @@ static int echo_disconnect(struct obd_export *exp) { LASSERT (exp != NULL); - ldlm_cancel_locks_for_export(exp); - - /* complete all outstanding replies */ - spin_lock(&exp->exp_lock); - while (!list_empty(&exp->exp_outstanding_replies)) { - struct ptlrpc_reply_state *rs = - list_entry(exp->exp_outstanding_replies.next, - struct ptlrpc_reply_state, rs_exp_list); - struct ptlrpc_service *svc = rs->rs_service; - - spin_lock(&svc->srv_lock); - list_del_init(&rs->rs_exp_list); - spin_lock(&rs->rs_lock); - ptlrpc_schedule_difficult_reply(rs); - spin_unlock(&rs->rs_lock); - spin_unlock(&svc->srv_lock); - } - spin_unlock(&exp->exp_lock); - - return class_disconnect(exp); + return server_disconnect_export(exp); } static int echo_init_export(struct obd_export *exp) diff --git a/lustre/obdfilter/filter.c b/lustre/obdfilter/filter.c index f4b9cbd..5016618 100644 --- a/lustre/obdfilter/filter.c +++ b/lustre/obdfilter/filter.c @@ -3058,15 +3058,10 @@ static int filter_disconnect(struct obd_export *exp) lquota_clearinfo(filter_quota_interface_ref, exp, exp->exp_obd); - /* Disconnect early so that clients can't keep using export */ - rc = class_disconnect(exp); - if (exp->exp_obd->obd_namespace != NULL) - ldlm_cancel_locks_for_export(exp); + rc = server_disconnect_export(exp); fsfilt_sync(obd, obd->u.obt.obt_sb); - lprocfs_exp_cleanup(exp); - class_export_put(exp); RETURN(rc); } -- 1.8.3.1