diff options
author | Christoph Hellwig <hch@lst.de> | 2015-09-27 21:01:50 +0200 |
---|---|---|
committer | Jens Axboe <axboe@fb.com> | 2015-10-01 10:10:55 +0200 |
commit | f4829a9b7a61e159367350008a608b062c4f6840 (patch) | |
tree | a2f488a95324e0c0b558273f48b18413ab2fa221 /drivers/block/virtio_blk.c | |
parent | 60de074ba1e8f327db19bc33d8530131ac01695d (diff) | |
download | op-kernel-dev-f4829a9b7a61e159367350008a608b062c4f6840.zip op-kernel-dev-f4829a9b7a61e159367350008a608b062c4f6840.tar.gz |
blk-mq: fix racy updates of rq->errors
blk_mq_complete_request may be a no-op if the request has already
been completed by others means (e.g. a timeout or cancellation), but
currently drivers have to set rq->errors before calling
blk_mq_complete_request, which might leave us with the wrong error value.
Add an error parameter to blk_mq_complete_request so that we can
defer setting rq->errors until we known we won the race to complete the
request.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Sagi Grimberg <sagig@mellanox.com>
Signed-off-by: Jens Axboe <axboe@fb.com>
Diffstat (limited to 'drivers/block/virtio_blk.c')
-rw-r--r-- | drivers/block/virtio_blk.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c index e93899c..6ca3549 100644 --- a/drivers/block/virtio_blk.c +++ b/drivers/block/virtio_blk.c @@ -144,7 +144,7 @@ static void virtblk_done(struct virtqueue *vq) do { virtqueue_disable_cb(vq); while ((vbr = virtqueue_get_buf(vblk->vqs[qid].vq, &len)) != NULL) { - blk_mq_complete_request(vbr->req); + blk_mq_complete_request(vbr->req, vbr->req->errors); req_done = true; } if (unlikely(virtqueue_is_broken(vq))) |