btrfs: initialize device::fs_info always
BugLink: https://bugs.launchpad.net/bugs/1922601
commit
820a49dafc3304de06f296c35c9ff1ebc1666343 upstream.
Neal reported a panic trying to use -o rescue=all
BUG: kernel NULL pointer dereference, address:
0000000000000030
PGD 0 P4D 0
Oops: 0000 [#1] SMP NOPTI
CPU: 0 PID: 696 Comm: mount Tainted: G W 5.12.0-rc2+ #296
Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.13.0-2.fc32 04/01/2014
RIP: 0010:btrfs_device_init_dev_stats+0x1d/0x200
RSP: 0018:
ffffafaec1483bb8 EFLAGS:
00010286
RAX:
0000000000000000 RBX:
ffff9a5715bcb298 RCX:
0000000000000070
RDX:
ffff9a5703248000 RSI:
ffff9a57052ea150 RDI:
ffff9a5715bca400
RBP:
ffff9a57052ea150 R08:
0000000000000070 R09:
ffff9a57052ea150
R10:
000130faf0741c10 R11:
0000000000000000 R12:
ffff9a5703700000
R13:
0000000000000000 R14:
ffff9a5715bcb278 R15:
ffff9a57052ea150
FS:
00007f600d122c40(0000) GS:
ffff9a577bc00000(0000) knlGS:
0000000000000000
CS: 0010 DS: 0000 ES: 0000 CR0:
0000000080050033
CR2:
0000000000000030 CR3:
0000000112a46005 CR4:
0000000000370ef0
Call Trace:
? btrfs_init_dev_stats+0x1f/0xf0
? kmem_cache_alloc+0xef/0x1f0
btrfs_init_dev_stats+0x5f/0xf0
open_ctree+0x10cb/0x1720
btrfs_mount_root.cold+0x12/0xea
legacy_get_tree+0x27/0x40
vfs_get_tree+0x25/0xb0
vfs_kern_mount.part.0+0x71/0xb0
btrfs_mount+0x10d/0x380
legacy_get_tree+0x27/0x40
vfs_get_tree+0x25/0xb0
path_mount+0x433/0xa00
__x64_sys_mount+0xe3/0x120
do_syscall_64+0x33/0x40
entry_SYSCALL_64_after_hwframe+0x44/0xae
This happens because when we call btrfs_init_dev_stats we do
device->fs_info->dev_root. However device->fs_info isn't initialized
because we were only calling btrfs_init_devices_late() if we properly
read the device root. However we don't actually need the device root to
init the devices, this function simply assigns the devices their
->fs_info pointer properly, so this needs to be done unconditionally
always so that we can properly dereference device->fs_info in rescue
cases.
Reported-by: Neal Gompa <ngompa13@gmail.com>
CC: stable@vger.kernel.org # 5.11+
Signed-off-by: Josef Bacik <josef@toxicpanda.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Seth Forshee <seth.forshee@canonical.com>