diff options
| -rw-r--r-- | drivers/block/virtio_blk.c | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c index 53b81d59059b..0bdde8fba397 100644 --- a/drivers/block/virtio_blk.c +++ b/drivers/block/virtio_blk.c | |||
| @@ -274,15 +274,18 @@ static void virtblk_done(struct virtqueue *vq) | |||
| 274 | unsigned int len; | 274 | unsigned int len; |
| 275 | 275 | ||
| 276 | spin_lock_irqsave(vblk->disk->queue->queue_lock, flags); | 276 | spin_lock_irqsave(vblk->disk->queue->queue_lock, flags); |
| 277 | while ((vbr = virtqueue_get_buf(vblk->vq, &len)) != NULL) { | 277 | do { |
| 278 | if (vbr->bio) { | 278 | virtqueue_disable_cb(vq); |
| 279 | virtblk_bio_done(vbr); | 279 | while ((vbr = virtqueue_get_buf(vblk->vq, &len)) != NULL) { |
| 280 | bio_done = true; | 280 | if (vbr->bio) { |
| 281 | } else { | 281 | virtblk_bio_done(vbr); |
| 282 | virtblk_request_done(vbr); | 282 | bio_done = true; |
| 283 | req_done = true; | 283 | } else { |
| 284 | virtblk_request_done(vbr); | ||
| 285 | req_done = true; | ||
| 286 | } | ||
| 284 | } | 287 | } |
| 285 | } | 288 | } while (!virtqueue_enable_cb(vq)); |
| 286 | /* In case queue is stopped waiting for more buffers. */ | 289 | /* In case queue is stopped waiting for more buffers. */ |
| 287 | if (req_done) | 290 | if (req_done) |
| 288 | blk_start_queue(vblk->disk->queue); | 291 | blk_start_queue(vblk->disk->queue); |
