Skip to content

Commit 89325c8

Browse files
committed
btrfs: fix race between free_stale_devices and close_fs_devices
%fs_devices can be free-ed by btrfs_free_stale_devices() when the close_fs_devices() drops fs_devices::opened to zero, but close_fs_devices tries to access the %fs_devices again without the device_list_mutex. Fix this by bringing the %fs_devices access with in the device_list_mutex. Stack trace as below. HEAD commit: 716a685 Merge branch 'x86-hyperv-for-linus' of git://.. :: CPU: 1 PID: 4499 Comm: syz-executor921 Not tainted 4.17.0+ torvalds#84 :: WARNING: CPU: 1 PID: 4499 at fs/btrfs/volumes.c:1071 close_fs_devices+0xbc7/0xfa0 fs/btrfs/volumes.c:1071 Kernel panic - not syncing: panic_on_warn set ... :: RIP: 0010:close_fs_devices+0xbc7/0xfa0 fs/btrfs/volumes.c:1071 :: btrfs_close_devices+0x29/0x150 fs/btrfs/volumes.c:1085 open_ctree+0x589/0x7898 fs/btrfs/disk-io.c:3358 btrfs_fill_super fs/btrfs/super.c:1202 [inline] btrfs_mount_root+0x16df/0x1e70 fs/btrfs/super.c:1593 mount_fs+0xae/0x328 fs/super.c:1277 vfs_kern_mount.part.34+0xd4/0x4d0 fs/namespace.c:1037 vfs_kern_mount+0x40/0x60 fs/namespace.c:1027 btrfs_mount+0x4a1/0x213e fs/btrfs/super.c:1661 mount_fs+0xae/0x328 fs/super.c:1277 Reported-by: syzbot+ceb2606025ec1cc3479c@syzkaller.appspotmail.com Signed-off-by: Anand Jain <anand.jain@oracle.com>
1 parent 0dfd681 commit 89325c8

File tree

1 file changed

+2
-2
lines changed

1 file changed

+2
-2
lines changed

fs/btrfs/volumes.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1064,13 +1064,13 @@ static int close_fs_devices(struct btrfs_fs_devices *fs_devices)
10641064
list_for_each_entry_safe(device, tmp, &fs_devices->devices, dev_list) {
10651065
btrfs_close_one_device(device);
10661066
}
1067-
mutex_unlock(&fs_devices->device_list_mutex);
1068-
10691067
WARN_ON(fs_devices->open_devices);
10701068
WARN_ON(fs_devices->rw_devices);
10711069
fs_devices->opened = 0;
10721070
fs_devices->seeding = 0;
10731071

1072+
mutex_unlock(&fs_devices->device_list_mutex);
1073+
10741074
return 0;
10751075
}
10761076

0 commit comments

Comments
 (0)