block: fix leak of q->rq_wb
authorOmar Sandoval <osandov@fb.com>
Tue, 28 Mar 2017 23:12:17 +0000 (16:12 -0700)
committerJens Axboe <axboe@fb.com>
Wed, 29 Mar 2017 14:09:08 +0000 (08:09 -0600)
CONFIG_DEBUG_TEST_DRIVER_REMOVE found a possible leak of q->rq_wb when a
request queue is reregistered. This has been a problem since wbt was
introduced, but the WARN_ON(!list_empty(&stats->callbacks)) in the
blk-stat rework exposed it. Fix it by cleaning up wbt when we unregister
the queue.

Fixes: 87760e5eef35 ("block: hook up writeback throttling")
Signed-off-by: Omar Sandoval <osandov@fb.com>
Signed-off-by: Jens Axboe <axboe@fb.com>
block/blk-sysfs.c

index 833fb7f..4585426 100644 (file)
@@ -795,7 +795,6 @@ static void blk_release_queue(struct kobject *kobj)
        struct request_queue *q =
                container_of(kobj, struct request_queue, kobj);
 
-       wbt_exit(q);
        if (test_bit(QUEUE_FLAG_POLL_STATS, &q->queue_flags))
                blk_stat_remove_callback(q, q->poll_cb);
        blk_stat_free_callback(q->poll_cb);
@@ -938,6 +937,9 @@ void blk_unregister_queue(struct gendisk *disk)
 
        queue_flag_clear_unlocked(QUEUE_FLAG_REGISTERED, q);
 
+       wbt_exit(q);
+
+
        if (q->mq_ops)
                blk_mq_unregister_dev(disk_to_dev(disk), q);