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: James Bottomley <James.Bottomley@HansenPartnership.com> Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
This commit is contained in:
parent
5d85d3247c
commit
c143dc903d
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue