Commit 96c51ce9 authored by Jens Axboe's avatar Jens Axboe Committed by Linus Torvalds

[PATCH] CFQ io scheduler: scheduler switch oops

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: default avatarJens Axboe <axboe@suse.de>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 52a5e15f
...@@ -2249,10 +2249,11 @@ static void cfq_put_cfqd(struct cfq_data *cfqd) ...@@ -2249,10 +2249,11 @@ static void cfq_put_cfqd(struct cfq_data *cfqd)
if (!atomic_dec_and_test(&cfqd->ref)) if (!atomic_dec_and_test(&cfqd->ref))
return; return;
cfq_shutdown_timer_wq(cfqd);
blk_put_queue(q); blk_put_queue(q);
cfq_shutdown_timer_wq(cfqd);
q->elevator->elevator_data = NULL;
mempool_destroy(cfqd->crq_pool); mempool_destroy(cfqd->crq_pool);
kfree(cfqd->crq_hash); kfree(cfqd->crq_hash);
kfree(cfqd->cfq_hash); kfree(cfqd->cfq_hash);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment