From: Li Dongyang Date: Wed, 14 Sep 2011 06:02:40 +0000 (+0800) Subject: xen-blkfront: fix a deadlock while handling discard response X-Git-Tag: upstream/snapshot3+hdmi~8808^2~3^2~9 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=69ef68cef961a934c35308843a04b26d91cad4a8;p=platform%2Fadaptation%2Frenesas_rcar%2Frenesas_kernel.git xen-blkfront: fix a deadlock while handling discard response When we get -EOPNOTSUPP response for a discard request, we will clear the discard flag on the request queue so we won't attempt to send discard requests to backend again, and this should be protected under rq->queue_lock. However, when we setup the request queue, we pass blkif_io_lock to blk_init_queue so rq->queue_lock is blkif_io_lock indeed, and this lock is already taken when we are in blkif_interrpt, so remove the spin_lock/spin_unlock when we clear the discard flag or we will end up with deadlock here Signed-off-by: Li Dongyang [v1: Updated description a bit and removed comment from source] Signed-off-by: Konrad Rzeszutek Wilk --- diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c index 52076b0..7d14877 100644 --- a/drivers/block/xen-blkfront.c +++ b/drivers/block/xen-blkfront.c @@ -747,9 +747,7 @@ static irqreturn_t blkif_interrupt(int irq, void *dev_id) info->gd->disk_name); error = -EOPNOTSUPP; info->feature_discard = 0; - spin_lock(rq->queue_lock); queue_flag_clear(QUEUE_FLAG_DISCARD, rq); - spin_unlock(rq->queue_lock); } __blk_end_request_all(req, error); break;