Skip to content

Commit e658519

Browse files
steffen-maiermartinkpetersen
authored andcommitted
scsi: zfcp: Defer fc_rport blocking until after ADISC response
Storage devices are free to send RSCNs, e.g. for internal state changes. If this happens on all connected paths, zfcp risks temporarily losing all paths at the same time. This has strong requirements on multipath configuration such as "no_path_retry queue". Avoid such situations by deferring fc_rport blocking until after the ADISC response, when any actual state change of the remote port became clear. The already existing port recovery triggers explicitly block the fc_rport. The triggers are: on ADISC reject or timeout (typical cable pull case), and on ADISC indicating that the remote port has changed its WWPN or the port is meanwhile no longer open. As a side effect, this also removes a confusing direct function call to another work item function zfcp_scsi_rport_work() instead of scheduling that other work item. It was probably done that way to have the rport block side effect immediate and synchronous to the caller. Fixes: a2fa0ae ("[SCSI] zfcp: Block FC transport rports early on errors") Cc: stable@vger.kernel.org #v2.6.30+ Reviewed-by: Benjamin Block <bblock@linux.ibm.com> Reviewed-by: Fedor Loshakov <loshakov@linux.ibm.com> Signed-off-by: Steffen Maier <maier@linux.ibm.com> Link: https://lore.kernel.org/r/20230724145156.3920244-1-maier@linux.ibm.com Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
1 parent 010c1e1 commit e658519

File tree

1 file changed

+1
-5
lines changed

1 file changed

+1
-5
lines changed

drivers/s390/scsi/zfcp_fc.c

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -534,8 +534,7 @@ static void zfcp_fc_adisc_handler(void *data)
534534

535535
/* re-init to undo drop from zfcp_fc_adisc() */
536536
port->d_id = ntoh24(adisc_resp->adisc_port_id);
537-
/* port is good, unblock rport without going through erp */
538-
zfcp_scsi_schedule_rport_register(port);
537+
/* port is still good, nothing to do */
539538
out:
540539
atomic_andnot(ZFCP_STATUS_PORT_LINK_TEST, &port->status);
541540
put_device(&port->dev);
@@ -595,9 +594,6 @@ void zfcp_fc_link_test_work(struct work_struct *work)
595594
int retval;
596595

597596
set_worker_desc("zadisc%16llx", port->wwpn); /* < WORKER_DESC_LEN=24 */
598-
get_device(&port->dev);
599-
port->rport_task = RPORT_DEL;
600-
zfcp_scsi_rport_work(&port->rport_work);
601597

602598
/* only issue one test command at one time per port */
603599
if (atomic_read(&port->status) & ZFCP_STATUS_PORT_LINK_TEST)

0 commit comments

Comments
 (0)