diff options
author | Bart Van Assche <bvanassche@acm.org> | 2012-12-06 08:32:01 -0500 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2012-12-06 08:32:01 -0500 |
commit | c246e80d86736312933646896c4157daf511dadc (patch) | |
tree | 183119080e120f5a3e98edf5bb824e940e5b8f18 /block/blk.h | |
parent | 807592a4fafba1fea6e98b9cf1fb02b7c38fb24c (diff) |
block: Avoid that request_fn is invoked on a dead queue
A block driver may start cleaning up resources needed by its
request_fn as soon as blk_cleanup_queue() finished, so request_fn
must not be invoked after draining finished. This is important
when blk_run_queue() is invoked without any requests in progress.
As an example, if blk_drain_queue() and scsi_run_queue() run in
parallel, blk_drain_queue() may have finished all requests after
scsi_run_queue() has taken a SCSI device off the starved list but
before that last function has had a chance to run the queue.
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
Cc: James Bottomley <JBottomley@Parallels.com>
Cc: Mike Christie <michaelc@cs.wisc.edu>
Cc: Chanho Min <chanho.min@lge.com>
Acked-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'block/blk.h')
-rw-r--r-- | block/blk.h | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/block/blk.h b/block/blk.h index 2218a8a78292..47fdfdd41520 100644 --- a/block/blk.h +++ b/block/blk.h | |||
@@ -145,6 +145,8 @@ int blk_try_merge(struct request *rq, struct bio *bio); | |||
145 | 145 | ||
146 | void blk_queue_congestion_threshold(struct request_queue *q); | 146 | void blk_queue_congestion_threshold(struct request_queue *q); |
147 | 147 | ||
148 | void __blk_run_queue_uncond(struct request_queue *q); | ||
149 | |||
148 | int blk_dev_init(void); | 150 | int blk_dev_init(void); |
149 | 151 | ||
150 | 152 | ||