Patch "fnic: Use the local variable instead of I/O flag to acquire io_req_lock in fnic_queuecommand() to avoid deadloack" has been added to the 4.1-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
fnic: Use the local variable instead of I/O flag to acquire io_req_lock in fnic_queuecommand() to avoid deadloack
to the 4.1-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
fnic-use-the-local-variable-instead-of-i-o-flag-to-acquire-io_req_lock-in-fnic_queuecommand-to-avoid-deadloack.patch
and it can be found in the queue-4.1 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
db196935d9562abec4510f48d887bc1f1e054fcfMon Sep 17 00:00:00 2001
From: Hiral Shah <[email protected]>
Date: Tue, 14 Jul 2015 07:08:57 -0700
Subject: fnic: Use the local variable instead of I/O flag to acquire io_req_lock in fnic_queuecommand() to avoid deadloack
From: Hiral Shah <[email protected]>
commit db196935d9562abec4510f48d887bc1f1e054fcf upstream.
We added changes in fnic driver patch 1.6.0.16 to acquire io_req_lock in fnic_queuecommand() before issuing I/O so that io completion is serialized. But when releasing the lock we check for the I/O flag and this could be modified if IO abort occurs before I/O completion. In this case we wont release the lock and causes deadlock in some scenerios. Using the local variable to check the IO lock status will resolve the problem.
--- drivers/scsi/fnic/fnic.h | 2 +- drivers/scsi/fnic/fnic_scsi.c | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-)
drivers/scsi/fnic/fnic.h +1 -1
@@ -39,7 +39,7 @@#define DRV_NAME "fnic"#define DRV_DESCRIPTION "Cisco FCoE HBA Driver" -#define DRV_VERSION "1.6.0.17" +#define DRV_VERSION "1.6.0.17a"#define PFX DRV_NAME ": "#define DFX DRV_NAME "%d: "
drivers/scsi/fnic/fnic_scsi.c +3 -1
@@ -425,6 +425,7 @@ static int fnic_queuecommand_lck(structunsigned long ptr;struct fc_rport_priv *rdata;spinlock_t *io_lock =NULL ; +int io_lock_acquired =0 ;if (unlikely (fnic_chk_state_flags_locked (fnic,FNIC_FLAGS_IO_BLOCKED )))return SCSI_MLQUEUE_HOST_BUSY ;
@@ -518,6 +519,7 @@ static int fnic_queuecommand_lck(structspin_lock_irqsave (io_lock, flags);/* initialize rest of io_req */ + io_lock_acquired =1 ; io_req->port_id = rport->port_id; io_req->start_time = jiffies;CMD_STATE (sc) =FNIC_IOREQ_CMD_PENDING ;
@@ -571,7 +573,7 @@ out: (((u64)CMD_FLAGS(sc) >> 32) | CMD_STATE(sc)));/* if only we issued IO, will we have the io lock */ -if (CMD_FLAGS (sc) &FNIC_IO_INITIALIZED ) +if (io_lock_acquired)spin_unlock_irqrestore (io_lock, flags);atomic_dec (&fnic->in_flight);
Patches currently in stable-queue which might be from [email protected] are
queue-4.1/fnic-use-the-local-variable-instead-of-i-o-flag-to-acquire-io_req_lock-in-fnic_queuecommand-to-avoid-deadloack.patch