Cloudanix VulnDB

CVE-2026-53122

None

CVSS

—

EPSS

0.1%

Published

Jun 24, 2026

CISA due date

—

Cloudanix analysis

Next patch cycle SSVC: Track

A flaw in certain Linux filesystem configurations can make file operations hang and disrupt services until the system is updated or recovered.

Exploitation
Local Privilege
Attacker needs
Local User
Complexity
Moderate
Impact
Denial Of Service
Component
OS kernel
Class
Denial of service
Remediation
Patch
Effort
Low
Patch risk
Low

What it actually does

This flaw is a Linux kernel Btrfs filesystem deadlock involving reflink operations and transaction commits when the filesystem is mounted with the flushoncommit option. A reflink that copies an inline extent beyond the destination file's current end-of-file can leave a dirty folio in a range locked by the reflink path. During transaction commit, Btrfs delalloc flushing may try to invalidate that same folio and block on the locked extent range, while the reflink operation waits for the transaction commit to unblock. The result is an unresolvable wait cycle in kernel filesystem code, causing tasks to hang in uninterruptible sleep and potentially degrading or halting filesystem I/O on the affected Btrfs mount.

Why it matters to the business

Successful exploitation can cause systems using affected Btrfs configurations to experience hung I/O, stalled workloads, degraded service availability, and potential need for administrative recovery such as remounting or rebooting. The impact is most relevant to Linux systems that use Btrfs with reflink-capable workloads and the flushoncommit mount option. EPSS is currently very low and there is no known CISA KEV listing or ransomware association, but availability-sensitive systems should still prioritize kernel updates because filesystem deadlocks can disrupt production workloads and may be difficult to recover from without downtime.

How an attack unfolds

An attacker needs the ability to perform filesystem operations on an affected Btrfs filesystem mounted with flushoncommit. They create or control files such that an inline extent from one inode is cloned via reflink into another file at an offset beyond the destination file's current size. This causes Btrfs to copy inline data into a page or folio beyond EOF while the reflink path holds extent-range locks. If a transaction commit occurs concurrently, the commit path flushes delayed allocation, encounters the dirty folio beyond EOF, and attempts to invalidate it. The invalidation path blocks waiting for the extent range lock held by the reflink operation. The reflink operation then attempts to start or continue a transaction and blocks behind the transaction commit. Both paths wait on each other, leaving kernel tasks stuck and filesystem writeback or transaction progress impaired.

How to fix it

Apply a Linux kernel update that includes the Btrfs fix for this issue from the relevant distribution or kernel vendor. No specific fixed package versions were provided in the input, so use vendor advisories for the exact corrected kernel build for each distribution and kernel stream. Where immediate patching is not possible, reduce exposure by avoiding the flushoncommit mount option on Btrfs filesystems where operationally acceptable, restricting untrusted local users or workloads from performing reflink-heavy file operations, and isolating workloads that can create or clone files on Btrfs volumes. Reboot into the patched kernel after installation, because kernel filesystem fixes are not effective until the running kernel is replaced.

How to confirm the fix worked

Confirm the running kernel version is at or above the vendor-fixed build, not merely that an updated package is installed. Review Btrfs mount options and verify whether affected filesystems are mounted with flushoncommit. Validate that production Btrfs mounts can complete reflink-capable file operations and transaction-heavy write workloads without hung tasks. Where feasible, test on a non-production system using the same kernel stream, Btrfs configuration, and mount options. Check kernel logs after validation for absence of hung task reports involving Btrfs writeback, extent locking, folio invalidation, or transaction commit paths.

Typical attack path

  1. Gain local ability to create, modify, and reflink files on a Btrfs filesystem mounted with the flushoncommit option.
  2. Prepare a source file with an inline extent and a destination file whose current size is smaller than the target clone offset.
  3. Trigger a reflink or clone operation that copies the inline extent into the destination file beyond its current EOF.
  4. Induce or wait for a Btrfs transaction commit and delayed allocation flush to occur concurrently.
  5. Cause the transaction commit path and reflink path to enter a circular wait on extent locks and transaction state.
  6. Observe resulting hung tasks, stalled Btrfs writeback, degraded filesystem availability, or system-level service disruption.

How to detect it

Look for signs of prior or ongoing exploitation in kernel logs, system journals, hypervisor or console logs, and monitoring alerts that capture hung tasks, blocked writeback workers, Btrfs transaction stalls, or long I/O waits. Relevant artifacts include tasks stuck in uninterruptible sleep, messages such as blocked for more than the hung task timeout, Btrfs writeback workers named flush-btrfs, and stack traces involving btrfs_invalidate_folio, btrfs_writepages, wait_extent_bit, btrfs_lock_extent_bits, extent_writepage, or transaction commit paths. Correlate these events with Btrfs filesystems mounted with flushoncommit and with local user, container, build, backup, deduplication, or file-cloning activity around the same time. Because this is a denial-of-service deadlock rather than a code-execution vulnerability, durable file-based IOCs are unlikely; detection should focus on kernel telemetry, mount configuration, and workload activity preceding the hang.

  • flushoncommit
  • INFO: task
  • blocked for more than
  • hung_task_timeout_secs
  • flush-btrfs-
  • btrfs_invalidate_folio
  • btrfs_writepages
  • extent_writepage
  • extent_write_cache_pages
  • wait_extent_bit
  • btrfs_lock_extent_bits
  • btrfs_lock_extent
  • btrfs_start_delalloc_flush
  • TRANS_STATE_COMMIT_START
  • TRANS_STATE_UNBLOCKED
  • Workqueue: writeback wb_workfn
  • state:D
  • copy_inline_to_page

What your security team should do

  • Inventory Linux systems using Btrfs and identify mounts using the flushoncommit option.
  • Prioritize kernel updates for systems where Btrfs supports multi-user, container, build, backup, virtualization, or other reflink-capable workloads.
  • If patching is delayed, remove the flushoncommit mount option where business requirements allow and remount or reboot to apply the change.
  • Restrict local or workload-level access that permits untrusted users to create files, perform reflinks, or run high-volume filesystem operations on affected Btrfs mounts.
  • Monitor kernel logs for hung task reports and Btrfs stack traces until all affected systems are patched.
  • Ensure operational runbooks include recovery steps for Btrfs filesystem hangs, including safe service drain, remount, or reboot procedures.

The record

In the Linux kernel, the following vulnerability has been resolved: btrfs: fix deadlock between reflink and transaction commit when using flushoncommit When using the flushoncommit mount option, we can have a deadlock between a transaction commit and a reflink operation that copied an inline extent to an offset beyond the current i_size of the destination node. The deadlock happens like this: 1) Task A clones an inline extent from inode X to an offset of inode Y that is beyond Y's current i_size. This means we copied the inline extent's data to a folio of inode Y that is beyond its EOF, using a call to copy_inline_to_page(); 2) Task B starts a transaction commit and calls btrfs_start_delalloc_flush() to flush delalloc; 3) The delalloc flushing sees the new dirty folio of inode Y and when it attempts to flush it, it ends up at extent_writepage() and sees that the offset of the folio is beyond the i_size of inode Y, so it attempts to invalidate the folio by calling folio_invalidate(), which ends up at btrfs' folio invalidate callback - btrfs_invalidate_folio(). There it tries to lock the folio's range in inode Y's extent io tree, but it blocks since it's currently locked by task A - during a reflink we lock the inodes and the source and destination ranges after flushing all delalloc and waiting for ordered extent completion - after that we don't expect to have dirty folios in the ranges, the exception is if we have to copy an inline extent's data (because the destination offset is not zero); 4) Task A then attempts to start a transaction to update the inode item, and then it's blocked since the current transaction is in the TRANS_STATE_COMMIT_START state. Therefore task A has to wait for the current transaction to become unblocked (its state >= TRANS_STATE_UNBLOCKED). So task A is waiting for the transaction commit done by task B, and the later waiting on the extent lock of inode Y that is currently held by task A. Syzbot recently reported this with the following stack traces: INFO: task kworker/u8:7:1053 blocked for more than 143 seconds. Not tainted syzkaller #0 "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. task:kworker/u8:7 state:D stack:23520 pid:1053 tgid:1053 ppid:2 task_flags:0x4208060 flags:0x00080000 Workqueue: writeback wb_workfn (flush-btrfs-46) Call Trace: <TASK> context_switch kernel/sched/core.c:5298 [inline] __schedule+0x1553/0x5240 kernel/sched/core.c:6911 __schedule_loop kernel/sched/core.c:6993 [inline] schedule+0x164/0x360 kernel/sched/core.c:7008 wait_extent_bit fs/btrfs/extent-io-tree.c:811 [inline] btrfs_lock_extent_bits+0x59c/0x700 fs/btrfs/extent-io-tree.c:1914 btrfs_lock_extent fs/btrfs/extent-io-tree.h:152 [inline] btrfs_invalidate_folio+0x43d/0xc40 fs/btrfs/inode.c:7704 extent_writepage fs/btrfs/extent_io.c:1852 [inline] extent_write_cache_pages fs/btrfs/extent_io.c:2580 [inline] btrfs_writepages+0x12ff/0x2440 fs/btrfs/extent_io.c:2713 do_writepages+0x32e/0x550 mm/page-writeback.c:2554 __writeback_single_inode+0x133/0x11a0 fs/fs-writeback.c:1750 writeback_sb_inodes+0x995/0x19d0 fs/fs-writeback.c:2042 wb_writeback+0x456/0xb70 fs/fs-writeback.c:2227 wb_do_writeback fs/fs-writeback.c:2374 [inline] wb_workfn+0x41a/0xf60 fs/fs-writeback.c:2414 process_one_work kernel/workqueue.c:3276 [inline] process_scheduled_works+0xb6e/0x18c0 kernel/workqueue.c:3359 worker_thread+0xa53/0xfc0 kernel/workqueue.c:3440 kthread+0x388/0x470 kernel/kthread.c:436 ret_from_fork+0x51e/0xb90 arch/x86/kernel/process.c:158 ret_from_fork_asm+0x1a/0x30 arch/x86/entry/entry_64.S:245 </TASK> INFO: task syz.4.64:6910 blocked for more than 143 seconds. Not tainted syzkaller #0 "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. task:syz.4.64 state:D stack:22752 pid:6910 tgid: ---truncated---

Affected packages

Ecosystem Package Introduced Fixed