Whamcloud - gitweb
simplify disconnecting client export and avoid sending requests after client is
authorshadow <shadow>
Thu, 15 Oct 2009 02:42:36 +0000 (02:42 +0000)
committershadow <shadow>
Thu, 15 Oct 2009 02:42:36 +0000 (02:42 +0000)
dead.

Branch HEAD
b=19557
i=tappro
i=shadow

lustre/include/lustre_dlm.h
lustre/include/lustre_net.h
lustre/ldlm/ldlm_internal.h
lustre/ldlm/ldlm_lib.c
lustre/ldlm/ldlm_lockd.c
lustre/mdt/mdt_handler.c
lustre/mgs/mgs_handler.c
lustre/obdecho/echo.c
lustre/obdfilter/filter.c

index 13794ac..042458e 100644 (file)
@@ -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);
index 6d46b00..5f5e840 100644 (file)
@@ -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
index c01a702..c3f6937 100644 (file)
@@ -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);
index c9d52fd..334ee8b 100644 (file)
@@ -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
  * -------------------------------------------------------------------------- */
index 30b251e..9f3dc50 100644 (file)
@@ -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);
index 6cc0c6c..3b75b40 100644 (file)
@@ -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);
index bac0bff..d45f690 100644 (file)
@@ -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);
index f63b4a2..67f9a0b 100644 (file)
@@ -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)
index f4b9cbd..5016618 100644 (file)
@@ -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);
 }