diff options
Diffstat (limited to 'drivers/md/dm.c')
| -rw-r--r-- | drivers/md/dm.c | 8 | 
1 files changed, 7 insertions, 1 deletions
diff --git a/drivers/md/dm.c b/drivers/md/dm.c index 02db9183ca0..77e6eff41ca 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c @@ -740,8 +740,14 @@ static void rq_completed(struct mapped_device *md, int rw, int run_queue)  	if (!md_in_flight(md))  		wake_up(&md->wait); +	/* +	 * Run this off this callpath, as drivers could invoke end_io while +	 * inside their request_fn (and holding the queue lock). Calling +	 * back into ->request_fn() could deadlock attempting to grab the +	 * queue lock again. +	 */  	if (run_queue) -		blk_run_queue(md->queue); +		blk_run_queue_async(md->queue);  	/*  	 * dm_put() must be at the end of this function. See the comment above  |