Commit d862b13b authored by Maxim Levitsky's avatar Maxim Levitsky Committed by Linus Torvalds

memstick: fix hangs on unexpected device removal in mspro_blk

mspro_block_remove() is called from detect thread that first calls the
mspro_block_stop(), which stops the request queue.  If we call
del_gendisk() with the queue stopped we get a deadlock.
Signed-off-by: default avatarMaxim Levitsky <maximlevitsky@gmail.com>
Cc: Alex Dubov <oakad@yahoo.com>
Cc: <stable@kernel.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 21fd0495
...@@ -1339,13 +1339,14 @@ static void mspro_block_remove(struct memstick_dev *card) ...@@ -1339,13 +1339,14 @@ static void mspro_block_remove(struct memstick_dev *card)
struct mspro_block_data *msb = memstick_get_drvdata(card); struct mspro_block_data *msb = memstick_get_drvdata(card);
unsigned long flags; unsigned long flags;
del_gendisk(msb->disk);
dev_dbg(&card->dev, "mspro block remove\n");
spin_lock_irqsave(&msb->q_lock, flags); spin_lock_irqsave(&msb->q_lock, flags);
msb->eject = 1; msb->eject = 1;
blk_start_queue(msb->queue); blk_start_queue(msb->queue);
spin_unlock_irqrestore(&msb->q_lock, flags); spin_unlock_irqrestore(&msb->q_lock, flags);
del_gendisk(msb->disk);
dev_dbg(&card->dev, "mspro block remove\n");
blk_cleanup_queue(msb->queue); blk_cleanup_queue(msb->queue);
msb->queue = NULL; msb->queue = NULL;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment