Re: [Open-FCoE] [PATCH 4/4] libfc: Fix fc_fcp_cleanup_each_cmd()

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

 



On Tue, 2015-05-26 at 13:09 +0200, Bart Van Assche wrote:
> Since fc_fcp_cleanup_cmd() can sleep this function must not
> be called while holding a spinlock. This patch avoids that
> fc_fcp_cleanup_each_cmd() triggers the following bug:
> 
> BUG: scheduling while atomic: sg_reset/1512/0x00000202
> 1 lock held by sg_reset/1512:
>  #0:  (&(&fsp->scsi_pkt_lock)->rlock){+.-...}, at: [<ffffffffc0225cd5>] fc_fcp_cleanup_each_cmd.isra.21+0xa5/0x150 [libfc]
> Preemption disabled at:[<ffffffffc0225cd5>] fc_fcp_cleanup_each_cmd.isra.21+0xa5/0x150 [libfc]
> Call Trace:
>  [<ffffffff816c612c>] dump_stack+0x4f/0x7b
>  [<ffffffff810828bc>] __schedule_bug+0x6c/0xd0
>  [<ffffffff816c87aa>] __schedule+0x71a/0xa10
>  [<ffffffff816c8ad2>] schedule+0x32/0x80
>  [<ffffffffc0217eac>] fc_seq_set_resp+0xac/0x100 [libfc]
>  [<ffffffffc0218b11>] fc_exch_done+0x41/0x60 [libfc]
>  [<ffffffffc0225cff>] fc_fcp_cleanup_each_cmd.isra.21+0xcf/0x150 [libfc]
>  [<ffffffffc0225f43>] fc_eh_device_reset+0x1c3/0x270 [libfc]
>  [<ffffffff814a2cc9>] scsi_try_bus_device_reset+0x29/0x60
>  [<ffffffff814a3908>] scsi_ioctl_reset+0x258/0x2d0
>  [<ffffffff814a2650>] scsi_ioctl+0x150/0x440
>  [<ffffffff814b3a9d>] sd_ioctl+0xad/0x120
>  [<ffffffff8132f266>] blkdev_ioctl+0x1b6/0x810
>  [<ffffffff811da608>] block_ioctl+0x38/0x40
>  [<ffffffff811b4e08>] do_vfs_ioctl+0x2f8/0x530
>  [<ffffffff811b50c1>] SyS_ioctl+0x81/0xa0
>  [<ffffffff816cf8b2>] system_call_fastpath+0x16/0x7a
> 
> Signed-off-by: Bart Van Assche <bart.vanassche@xxxxxxxxxxx>
> Cc: stable <stable@xxxxxxxxxxxxxxx>
> ---
>  drivers/scsi/libfc/fc_fcp.c | 10 ++++++++--
>  1 file changed, 8 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/scsi/libfc/fc_fcp.c b/drivers/scsi/libfc/fc_fcp.c
> index 4cd49d4..daaad5c 100644
> --- a/drivers/scsi/libfc/fc_fcp.c
> +++ b/drivers/scsi/libfc/fc_fcp.c
> @@ -1039,11 +1039,17 @@ restart:
>  		fc_fcp_pkt_hold(fsp);
>  		spin_unlock_irqrestore(&si->scsi_queue_lock, flags);
>  
> -		if (!fc_fcp_lock_pkt(fsp)) {
> +		spin_lock_bh(&fsp->scsi_pkt_lock);
> +		if (!(fsp->state & FC_SRB_COMPL)) {
> +			fsp->state |= FC_SRB_COMPL;
> +			spin_unlock_bh(&fsp->scsi_pkt_lock);

Dropping here and then taking same lock again just after
fc_fcp_cleanup_cmd() done calling since we had schedule() calling from
fc_fcp_cleanup_cmd()...but question is why even we added schedule()
which is now causing this side effect in this commit:-

commit 7030fd626129ec4d616784516a462d317c251d39
Author: Bart Van Assche <bvanassche@xxxxxxx>
Date:   Sat Aug 17 20:34:43 2013 +0000

May be we should remove schedule() there which again does ep->ex_lock
drop and re-grab logic for schedule. Do we really need schedule there
added by above patch ?

Thanks,
Vasu

> +
>  			fc_fcp_cleanup_cmd(fsp, error);
> +
> +			spin_lock_bh(&fsp->scsi_pkt_lock);

>  			fc_io_compl(fsp);
> -			fc_fcp_unlock_pkt(fsp);
>  		}
> +		spin_unlock_bh(&fsp->scsi_pkt_lock);
>  


>  		fc_fcp_pkt_release(fsp);
>  		spin_lock_irqsave(&si->scsi_queue_lock, flags);


--
To unsubscribe from this list: send the line "unsubscribe target-devel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux SCSI]     [Kernel Newbies]     [Linux SCSI Target Infrastructure]     [Share Photos]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Device Mapper]

  Powered by Linux