block: Make blk_get_backing_dev_info() safe without open bdev
authorJan Kara <jack@suse.cz>
Thu, 2 Feb 2017 14:56:52 +0000 (15:56 +0100)
committerJens Axboe <axboe@fb.com>
Thu, 2 Feb 2017 15:20:53 +0000 (08:20 -0700)
commitb1d2dc5659b41741f5a29b2ade76ffb4e5bb13d8
tree6f01d065b95e5d7a94a26d3892142db6ea60dae5
parentd03f6cdc1fc422accb734c7c07a661a0018d8631
block: Make blk_get_backing_dev_info() safe without open bdev

Currenly blk_get_backing_dev_info() is not safe to be called when the
block device is not open as bdev->bd_disk is NULL in that case. However
inode_to_bdi() uses this function and may be call called from flusher
worker or other writeback related functions without bdev being open
which leads to crashes such as:

[113031.075540] Unable to handle kernel paging request for data at address 0x00000000
[113031.075614] Faulting instruction address: 0xc0000000003692e0
0:mon> t
[c0000000fb65f900c00000000036cb6c writeback_sb_inodes+0x30c/0x590
[c0000000fb65fa10c00000000036ced4 __writeback_inodes_wb+0xe4/0x150
[c0000000fb65fa70c00000000036d33c wb_writeback+0x30c/0x450
[c0000000fb65fb40c00000000036e198 wb_workfn+0x268/0x580
[c0000000fb65fc50c0000000000f3470 process_one_work+0x1e0/0x590
[c0000000fb65fce0c0000000000f38c8 worker_thread+0xa8/0x660
[c0000000fb65fd80c0000000000fc4b0 kthread+0x110/0x130
[c0000000fb65fe30c0000000000098f0 ret_from_kernel_thread+0x5c/0x6c

Signed-off-by: Jens Axboe <axboe@fb.com>
block/blk-core.c
fs/block_dev.c
include/linux/fs.h