Patchwork [3.5.y.z,extended,stable] Patch "qla2xxx: Test and clear FCPORT_UPDATE_NEEDED atomically." has been added to staging queue

mail settings
Submitter Herton Ronaldo Krzesinski
Date Jan. 7, 2013, 8:35 p.m.
Message ID <>
Download mbox | patch
Permalink /patch/210178/
State New
Headers show


Herton Ronaldo Krzesinski - Jan. 7, 2013, 8:35 p.m.
This is a note to let you know that I have just added a patch titled

    qla2xxx: Test and clear FCPORT_UPDATE_NEEDED atomically.

to the linux-3.5.y-queue branch of the 3.5.y.z extended stable tree 
which can be found at:;a=shortlog;h=refs/heads/linux-3.5.y-queue

If you, or anyone else, feels it should not be added to this tree, please 
reply to this email.

For more information about the 3.5.y.z tree, see



From dd9cbd631d05876ee9e3fc9713c39f1a75fc7417 Mon Sep 17 00:00:00 2001
From: David Jeffery <>
Date: Wed, 21 Nov 2012 02:39:54 -0500
Subject: [PATCH] qla2xxx: Test and clear FCPORT_UPDATE_NEEDED atomically.

commit a394aac88506159e047630fc90dc2242568382d8 upstream.

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 <>
Signed-off-by: Chad Dupuis <>
Signed-off-by: Saurav Kashyap <>
Signed-off-by: James Bottomley <>
Signed-off-by: Herton Ronaldo Krzesinski <>
 drivers/scsi/qla2xxx/qla_os.c |    4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)



diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c
index 6d1d873..f6f555a 100644
--- a/drivers/scsi/qla2xxx/qla_os.c
+++ b/drivers/scsi/qla2xxx/qla_os.c
@@ -3801,9 +3801,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)) {
-			clear_bit(FCPORT_UPDATE_NEEDED, &base_vha->dpc_flags);

 		if (test_bit(SCR_PENDING, &base_vha->dpc_flags)) {