diff options
| -rw-r--r-- | drivers/block/virtio_blk.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c index 0d39f2f4294a..9d2223bba90c 100644 --- a/drivers/block/virtio_blk.c +++ b/drivers/block/virtio_blk.c | |||
| @@ -583,6 +583,8 @@ static void __devexit virtblk_remove(struct virtio_device *vdev) | |||
| 583 | { | 583 | { |
| 584 | struct virtio_blk *vblk = vdev->priv; | 584 | struct virtio_blk *vblk = vdev->priv; |
| 585 | int index = vblk->index; | 585 | int index = vblk->index; |
| 586 | struct virtblk_req *vbr; | ||
| 587 | unsigned long flags; | ||
| 586 | 588 | ||
| 587 | /* Prevent config work handler from accessing the device. */ | 589 | /* Prevent config work handler from accessing the device. */ |
| 588 | mutex_lock(&vblk->config_lock); | 590 | mutex_lock(&vblk->config_lock); |
| @@ -598,6 +600,15 @@ static void __devexit virtblk_remove(struct virtio_device *vdev) | |||
| 598 | flush_work(&vblk->config_work); | 600 | flush_work(&vblk->config_work); |
| 599 | 601 | ||
| 600 | del_gendisk(vblk->disk); | 602 | del_gendisk(vblk->disk); |
| 603 | |||
| 604 | /* Abort requests dispatched to driver. */ | ||
| 605 | spin_lock_irqsave(&vblk->lock, flags); | ||
| 606 | while ((vbr = virtqueue_detach_unused_buf(vblk->vq))) { | ||
| 607 | __blk_end_request_all(vbr->req, -EIO); | ||
| 608 | mempool_free(vbr, vblk->pool); | ||
| 609 | } | ||
| 610 | spin_unlock_irqrestore(&vblk->lock, flags); | ||
| 611 | |||
| 601 | blk_cleanup_queue(vblk->disk->queue); | 612 | blk_cleanup_queue(vblk->disk->queue); |
| 602 | put_disk(vblk->disk); | 613 | put_disk(vblk->disk); |
| 603 | mempool_destroy(vblk->pool); | 614 | mempool_destroy(vblk->pool); |
