diff options
author | Jan Kara <jack@suse.cz> | 2017-02-08 08:05:56 +0100 |
---|---|---|
committer | Jens Axboe <axboe@fb.com> | 2017-03-02 16:08:35 -0700 |
commit | 165a5e22fafb127ecb5914e12e8c32a1f0d3f820 (patch) | |
tree | 844b4541dcc7edd35feac79dfda0c25312d51ade /block/blk-core.c | |
parent | 113285b473824922498d07d7f82459507b9792eb (diff) | |
download | talos-obmc-linux-165a5e22fafb127ecb5914e12e8c32a1f0d3f820.tar.gz talos-obmc-linux-165a5e22fafb127ecb5914e12e8c32a1f0d3f820.zip |
block: Move bdi_unregister() to del_gendisk()
Commit 6cd18e711dd8 "block: destroy bdi before blockdev is
unregistered." moved bdi unregistration (at that time through
bdi_destroy()) from blk_release_queue() to blk_cleanup_queue() because
it needs to happen before blk_unregister_region() call in del_gendisk()
for MD. SCSI though will free up the device number from sd_remove()
called through a maze of callbacks from device_del() in
__scsi_remove_device() before blk_cleanup_queue() and thus similar races
as described in 6cd18e711dd8 can happen for SCSI as well as reported by
Omar [1].
Moving bdi_unregister() to del_gendisk() works for MD and fixes the
problem for SCSI since del_gendisk() gets called from sd_remove() before
freeing the device number.
This also makes device_add_disk() (calling bdi_register_owner()) more
symmetric with del_gendisk().
[1] http://marc.info/?l=linux-block&m=148554717109098&w=2
Tested-by: Lekshmi Pillai <lekshmicpillai@in.ibm.com>
Acked-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Jan Kara <jack@suse.cz>
Tested-by: Omar Sandoval <osandov@fb.com>
Signed-off-by: Jens Axboe <axboe@fb.com>
Diffstat (limited to 'block/blk-core.c')
-rw-r--r-- | block/blk-core.c | 1 |
1 files changed, 0 insertions, 1 deletions
diff --git a/block/blk-core.c b/block/blk-core.c index b9e857f4afe8..1086dac8724c 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -578,7 +578,6 @@ void blk_cleanup_queue(struct request_queue *q) q->queue_lock = &q->__queue_lock; spin_unlock_irq(lock); - bdi_unregister(q->backing_dev_info); put_disk_devt(q->disk_devt); /* @q is and will stay empty, shutdown and put */ |