Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f02b9ac3 authored by Shaohua Li's avatar Shaohua Li Committed by Jens Axboe
Browse files

virtio-blk: virtqueue_kick() must be ordered with other virtqueue operations



It isn't safe to call it without holding the vblk->vq_lock.

Reported-by: default avatarDave Chinner <david@fromorbit.com>
Signed-off-by: default avatarShaohua Li <shli@fusionio.com>

Fixed another condition of virtqueue_kick() not holding the lock.

Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 94eddfbe
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -199,15 +199,16 @@ static int virtio_queue_rq(struct blk_mq_hw_ctx *hctx, struct request *req)

	spin_lock_irqsave(&vblk->vq_lock, flags);
	if (__virtblk_add_req(vblk->vq, vbr, vbr->sg, num) < 0) {
		virtqueue_kick(vblk->vq);
		spin_unlock_irqrestore(&vblk->vq_lock, flags);
		blk_mq_stop_hw_queue(hctx);
		virtqueue_kick(vblk->vq);
		return BLK_MQ_RQ_QUEUE_BUSY;
	}
	spin_unlock_irqrestore(&vblk->vq_lock, flags);

	if (last)
		virtqueue_kick(vblk->vq);

	spin_unlock_irqrestore(&vblk->vq_lock, flags);
	return BLK_MQ_RQ_QUEUE_OK;
}