From 8de508c7a1c971f94e5e0f915e3c7d577fbcd899 Mon Sep 17 00:00:00 2001 From: shadow Date: Thu, 15 Oct 2009 01:57:58 +0000 Subject: [PATCH] simplify client export disconnect on server side. Branch b1_8 b=19557 i=tappro i=shadow --- lustre/include/lustre_dlm.h | 1 - lustre/include/lustre_net.h | 1 + lustre/ldlm/ldlm_internal.h | 2 ++ lustre/ldlm/ldlm_lib.c | 38 ++++++++++++++++++++++++++++++++++++++ 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, 47 insertions(+), 53 deletions(-) diff --git a/lustre/include/lustre_dlm.h b/lustre/include/lustre_dlm.h index 4dfd12d..1e1cadc 100644 --- a/lustre/include/lustre_dlm.h +++ b/lustre/include/lustre_dlm.h @@ -780,7 +780,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 d7ff6c9..067beac 100644 --- a/lustre/include/lustre_net.h +++ b/lustre/include/lustre_net.h @@ -1137,6 +1137,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 f6b4d30..2d898d6 100644 --- a/lustre/ldlm/ldlm_internal.h +++ b/lustre/ldlm/ldlm_internal.h @@ -127,6 +127,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 e1b1f2e..0faab9c 100644 --- a/lustre/ldlm/ldlm_lib.c +++ b/lustre/ldlm/ldlm_lib.c @@ -522,6 +522,44 @@ 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 9a97126..51f3d76 100644 --- a/lustre/ldlm/ldlm_lock.c +++ b/lustre/ldlm/ldlm_lock.c @@ -1562,13 +1562,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 d396144..f16c537 100644 --- a/lustre/ldlm/ldlm_lockd.c +++ b/lustre/ldlm/ldlm_lockd.c @@ -2365,7 +2365,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); @@ -2422,6 +2421,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 9fde0f3..df0f3d2 100644 --- a/lustre/mds/handler.c +++ b/lustre/mds/handler.c @@ -535,13 +535,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); /* complete all outstanding replies */ spin_lock(&exp->exp_lock); diff --git a/lustre/mgs/mgs_handler.c b/lustre/mgs/mgs_handler.c index 2a3f1d7..4e6630a 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 46f4719..947ebfe 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 8a6c218..01fc2a2 100644 --- a/lustre/obdfilter/filter.c +++ b/lustre/obdfilter/filter.c @@ -2649,12 +2649,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