Skip to content

Commit

Permalink
scsi: qla2xxx: Fix losing target when it reappears during delete
Browse files Browse the repository at this point in the history
commit 118b0c8 upstream.

FC target disappeared during port perturbation tests due to a race that
tramples target state.  Fix the issue by adding state checks before
proceeding.

Link: https://lore.kernel.org/r/[email protected]
Fixes: 44c57f2 ("scsi: qla2xxx: Changes to support FCP2 Target")
Cc: [email protected]
Signed-off-by: Arun Easi <[email protected]>
Signed-off-by: Nilesh Javali <[email protected]>
Signed-off-by: Martin K. Petersen <[email protected]>
Signed-off-by: Greg Kroah-Hartman <[email protected]>
  • Loading branch information
Arun Easi authored and gregkh committed Aug 17, 2022
1 parent 420e449 commit 6f1d5e6
Showing 1 changed file with 17 additions and 7 deletions.
24 changes: 17 additions & 7 deletions drivers/scsi/qla2xxx/qla_attr.c
Original file line number Diff line number Diff line change
Expand Up @@ -2705,17 +2705,24 @@ qla2x00_dev_loss_tmo_callbk(struct fc_rport *rport)
if (!fcport)
return;

/* Now that the rport has been deleted, set the fcport state to
FCS_DEVICE_DEAD */
qla2x00_set_fcport_state(fcport, FCS_DEVICE_DEAD);

/*
* Now that the rport has been deleted, set the fcport state to
* FCS_DEVICE_DEAD, if the fcport is still lost.
*/
if (fcport->scan_state != QLA_FCPORT_FOUND)
qla2x00_set_fcport_state(fcport, FCS_DEVICE_DEAD);

/*
* Transport has effectively 'deleted' the rport, clear
* all local references.
*/
spin_lock_irqsave(host->host_lock, flags);
fcport->rport = fcport->drport = NULL;
*((fc_port_t **)rport->dd_data) = NULL;
/* Confirm port has not reappeared before clearing pointers. */
if (rport->port_state != FC_PORTSTATE_ONLINE) {
fcport->rport = fcport->drport = NULL;
*((fc_port_t **)rport->dd_data) = NULL;
}
spin_unlock_irqrestore(host->host_lock, flags);

if (test_bit(ABORT_ISP_ACTIVE, &fcport->vha->dpc_flags))
Expand Down Expand Up @@ -2748,9 +2755,12 @@ qla2x00_terminate_rport_io(struct fc_rport *rport)
/*
* At this point all fcport's software-states are cleared. Perform any
* final cleanup of firmware resources (PCBs and XCBs).
*
* Attempt to cleanup only lost devices.
*/
if (fcport->loop_id != FC_NO_LOOP_ID) {
if (IS_FWI2_CAPABLE(fcport->vha->hw)) {
if (IS_FWI2_CAPABLE(fcport->vha->hw) &&
fcport->scan_state != QLA_FCPORT_FOUND) {
if (fcport->loop_id != FC_NO_LOOP_ID)
fcport->logout_on_delete = 1;

Expand All @@ -2760,7 +2770,7 @@ qla2x00_terminate_rport_io(struct fc_rport *rport)
__LINE__);
qlt_schedule_sess_for_deletion(fcport);
}
} else {
} else if (!IS_FWI2_CAPABLE(fcport->vha->hw)) {
qla2x00_port_logout(fcport->vha, fcport);
}
}
Expand Down

0 comments on commit 6f1d5e6

Please sign in to comment.