| From f089afe44761ff5a1aaf26bf731e64e79bc9888b Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 11 Jan 2021 15:25:41 +0100 |
| Subject: scsi: scsi_transport_srp: Don't block target in failfast state |
| |
| From: Martin Wilck <mwilck@suse.com> |
| |
| [ Upstream commit 72eeb7c7151302ef007f1acd018cbf6f30e50321 ] |
| |
| 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> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/scsi/scsi_transport_srp.c | 9 ++++++++- |
| 1 file changed, 8 insertions(+), 1 deletion(-) |
| |
| diff --git a/drivers/scsi/scsi_transport_srp.c b/drivers/scsi/scsi_transport_srp.c |
| index 456ce9f19569f..a0e35028ebdac 100644 |
| --- a/drivers/scsi/scsi_transport_srp.c |
| +++ b/drivers/scsi/scsi_transport_srp.c |
| @@ -555,7 +555,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); |
| -- |
| 2.27.0 |
| |