Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Martin Wilck and committed by
Martin K. Petersen
72eeb7c7 f2cb4b23

+8 -1
+8 -1
drivers/scsi/scsi_transport_srp.c
··· 541 541 res = mutex_lock_interruptible(&rport->mutex); 542 542 if (res) 543 543 goto out; 544 - scsi_target_block(&shost->shost_gendev); 544 + if (rport->state != SRP_RPORT_FAIL_FAST) 545 + /* 546 + * sdev state must be SDEV_TRANSPORT_OFFLINE, transition 547 + * to SDEV_BLOCK is illegal. Calling scsi_target_unblock() 548 + * later is ok though, scsi_internal_device_unblock_nowait() 549 + * treats SDEV_TRANSPORT_OFFLINE like SDEV_BLOCK. 550 + */ 551 + scsi_target_block(&shost->shost_gendev); 545 552 res = rport->state != SRP_RPORT_LOST ? i->f->reconnect(rport) : -ENODEV; 546 553 pr_debug("%s (state %d): transport.reconnect() returned %d\n", 547 554 dev_name(&shost->shost_gendev), rport->state, res);