CVE-2022-50089
Publication date:
18/06/2025
In the Linux kernel, the following vulnerability has been resolved:<br />
<br />
btrfs: ensure pages are unlocked on cow_file_range() failure<br />
<br />
There is a hung_task report on zoned btrfs like below.<br />
<br />
https://github.com/naota/linux/issues/59<br />
<br />
[726.328648] INFO: task rocksdb:high0:11085 blocked for more than 241 seconds.<br />
[726.329839] Not tainted 5.16.0-rc1+ #1<br />
[726.330484] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.<br />
[726.331603] task:rocksdb:high0 state:D stack: 0 pid:11085 ppid: 11082 flags:0x00000000<br />
[726.331608] Call Trace:<br />
[726.331611] <br />
[726.331614] __schedule+0x2e5/0x9d0<br />
[726.331622] schedule+0x58/0xd0<br />
[726.331626] io_schedule+0x3f/0x70<br />
[726.331629] __folio_lock+0x125/0x200<br />
[726.331634] ? find_get_entries+0x1bc/0x240<br />
[726.331638] ? filemap_invalidate_unlock_two+0x40/0x40<br />
[726.331642] truncate_inode_pages_range+0x5b2/0x770<br />
[726.331649] truncate_inode_pages_final+0x44/0x50<br />
[726.331653] btrfs_evict_inode+0x67/0x480<br />
[726.331658] evict+0xd0/0x180<br />
[726.331661] iput+0x13f/0x200<br />
[726.331664] do_unlinkat+0x1c0/0x2b0<br />
[726.331668] __x64_sys_unlink+0x23/0x30<br />
[726.331670] do_syscall_64+0x3b/0xc0<br />
[726.331674] entry_SYSCALL_64_after_hwframe+0x44/0xae<br />
[726.331677] RIP: 0033:0x7fb9490a171b<br />
[726.331681] RSP: 002b:00007fb943ffac68 EFLAGS: 00000246 ORIG_RAX: 0000000000000057<br />
[726.331684] RAX: ffffffffffffffda RBX: 0000000000000000 RCX: 00007fb9490a171b<br />
[726.331686] RDX: 00007fb943ffb040 RSI: 000055a6bbe6ec20 RDI: 00007fb94400d300<br />
[726.331687] RBP: 00007fb943ffad00 R08: 0000000000000000 R09: 0000000000000000<br />
[726.331688] R10: 0000000000000031 R11: 0000000000000246 R12: 00007fb943ffb000<br />
[726.331690] R13: 00007fb943ffb040 R14: 0000000000000000 R15: 00007fb943ffd260<br />
[726.331693] <br />
<br />
While we debug the issue, we found running fstests generic/551 on 5GB<br />
non-zoned null_blk device in the emulated zoned mode also had a<br />
similar hung issue.<br />
<br />
Also, we can reproduce the same symptom with an error injected<br />
cow_file_range() setup.<br />
<br />
The hang occurs when cow_file_range() fails in the middle of<br />
allocation. cow_file_range() called from do_allocation_zoned() can<br />
split the give region ([start, end]) for allocation depending on<br />
current block group usages. When btrfs can allocate bytes for one part<br />
of the split regions but fails for the other region (e.g. because of<br />
-ENOSPC), we return the error leaving the pages in the succeeded regions<br />
locked. Technically, this occurs only when @unlock == 0. Otherwise, we<br />
unlock the pages in an allocated region after creating an ordered<br />
extent.<br />
<br />
Considering the callers of cow_file_range(unlock=0) won&#39;t write out<br />
the pages, we can unlock the pages on error exit from<br />
cow_file_range(). So, we can ensure all the pages except @locked_page<br />
are unlocked on error case.<br />
<br />
In summary, cow_file_range now behaves like this:<br />
<br />
- page_started == 1 (return value)<br />
- All the pages are unlocked. IO is started.<br />
- unlock == 1<br />
- All the pages except @locked_page are unlocked in any case<br />
- unlock == 0<br />
- On success, all the pages are locked for writing out them<br />
- On failure, all the pages except @locked_page are unlocked
Severity CVSS v4.0: Pending analysis
Last modification:
18/11/2025