Skip to content

Commit

Permalink
[PATCH] CFQ io scheduler: scheduler switch oops
Browse files Browse the repository at this point in the history
If cfq is managing a queue and a new scheduler is later selected, it is
possible for the cfqd unplug_work work to be queued after the kblockd
work struct has been flushed.  The problem is the ordering of
cfq_shutdown_timer_wq() and blk_put_queue() in cfq_put_cfqd().  The
latter may rearm the work, leaving cfq_kick_queue() with dead data.

Signed-off-by: Jens Axboe <axboe@suse.de>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
  • Loading branch information
Jens Axboe authored and Linus Torvalds committed Jun 27, 2005
1 parent 52a5e15 commit 96c51ce
Showing 1 changed file with 3 additions and 2 deletions.
5 changes: 3 additions & 2 deletions drivers/block/cfq-iosched.c
Original file line number Diff line number Diff line change
Expand Up @@ -2249,10 +2249,11 @@ static void cfq_put_cfqd(struct cfq_data *cfqd)
if (!atomic_dec_and_test(&cfqd->ref))
return;

cfq_shutdown_timer_wq(cfqd);

blk_put_queue(q);

cfq_shutdown_timer_wq(cfqd);
q->elevator->elevator_data = NULL;

mempool_destroy(cfqd->crq_pool);
kfree(cfqd->crq_hash);
kfree(cfqd->cfq_hash);
Expand Down

0 comments on commit 96c51ce

Please sign in to comment.