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

Commit 6961cd4d authored by Jens Axboe's avatar Jens Axboe
Browse files

ubd: fix missing lock around request issue



We need to hold the device lock (and disable interrupts) while
writing new commands, or we could be interrupted while that
is happening and read invalid requests in the completion path.

Fixes: 4e6da0fe ("um: Convert ubd driver to blk-mq")
Tested-by: default avatarRichard Weinberger <richard@nod.at>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent df376b2e
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -1341,11 +1341,14 @@ static int ubd_queue_one_vec(struct blk_mq_hw_ctx *hctx, struct request *req,
static blk_status_t ubd_queue_rq(struct blk_mq_hw_ctx *hctx,
				 const struct blk_mq_queue_data *bd)
{
	struct ubd *ubd_dev = hctx->queue->queuedata;
	struct request *req = bd->rq;
	int ret = 0;

	blk_mq_start_request(req);

	spin_lock_irq(&ubd_dev->lock);

	if (req_op(req) == REQ_OP_FLUSH) {
		ret = ubd_queue_one_vec(hctx, req, 0, NULL);
	} else {
@@ -1361,9 +1364,11 @@ static blk_status_t ubd_queue_rq(struct blk_mq_hw_ctx *hctx,
		}
	}
out:
	if (ret < 0) {
	spin_unlock_irq(&ubd_dev->lock);

	if (ret < 0)
		blk_mq_requeue_request(req, true);
	}

	return BLK_STS_OK;
}