staging/lustre/ptlrpc: don't try to recover no_recov connection
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>hifive-unleashed-5.1
parent
34554afc05
commit
88291a7a6b
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue