From: Bart Van Assche Date: Sat, 12 Nov 2016 00:55:50 +0000 (-0800) Subject: scsi: scsi_transport_fc: Hold queue lock while calling blk_run_queue_async() X-Git-Tag: v4.10-rc1~128^2~93 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=378eeade1fa907ab6f6795560d94d9e67ca9353d;p=platform%2Fkernel%2Flinux-exynos.git scsi: scsi_transport_fc: Hold queue lock while calling blk_run_queue_async() It is required to hold the queue lock when calling blk_run_queue_async() to avoid that a race between blk_run_queue_async() and blk_cleanup_queue() is triggered. Additionally, remove the get_device() and put_device() calls from fc_bsg_goose_queue. It is namely the responsibility of the caller of fc_bsg_goose_queue() to ensure that the bsg queue does not disappear while fc_bsg_goose_queue() is in progress. Signed-off-by: Bart Van Assche Cc: Hannes Reinecke Cc: James Smart Reviewed-by: James Smart Signed-off-by: Martin K. Petersen --- diff --git a/drivers/scsi/scsi_transport_fc.c b/drivers/scsi/scsi_transport_fc.c index 4534085..e05c07f 100644 --- a/drivers/scsi/scsi_transport_fc.c +++ b/drivers/scsi/scsi_transport_fc.c @@ -3855,15 +3855,15 @@ fail_host_msg: static void fc_bsg_goose_queue(struct fc_rport *rport) { - if (!rport->rqst_q) + struct request_queue *q = rport->rqst_q; + unsigned long flags; + + if (!q) return; - /* - * This get/put dance makes no sense - */ - get_device(&rport->dev); - blk_run_queue_async(rport->rqst_q); - put_device(&rport->dev); + spin_lock_irqsave(q->queue_lock, flags); + blk_run_queue_async(q); + spin_unlock_irqrestore(q->queue_lock, flags); } /**