From a316046fc475ecf61bd36345864645c78747ad59 Mon Sep 17 00:00:00 2001 From: Johann Lombardi Date: Fri, 22 Jan 2010 16:00:30 +0100 Subject: [PATCH] b=21686 revert attach 25564 bug 19557 --- 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, 53 insertions(+), 45 deletions(-) diff --git a/lustre/include/lustre_dlm.h b/lustre/include/lustre_dlm.h index 9d0e35e..6701dcf 100644 --- a/lustre/include/lustre_dlm.h +++ b/lustre/include/lustre_dlm.h @@ -795,6 +795,7 @@ 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 60a96c0..4d90174 100644 --- a/lustre/include/lustre_net.h +++ b/lustre/include/lustre_net.h @@ -1137,7 +1137,6 @@ 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 d62520a..fbaa94f 100644 --- a/lustre/ldlm/ldlm_internal.h +++ b/lustre/ldlm/ldlm_internal.h @@ -128,8 +128,6 @@ 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 1f1c2d4..1aaa7a0 100644 --- a/lustre/ldlm/ldlm_lib.c +++ b/lustre/ldlm/ldlm_lib.c @@ -522,42 +522,6 @@ 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 bcd7566..15450dd 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 d7c13e6..f195f04 100644 --- a/lustre/ldlm/ldlm_lockd.c +++ b/lustre/ldlm/ldlm_lockd.c @@ -2364,6 +2364,7 @@ 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); @@ -2420,7 +2421,6 @@ 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 5c6ffd0..ac2b974 100644 --- a/lustre/mds/handler.c +++ b/lustre/mds/handler.c @@ -539,7 +539,13 @@ static int mds_disconnect(struct obd_export *exp) LASSERT(exp); class_export_get(exp); - rc = server_disconnect_export(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 = mds_cleanup_mfd(exp); diff --git a/lustre/mgs/mgs_handler.c b/lustre/mgs/mgs_handler.c index f8b7892..33f02ec 100644 --- a/lustre/mgs/mgs_handler.c +++ b/lustre/mgs/mgs_handler.c @@ -128,7 +128,26 @@ static int mgs_disconnect(struct obd_export *exp) class_export_get(exp); mgs_counter_incr(exp, LPROC_MGS_DISCONNECT); - rc = server_disconnect_export(exp); + /* 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); class_export_put(exp); RETURN(rc); diff --git a/lustre/obdecho/echo.c b/lustre/obdecho/echo.c index ec65a08..d70944f 100644 --- a/lustre/obdecho/echo.c +++ b/lustre/obdecho/echo.c @@ -76,7 +76,24 @@ static int echo_disconnect(struct obd_export *exp) { LASSERT (exp != NULL); - return server_disconnect_export(exp); + 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); } static int echo_init_export(struct obd_export *exp) diff --git a/lustre/obdfilter/filter.c b/lustre/obdfilter/filter.c index 051b931..86a7f5f 100644 --- a/lustre/obdfilter/filter.c +++ b/lustre/obdfilter/filter.c @@ -2653,8 +2653,12 @@ static int filter_disconnect(struct obd_export *exp) lquota_clearinfo(filter_quota_interface_ref, exp, exp->exp_obd); - rc = server_disconnect_export(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); + lprocfs_exp_cleanup(exp); class_export_put(exp); RETURN(rc); } -- 1.8.3.1