From d6cbaaf0424af30aee454b4cf7a809388dcd58a0 Mon Sep 17 00:00:00 2001 From: Johann Lombardi Date: Fri, 12 Mar 2010 15:17:49 +0100 Subject: [PATCH] b=21686 simplify client disconnect code on server side o=liang i=johann i=shadow attach 25564 This patch was reverted because we were chasing some regression. It is now safe to re-apply. --- lustre/include/lustre_dlm.h | 1 - lustre/include/lustre_net.h | 1 + lustre/ldlm/ldlm_internal.h | 2 ++ lustre/ldlm/ldlm_lib.c | 36 ++++++++++++++++++++++++++++++++++++ lustre/ldlm/ldlm_lock.c | 2 +- lustre/ldlm/ldlm_lockd.c | 2 +- lustre/mds/handler.c | 8 +------- lustre/mgs/mgs_handler.c | 21 +-------------------- lustre/obdecho/echo.c | 19 +------------------ lustre/obdfilter/filter.c | 6 +----- 10 files changed, 45 insertions(+), 53 deletions(-) diff --git a/lustre/include/lustre_dlm.h b/lustre/include/lustre_dlm.h index 72cffe9..3939a23 100644 --- a/lustre/include/lustre_dlm.h +++ b/lustre/include/lustre_dlm.h @@ -795,7 +795,6 @@ ldlm_mode_t ldlm_lock_match(struct ldlm_namespace *ns, int flags, struct ldlm_resource *ldlm_lock_convert(struct ldlm_lock *lock, int new_mode, __u32 *flags); 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 5e6264a..c50eaad 100644 --- a/lustre/include/lustre_net.h +++ b/lustre/include/lustre_net.h @@ -1140,6 +1140,7 @@ int client_import_add_conn(struct obd_import *imp, struct obd_uuid *uuid, int priority); 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); +int server_disconnect_export(struct obd_export *exp); /* ptlrpc/pinger.c */ enum timeout_event { diff --git a/lustre/ldlm/ldlm_internal.h b/lustre/ldlm/ldlm_internal.h index fbaa94f..d62520a 100644 --- a/lustre/ldlm/ldlm_internal.h +++ b/lustre/ldlm/ldlm_internal.h @@ -128,6 +128,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 96d2bb4..4c8a02b 100644 --- a/lustre/ldlm/ldlm_lib.c +++ b/lustre/ldlm/ldlm_lib.c @@ -521,6 +521,42 @@ 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); + ptlrpc_schedule_difficult_reply(rs); + 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_lock.c b/lustre/ldlm/ldlm_lock.c index 15450dd..bcd7566 100644 --- a/lustre/ldlm/ldlm_lock.c +++ b/lustre/ldlm/ldlm_lock.c @@ -1570,13 +1570,13 @@ void ldlm_lock_cancel(struct ldlm_lock *lock) } ldlm_del_waiting_lock(lock); - /* Releases res lock */ ldlm_cancel_callback(lock); /* Yes, second time, just in case it was added again while we were running with no res lock in ldlm_cancel_callback */ ldlm_del_waiting_lock(lock); + ldlm_resource_unlink_lock(lock); ldlm_lock_destroy_nolock(lock); diff --git a/lustre/ldlm/ldlm_lockd.c b/lustre/ldlm/ldlm_lockd.c index 0301daf..80b204b 100644 --- a/lustre/ldlm/ldlm_lockd.c +++ b/lustre/ldlm/ldlm_lockd.c @@ -2367,7 +2367,6 @@ EXPORT_SYMBOL(ldlm_lock_set_data); 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); @@ -2424,6 +2423,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_abort_recovery); EXPORT_SYMBOL(target_cleanup_recovery); EXPORT_SYMBOL(target_handle_connect); diff --git a/lustre/mds/handler.c b/lustre/mds/handler.c index fd38393..7c529c2 100644 --- a/lustre/mds/handler.c +++ b/lustre/mds/handler.c @@ -539,13 +539,7 @@ static int mds_disconnect(struct obd_export *exp) LASSERT(exp); class_export_get(exp); - /* 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); - - /* release nid stat refererence */ - lprocfs_exp_cleanup(exp); + rc = server_disconnect_export(exp); rc = mds_cleanup_mfd(exp); diff --git a/lustre/mgs/mgs_handler.c b/lustre/mgs/mgs_handler.c index 33f02ec..f8b7892 100644 --- a/lustre/mgs/mgs_handler.c +++ b/lustre/mgs/mgs_handler.c @@ -128,26 +128,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); - ptlrpc_schedule_difficult_reply(rs); - 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 d70944f..ec65a08 100644 --- a/lustre/obdecho/echo.c +++ b/lustre/obdecho/echo.c @@ -76,24 +76,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); - ptlrpc_schedule_difficult_reply(rs); - 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 210c9ba..48edb8f 100644 --- a/lustre/obdfilter/filter.c +++ b/lustre/obdfilter/filter.c @@ -2636,12 +2636,8 @@ 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); - lprocfs_exp_cleanup(exp); class_export_put(exp); RETURN(rc); } -- 1.8.3.1