staging/lustre/ptlrpc: don't try to recover no_recov connection
authorAndreas Dilger <andreas.dilger@intel.com>
Sun, 27 Apr 2014 17:06:33 +0000 (13:06 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 27 Apr 2014 17:21:38 +0000 (10:21 -0700)
If a connection has been stopped with ptlrpc_pinger_del_import() and
marked obd_no_recov, don't reconnect in ptlrpc_disconnect_import() if
the import is already disconnected.  Otherwise, without the pinger it
will just wait there indefinitely for the reconnection that will never
happen.

Put the obd_no_recov check inside ptlrpc_import_in_recovery() so that
any threads waiting on the connection to recover would also be broken
out of their sleep if obd_no_recov is set.

Signed-off-by: Andreas Dilger <andreas.dilger@intel.com>
Reviewed-on: http://review.whamcloud.com/8996
Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-4413
Reviewed-by: Nathaniel Clark <nathaniel.l.clark@intel.com>
Reviewed-by: wangdi <di.wang@intel.com>
Signed-off-by: Oleg Drokin <oleg.drokin@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/lustre/lustre/ptlrpc/import.c
drivers/staging/lustre/lustre/ptlrpc/recover.c

index a04a1cc8780909a47fcee96bbb0963cd21a568c4..b231452d62151bda546a2acb6299ef1d89f53e73 100644 (file)
@@ -1404,26 +1404,33 @@ int ptlrpc_disconnect_import(struct obd_import *imp, int noclose)
 {
        struct ptlrpc_request *req;
        int rq_opc, rc = 0;
-       int nowait = imp->imp_obd->obd_force;
 
-       if (nowait)
+       if (imp->imp_obd->obd_force)
                GOTO(set_state, rc);
 
        switch (imp->imp_connect_op) {
-       case OST_CONNECT: rq_opc = OST_DISCONNECT; break;
-       case MDS_CONNECT: rq_opc = MDS_DISCONNECT; break;
-       case MGS_CONNECT: rq_opc = MGS_DISCONNECT; break;
+       case OST_CONNECT:
+               rq_opc = OST_DISCONNECT;
+               break;
+       case MDS_CONNECT:
+               rq_opc = MDS_DISCONNECT;
+               break;
+       case MGS_CONNECT:
+               rq_opc = MGS_DISCONNECT;
+               break;
        default:
-               CERROR("don't know how to disconnect from %s (connect_op %d)\n",
-                      obd2cli_tgt(imp->imp_obd), imp->imp_connect_op);
-               return -EINVAL;
+               rc = -EINVAL;
+               CERROR("%s: don't know how to disconnect from %s "
+                      "(connect_op %d): rc = %d\n",
+                      imp->imp_obd->obd_name, obd2cli_tgt(imp->imp_obd),
+                      imp->imp_connect_op, rc);
+               return rc;
        }
 
        if (ptlrpc_import_in_recovery(imp)) {
                struct l_wait_info lwi;
                cfs_duration_t timeout;
 
-
                if (AT_OFF) {
                        if (imp->imp_server_timeout)
                                timeout = cfs_time_seconds(obd_timeout / 2);
@@ -1446,7 +1453,6 @@ int ptlrpc_disconnect_import(struct obd_import *imp, int noclose)
        spin_lock(&imp->imp_lock);
        if (imp->imp_state != LUSTRE_IMP_FULL)
                GOTO(out, 0);
-
        spin_unlock(&imp->imp_lock);
 
        req = ptlrpc_request_alloc_pack(imp, &RQF_MDS_DISCONNECT,
@@ -1479,6 +1485,9 @@ out:
        memset(&imp->imp_remote_handle, 0, sizeof(imp->imp_remote_handle));
        spin_unlock(&imp->imp_lock);
 
+       if (rc == -ETIMEDOUT || rc == -ENOTCONN || rc == -ESHUTDOWN)
+               rc = 0;
+
        return rc;
 }
 EXPORT_SYMBOL(ptlrpc_disconnect_import);
index 48ae328ce24ec138063647ab68b5e824c4a6b8a4..4cff2f7ba4125bac5259d807a2ca7183c1aeac50 100644 (file)
@@ -369,11 +369,14 @@ EXPORT_SYMBOL(ptlrpc_recover_import);
 int ptlrpc_import_in_recovery(struct obd_import *imp)
 {
        int in_recovery = 1;
+
        spin_lock(&imp->imp_lock);
        if (imp->imp_state == LUSTRE_IMP_FULL ||
            imp->imp_state == LUSTRE_IMP_CLOSED ||
-           imp->imp_state == LUSTRE_IMP_DISCON)
+           imp->imp_state == LUSTRE_IMP_DISCON ||
+           imp->imp_obd->obd_no_recov)
                in_recovery = 0;
        spin_unlock(&imp->imp_lock);
+
        return in_recovery;
 }