From: James Bottomley Date: Sat, 30 May 2009 04:43:49 +0000 (+0200) Subject: block: fix an oops on BLKPREP_KILL X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=c143dc903d7c0b15f5052e00b2c7de33a8b4299c;p=linux-beck.git 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 Signed-off-by: Jens Axboe --- diff --git a/block/blk-core.c b/block/blk-core.c index 8b3b74e69184..7ae83a1e2acf 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -1789,6 +1789,11 @@ struct request *blk_peek_request(struct request_queue *q) break; } else if (ret == BLKPREP_KILL) { 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); } else { printk(KERN_ERR "%s: bad return=%d\n", __func__, ret);