summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLi Dongyang <lidongyang@novell.com>2011-09-14 14:02:40 +0800
committerKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>2011-10-13 09:48:32 -0400
commit69ef68cef961a934c35308843a04b26d91cad4a8 (patch)
treebf7bebecdcd53aa75f80fb1e066f2293a2483916
parented30bf317c5ceb25166cdbce3e0b35e33c82b509 (diff)
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 <lidongyang@novell.com> [v1: Updated description a bit and removed comment from source] Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
-rw-r--r--drivers/block/xen-blkfront.c2
1 files changed, 0 insertions, 2 deletions
diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c
index 52076b0d0326..7d1487760283 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;