Hi, This needs to be copied to stable, added in cc. Thanks, ~Saurav >From: David Jeffery <djeffery@xxxxxxxxxx> > >When the qla2xxx driver loses access to multiple, remote ports, there is >a race >condition which can occur which will keep the request stuck on a scsi >request >queue indefinitely. > >This bad state occurred do to a race condition with how the >FCPORT_UPDATE_NEEDED >bit is set in qla2x00_schedule_rport_del(), and how it is cleared in >qla2x00_do_dpc(). The problem port has its drport pointer set, but it >has never >been processed by the driver to inform the fc transport that the port has >been >lost. qla2x00_schedule_rport_del() sets drport, and then sets the >FCPORT_UPDATE_NEEDED bit. In qla2x00_do_dpc(), the port lists are walked >and >any drport pointer is handled and the fc transport informed of the port >loss, >then the FCPORT_UPDATE_NEEDED bit is cleared. This leaves a race where >the >dpc thread is processing one port removal, another port removal is marked >with a call to qla2x00_schedule_rport_del(), and the dpc thread clears the >bit for both removals, even though only the first removal was actually >handled. Until another event occurs to set FCPORT_UPDATE_NEEDED, the >later >port removal is never finished and qla2xxx stays in a bad state which >causes >requests to become stuck on request queues. > >This patch updates the driver to test and clear FCPORT_UPDATE_NEEDED >atomically. This ensures the port state changes are processed and not >lost. > >Signed-off-by: David Jeffery <djeffery@xxxxxxxxxx> >Signed-off-by: Chad Dupuis <chad.dupuis@xxxxxxxxxx> >Cc: stable@xxxxxxxxxxxxxxx >Signed-off-by: Saurav Kashyap <saurav.kashyap@xxxxxxxxxx> >--- > drivers/scsi/qla2xxx/qla_os.c | 4 ++-- > 1 files changed, 2 insertions(+), 2 deletions(-) > >diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c >index d501bf5..a603967 100644 >--- a/drivers/scsi/qla2xxx/qla_os.c >+++ b/drivers/scsi/qla2xxx/qla_os.c >@@ -4505,9 +4505,9 @@ qla2x00_do_dpc(void *data) > "ISP abort end.\n"); > } > >- if (test_bit(FCPORT_UPDATE_NEEDED, &base_vha->dpc_flags)) { >+ if (test_and_clear_bit(FCPORT_UPDATE_NEEDED, >+ &base_vha->dpc_flags)) { > qla2x00_update_fcports(base_vha); >- clear_bit(FCPORT_UPDATE_NEEDED, &base_vha->dpc_flags); > } > > if (test_bit(SCR_PENDING, &base_vha->dpc_flags)) { >-- >1.7.7 > ________________________________ This message and any attached documents contain information from QLogic Corporation or its wholly-owned subsidiaries that may be confidential. If you are not the intended recipient, you may not read, copy, distribute, or use this information. If you have received this transmission in error, please notify the sender immediately by reply e-mail and then delete this message. -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html