提交 c143dc90 编写于 作者: J James Bottomley 提交者: Jens Axboe

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: NJames Bottomley <James.Bottomley@HansenPartnership.com>
Signed-off-by: NJens Axboe <jens.axboe@oracle.com>
上级 5d85d324
...@@ -1789,6 +1789,11 @@ struct request *blk_peek_request(struct request_queue *q) ...@@ -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);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册