Whamcloud - gitweb
b=21686 simplify client disconnect code on server side
authorJohann Lombardi <johann@sun.com>
Fri, 12 Mar 2010 14:17:49 +0000 (15:17 +0100)
committerJohann Lombardi <johann@sun.com>
Fri, 12 Mar 2010 14:17:49 +0000 (15:17 +0100)
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
lustre/include/lustre_net.h
lustre/ldlm/ldlm_internal.h
lustre/ldlm/ldlm_lib.c
lustre/ldlm/ldlm_lock.c
lustre/ldlm/ldlm_lockd.c
lustre/mds/handler.c
lustre/mgs/mgs_handler.c
lustre/obdecho/echo.c
lustre/obdfilter/filter.c

index 72cffe9..3939a23 100644 (file)
@@ -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);
index 5e6264a..c50eaad 100644 (file)
@@ -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 {
index fbaa94f..d62520a 100644 (file)
@@ -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);
index 96d2bb4..4c8a02b 100644 (file)
@@ -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
  * -------------------------------------------------------------------------- */
index 15450dd..bcd7566 100644 (file)
@@ -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);
 
index 0301daf..80b204b 100644 (file)
@@ -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);
index fd38393..7c529c2 100644 (file)
@@ -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);
 
index 33f02ec..f8b7892 100644 (file)
@@ -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);
index d70944f..ec65a08 100644 (file)
@@ -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)
index 210c9ba..48edb8f 100644 (file)
@@ -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);
 }