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

Commit c143dc90 authored by James Bottomley's avatar James Bottomley Committed by Jens Axboe
Browse files

block: fix an oops on BLKPREP_KILL



Doing a bit of torture testing, I ran across a BUG in the block
subsystem (at blk-core.c:2048): the test for if the request is queued.

It turns out the trigger was a BLKPREP_KILL coming out of the SCSI prep
function.  Currently for BLKPREP_KILL requests, we send them straight
into __blk_end_request_all() with an error, but they've never been
dequeued, so they trip the bug.  Fix this by starting requests before
killing them.

Signed-off-by: default avatarJames Bottomley <James.Bottomley@HansenPartnership.com>
Signed-off-by: default avatarJens Axboe <jens.axboe@oracle.com>
parent 5d85d324
Loading
Loading
Loading
Loading
+5 −0
Original line number Original line Diff line number Diff line
@@ -1789,6 +1789,11 @@ struct request *blk_peek_request(struct request_queue *q)
			break;
			break;
		} else if (ret == BLKPREP_KILL) {
		} else if (ret == BLKPREP_KILL) {
			rq->cmd_flags |= REQ_QUIET;
			rq->cmd_flags |= REQ_QUIET;
			/*
			 * Mark this request as started so we don't trigger
			 * any debug logic in the end I/O path.
			 */
			blk_start_request(rq);
			__blk_end_request_all(rq, -EIO);
			__blk_end_request_all(rq, -EIO);
		} else {
		} else {
			printk(KERN_ERR "%s: bad return=%d\n", __func__, ret);
			printk(KERN_ERR "%s: bad return=%d\n", __func__, ret);