diff options
| author | Martin Wilck <mwilck@suse.com> | 2021-01-11 15:25:41 +0100 | 
|---|---|---|
| committer | Martin K. Petersen <martin.petersen@oracle.com> | 2021-01-12 22:56:49 -0500 | 
| commit | 72eeb7c7151302ef007f1acd018cbf6f30e50321 (patch) | |
| tree | 85438ab45094ef6e861d573d7303f8600cd870bb /drivers/scsi | |
| parent | f2cb4b2397ca9e6e972d6551e5461d1f1d81c23f (diff) | |
scsi: scsi_transport_srp: Don't block target in failfast state
If the port is in SRP_RPORT_FAIL_FAST state when srp_reconnect_rport() is
entered, a transition to SDEV_BLOCK would be illegal, and a kernel WARNING
would be triggered. Skip scsi_target_block() in this case.
Link: https://lore.kernel.org/r/20210111142541.21534-1-mwilck@suse.com
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
Signed-off-by: Martin Wilck <mwilck@suse.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Diffstat (limited to 'drivers/scsi')
| -rw-r--r-- | drivers/scsi/scsi_transport_srp.c | 9 | 
1 files changed, 8 insertions, 1 deletions
| diff --git a/drivers/scsi/scsi_transport_srp.c b/drivers/scsi/scsi_transport_srp.c index cba1cf6a1c12..1e939a2a387f 100644 --- a/drivers/scsi/scsi_transport_srp.c +++ b/drivers/scsi/scsi_transport_srp.c @@ -541,7 +541,14 @@ int srp_reconnect_rport(struct srp_rport *rport)  	res = mutex_lock_interruptible(&rport->mutex);  	if (res)  		goto out; -	scsi_target_block(&shost->shost_gendev); +	if (rport->state != SRP_RPORT_FAIL_FAST) +		/* +		 * sdev state must be SDEV_TRANSPORT_OFFLINE, transition +		 * to SDEV_BLOCK is illegal. Calling scsi_target_unblock() +		 * later is ok though, scsi_internal_device_unblock_nowait() +		 * treats SDEV_TRANSPORT_OFFLINE like SDEV_BLOCK. +		 */ +		scsi_target_block(&shost->shost_gendev);  	res = rport->state != SRP_RPORT_LOST ? i->f->reconnect(rport) : -ENODEV;  	pr_debug("%s (state %d): transport.reconnect() returned %d\n",  		 dev_name(&shost->shost_gendev), rport->state, res); | 
