Re: [PATCH 1/1] 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 flags 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.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hiral Shah <hishah@xxxxxxxxx> writes:

> Signed-off-by: Hiral Shah <hishah@xxxxxxxxx>
> Signed-off-by: Sesidhar Baddela <sebaddel@xxxxxxxxx>
> Signed-off-by: Anil Chintalapati <achintal@xxxxxxxxx>
> ---
>  drivers/scsi/fnic/fnic.h      | 2 +-
>  drivers/scsi/fnic/fnic_scsi.c | 4 +++-
>  2 files changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/scsi/fnic/fnic.h b/drivers/scsi/fnic/fnic.h
> index 26270c3..ce129e5 100644
> --- a/drivers/scsi/fnic/fnic.h
> +++ b/drivers/scsi/fnic/fnic.h
> @@ -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: "
>  
> diff --git a/drivers/scsi/fnic/fnic_scsi.c b/drivers/scsi/fnic/fnic_scsi.c
> index 155b286..25436cd 100644
> --- a/drivers/scsi/fnic/fnic_scsi.c
> +++ b/drivers/scsi/fnic/fnic_scsi.c
> @@ -425,6 +425,7 @@ static int fnic_queuecommand_lck(struct scsi_cmnd *sc, void (*done)(struct scsi_
>  	unsigned 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(struct scsi_cmnd *sc, void (*done)(struct scsi_
>  	spin_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);

Can't you just use
if (spin_is_locked(io_lock))
   spin_unlock_irqrestore(io_lock, flags);


>  
>  	atomic_dec(&fnic->in_flight);

Johannes

-- 
Johannes Thumshirn                                       Storage
jthumshirn@xxxxxxx                             +49 911 74053 689
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: F. Imendörffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton
HRB 21284 (AG Nürnberg)
--
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



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]
  Powered by Linux