Vulnerability Details CVE-2022-49702
In the Linux kernel, the following vulnerability has been resolved:
btrfs: fix hang during unmount when block group reclaim task is running
When we start an unmount, at close_ctree(), if we have the reclaim task
running and in the middle of a data block group relocation, we can trigger
a deadlock when stopping an async reclaim task, producing a trace like the
following:
[629724.498185] task:kworker/u16:7 state:D stack: 0 pid:681170 ppid: 2 flags:0x00004000
[629724.499760] Workqueue: events_unbound btrfs_async_reclaim_metadata_space [btrfs]
[629724.501267] Call Trace:
[629724.501759] <TASK>
[629724.502174] __schedule+0x3cb/0xed0
[629724.502842] schedule+0x4e/0xb0
[629724.503447] btrfs_wait_on_delayed_iputs+0x7c/0xc0 [btrfs]
[629724.504534] ? prepare_to_wait_exclusive+0xc0/0xc0
[629724.505442] flush_space+0x423/0x630 [btrfs]
[629724.506296] ? rcu_read_unlock_trace_special+0x20/0x50
[629724.507259] ? lock_release+0x220/0x4a0
[629724.507932] ? btrfs_get_alloc_profile+0xb3/0x290 [btrfs]
[629724.508940] ? do_raw_spin_unlock+0x4b/0xa0
[629724.509688] btrfs_async_reclaim_metadata_space+0x139/0x320 [btrfs]
[629724.510922] process_one_work+0x252/0x5a0
[629724.511694] ? process_one_work+0x5a0/0x5a0
[629724.512508] worker_thread+0x52/0x3b0
[629724.513220] ? process_one_work+0x5a0/0x5a0
[629724.514021] kthread+0xf2/0x120
[629724.514627] ? kthread_complete_and_exit+0x20/0x20
[629724.515526] ret_from_fork+0x22/0x30
[629724.516236] </TASK>
[629724.516694] task:umount state:D stack: 0 pid:719055 ppid:695412 flags:0x00004000
[629724.518269] Call Trace:
[629724.518746] <TASK>
[629724.519160] __schedule+0x3cb/0xed0
[629724.519835] schedule+0x4e/0xb0
[629724.520467] schedule_timeout+0xed/0x130
[629724.521221] ? lock_release+0x220/0x4a0
[629724.521946] ? lock_acquired+0x19c/0x420
[629724.522662] ? trace_hardirqs_on+0x1b/0xe0
[629724.523411] __wait_for_common+0xaf/0x1f0
[629724.524189] ? usleep_range_state+0xb0/0xb0
[629724.524997] __flush_work+0x26d/0x530
[629724.525698] ? flush_workqueue_prep_pwqs+0x140/0x140
[629724.526580] ? lock_acquire+0x1a0/0x310
[629724.527324] __cancel_work_timer+0x137/0x1c0
[629724.528190] close_ctree+0xfd/0x531 [btrfs]
[629724.529000] ? evict_inodes+0x166/0x1c0
[629724.529510] generic_shutdown_super+0x74/0x120
[629724.530103] kill_anon_super+0x14/0x30
[629724.530611] btrfs_kill_super+0x12/0x20 [btrfs]
[629724.531246] deactivate_locked_super+0x31/0xa0
[629724.531817] cleanup_mnt+0x147/0x1c0
[629724.532319] task_work_run+0x5c/0xa0
[629724.532984] exit_to_user_mode_prepare+0x1a6/0x1b0
[629724.533598] syscall_exit_to_user_mode+0x16/0x40
[629724.534200] do_syscall_64+0x48/0x90
[629724.534667] entry_SYSCALL_64_after_hwframe+0x44/0xae
[629724.535318] RIP: 0033:0x7fa2b90437a7
[629724.535804] RSP: 002b:00007ffe0b7e4458 EFLAGS: 00000246 ORIG_RAX: 00000000000000a6
[629724.536912] RAX: 0000000000000000 RBX: 00007fa2b9182264 RCX: 00007fa2b90437a7
[629724.538156] RDX: 0000000000000000 RSI: 0000000000000000 RDI: 0000555d6cf20dd0
[629724.539053] RBP: 0000555d6cf20ba0 R08: 0000000000000000 R09: 00007ffe0b7e3200
[629724.539956] R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000000
[629724.540883] R13: 0000555d6cf20dd0 R14: 0000555d6cf20cb0 R15: 0000000000000000
[629724.541796] </TASK>
This happens because:
1) Before entering close_ctree() we have the async block group reclaim
task running and relocating a data block group;
2) There's an async metadata (or data) space reclaim task running;
3) We enter close_ctree() and park the cleaner kthread;
4) The async space reclaim task is at flush_space() and runs all the
existing delayed iputs;
5) Before the async space reclaim task calls
btrfs_wait_on_delayed_iputs(), the block group reclaim task which is
doing the data block group relocation, creates a delayed iput at
replace_file_extents() (called when COWing leaves that have file extent
items pointing to relocated data exten
---truncated---
Exploit prediction scoring system (EPSS) score
EPSS Score 0.0
EPSS Ranking 5.4%
CVSS Severity
CVSS v3 Score 5.5
Products affected by CVE-2022-49702
-
cpe:2.3:o:linux:linux_kernel:5.13
-
cpe:2.3:o:linux:linux_kernel:5.13.0-52
-
cpe:2.3:o:linux:linux_kernel:5.13.1
-
cpe:2.3:o:linux:linux_kernel:5.13.10
-
cpe:2.3:o:linux:linux_kernel:5.13.11
-
cpe:2.3:o:linux:linux_kernel:5.13.12
-
cpe:2.3:o:linux:linux_kernel:5.13.13
-
cpe:2.3:o:linux:linux_kernel:5.13.14
-
cpe:2.3:o:linux:linux_kernel:5.13.15
-
cpe:2.3:o:linux:linux_kernel:5.13.16
-
cpe:2.3:o:linux:linux_kernel:5.13.17
-
cpe:2.3:o:linux:linux_kernel:5.13.18
-
cpe:2.3:o:linux:linux_kernel:5.13.19
-
cpe:2.3:o:linux:linux_kernel:5.13.2
-
cpe:2.3:o:linux:linux_kernel:5.13.3
-
cpe:2.3:o:linux:linux_kernel:5.13.4
-
cpe:2.3:o:linux:linux_kernel:5.13.5
-
cpe:2.3:o:linux:linux_kernel:5.13.6
-
cpe:2.3:o:linux:linux_kernel:5.13.7
-
cpe:2.3:o:linux:linux_kernel:5.13.8
-
cpe:2.3:o:linux:linux_kernel:5.13.9
-
cpe:2.3:o:linux:linux_kernel:5.14
-
cpe:2.3:o:linux:linux_kernel:5.14.1
-
cpe:2.3:o:linux:linux_kernel:5.14.10
-
cpe:2.3:o:linux:linux_kernel:5.14.11
-
cpe:2.3:o:linux:linux_kernel:5.14.12
-
cpe:2.3:o:linux:linux_kernel:5.14.13
-
cpe:2.3:o:linux:linux_kernel:5.14.14
-
cpe:2.3:o:linux:linux_kernel:5.14.15
-
cpe:2.3:o:linux:linux_kernel:5.14.16
-
cpe:2.3:o:linux:linux_kernel:5.14.17
-
cpe:2.3:o:linux:linux_kernel:5.14.18
-
cpe:2.3:o:linux:linux_kernel:5.14.19
-
cpe:2.3:o:linux:linux_kernel:5.14.2
-
cpe:2.3:o:linux:linux_kernel:5.14.20
-
cpe:2.3:o:linux:linux_kernel:5.14.21
-
cpe:2.3:o:linux:linux_kernel:5.14.3
-
cpe:2.3:o:linux:linux_kernel:5.14.4
-
cpe:2.3:o:linux:linux_kernel:5.14.5
-
cpe:2.3:o:linux:linux_kernel:5.14.6
-
cpe:2.3:o:linux:linux_kernel:5.14.7
-
cpe:2.3:o:linux:linux_kernel:5.14.8
-
cpe:2.3:o:linux:linux_kernel:5.14.9
-
cpe:2.3:o:linux:linux_kernel:5.15
-
cpe:2.3:o:linux:linux_kernel:5.15.0
-
cpe:2.3:o:linux:linux_kernel:5.15.0-58
-
cpe:2.3:o:linux:linux_kernel:5.15.1
-
cpe:2.3:o:linux:linux_kernel:5.15.10
-
cpe:2.3:o:linux:linux_kernel:5.15.11
-
cpe:2.3:o:linux:linux_kernel:5.15.12
-
cpe:2.3:o:linux:linux_kernel:5.15.13
-
cpe:2.3:o:linux:linux_kernel:5.15.14
-
cpe:2.3:o:linux:linux_kernel:5.15.15
-
cpe:2.3:o:linux:linux_kernel:5.15.16
-
cpe:2.3:o:linux:linux_kernel:5.15.17
-
cpe:2.3:o:linux:linux_kernel:5.15.18
-
cpe:2.3:o:linux:linux_kernel:5.15.19
-
cpe:2.3:o:linux:linux_kernel:5.15.2
-
cpe:2.3:o:linux:linux_kernel:5.15.20
-
cpe:2.3:o:linux:linux_kernel:5.15.21
-
cpe:2.3:o:linux:linux_kernel:5.15.22
-
cpe:2.3:o:linux:linux_kernel:5.15.23
-
cpe:2.3:o:linux:linux_kernel:5.15.24
-
cpe:2.3:o:linux:linux_kernel:5.15.25
-
cpe:2.3:o:linux:linux_kernel:5.15.26
-
cpe:2.3:o:linux:linux_kernel:5.15.27
-
cpe:2.3:o:linux:linux_kernel:5.15.28
-
cpe:2.3:o:linux:linux_kernel:5.15.29
-
cpe:2.3:o:linux:linux_kernel:5.15.3
-
cpe:2.3:o:linux:linux_kernel:5.15.30
-
cpe:2.3:o:linux:linux_kernel:5.15.31
-
cpe:2.3:o:linux:linux_kernel:5.15.32
-
cpe:2.3:o:linux:linux_kernel:5.15.33
-
cpe:2.3:o:linux:linux_kernel:5.15.34
-
cpe:2.3:o:linux:linux_kernel:5.15.35
-
cpe:2.3:o:linux:linux_kernel:5.15.36
-
cpe:2.3:o:linux:linux_kernel:5.15.37
-
cpe:2.3:o:linux:linux_kernel:5.15.38
-
cpe:2.3:o:linux:linux_kernel:5.15.39
-
cpe:2.3:o:linux:linux_kernel:5.15.4
-
cpe:2.3:o:linux:linux_kernel:5.15.40
-
cpe:2.3:o:linux:linux_kernel:5.15.41
-
cpe:2.3:o:linux:linux_kernel:5.15.42
-
cpe:2.3:o:linux:linux_kernel:5.15.43
-
cpe:2.3:o:linux:linux_kernel:5.15.44
-
cpe:2.3:o:linux:linux_kernel:5.15.45
-
cpe:2.3:o:linux:linux_kernel:5.15.46
-
cpe:2.3:o:linux:linux_kernel:5.15.47
-
cpe:2.3:o:linux:linux_kernel:5.15.48
-
cpe:2.3:o:linux:linux_kernel:5.15.49
-
cpe:2.3:o:linux:linux_kernel:5.15.5
-
cpe:2.3:o:linux:linux_kernel:5.15.50
-
cpe:2.3:o:linux:linux_kernel:5.15.6
-
cpe:2.3:o:linux:linux_kernel:5.15.7
-
cpe:2.3:o:linux:linux_kernel:5.15.8
-
cpe:2.3:o:linux:linux_kernel:5.15.9
-
cpe:2.3:o:linux:linux_kernel:5.16
-
cpe:2.3:o:linux:linux_kernel:5.16.0
-
cpe:2.3:o:linux:linux_kernel:5.16.1
-
cpe:2.3:o:linux:linux_kernel:5.16.10
-
cpe:2.3:o:linux:linux_kernel:5.16.11
-
cpe:2.3:o:linux:linux_kernel:5.16.12
-
cpe:2.3:o:linux:linux_kernel:5.16.13
-
cpe:2.3:o:linux:linux_kernel:5.16.14
-
cpe:2.3:o:linux:linux_kernel:5.16.15
-
cpe:2.3:o:linux:linux_kernel:5.16.16
-
cpe:2.3:o:linux:linux_kernel:5.16.17
-
cpe:2.3:o:linux:linux_kernel:5.16.18
-
cpe:2.3:o:linux:linux_kernel:5.16.19
-
cpe:2.3:o:linux:linux_kernel:5.16.2
-
cpe:2.3:o:linux:linux_kernel:5.16.20
-
cpe:2.3:o:linux:linux_kernel:5.16.3
-
cpe:2.3:o:linux:linux_kernel:5.16.4
-
cpe:2.3:o:linux:linux_kernel:5.16.5
-
cpe:2.3:o:linux:linux_kernel:5.16.6
-
cpe:2.3:o:linux:linux_kernel:5.16.62
-
cpe:2.3:o:linux:linux_kernel:5.16.7
-
cpe:2.3:o:linux:linux_kernel:5.16.8
-
cpe:2.3:o:linux:linux_kernel:5.16.9
-
cpe:2.3:o:linux:linux_kernel:5.17
-
cpe:2.3:o:linux:linux_kernel:5.17.1
-
cpe:2.3:o:linux:linux_kernel:5.17.10
-
cpe:2.3:o:linux:linux_kernel:5.17.11
-
cpe:2.3:o:linux:linux_kernel:5.17.12
-
cpe:2.3:o:linux:linux_kernel:5.17.13
-
cpe:2.3:o:linux:linux_kernel:5.17.14
-
cpe:2.3:o:linux:linux_kernel:5.17.15
-
cpe:2.3:o:linux:linux_kernel:5.17.2
-
cpe:2.3:o:linux:linux_kernel:5.17.3
-
cpe:2.3:o:linux:linux_kernel:5.17.4
-
cpe:2.3:o:linux:linux_kernel:5.17.5
-
cpe:2.3:o:linux:linux_kernel:5.17.6
-
cpe:2.3:o:linux:linux_kernel:5.17.7
-
cpe:2.3:o:linux:linux_kernel:5.17.8
-
cpe:2.3:o:linux:linux_kernel:5.17.9
-
cpe:2.3:o:linux:linux_kernel:5.18
-
cpe:2.3:o:linux:linux_kernel:5.18.1
-
cpe:2.3:o:linux:linux_kernel:5.18.2
-
cpe:2.3:o:linux:linux_kernel:5.18.3
-
cpe:2.3:o:linux:linux_kernel:5.18.4
-
cpe:2.3:o:linux:linux_kernel:5.18.5
-
cpe:2.3:o:linux:linux_kernel:5.18.6
-
cpe:2.3:o:linux:linux_kernel:5.18.7
-
cpe:2.3:o:linux:linux_kernel:5.19