CVE-2026-93255

CVE-2026-93255

published September 24, 2026

CVSS
—
EPSS
0%
Percentile
9.0
In the wild
Unconfirmed
What it is

In the Linux kernel, the following vulnerability has been resolved:

btrfs: make sure EXTENT_BUFFER_READING is cleared under refs_lock

[FALSE ALERTS]

There is a bug report that the warning inside

invalidate_and_check_btree_folios() got triggered during btrfs/298:

BTRFS info (device sdd): first mount of filesystem f9bf732a-a19b-44b9-99a7-614ddff168e2

BTRFS info (device sdd): using crc32c checksum algorithm

BTRFS error (device sdd): failed to find fsid cb2fdb42-b638-4f2f-badd-4127467ba674 when attempting to open seed devices

BTRFS error (device sdd): failed to read chunk tree: -2

------------[ cut here ]------------

WARNING: disk-io.c:3342 at invalidate_and_check_btree_folios+0x260/0x3c0 [btrfs], CPU#4: mount/125993

CPU: 4 UID: 0 PID: 125993 Comm: mount Tainted: G W OE 7.1.0-rc7-custom+ #1 PREEMPT(full)

Hardware name: QEMU KVM Virtual Machine, BIOS edk2-20250812-19.fc42 08/12/2025

Call trace:

invalidate_and_check_btree_folios+0x260/0x3c0 [btrfs] (P)

open_ctree+0x1f50/0x23b0 [btrfs]

btrfs_get_tree+0x89c/0xc48 [btrfs]

vfs_get_tree+0x30/0x110

vfs_cmd_create+0x58/0xe8

__arm64_sys_fsconfig+0x39c/0x518

invoke_syscall.constprop.0+0x48/0x120

el0_svc_common.constprop.0+0x40/0xe8

do_el0_svc+0x24/0x38

el0_svc+0x50/0x310

el0t_64_sync_handler+0xa0/0xe8

el0t_64_sync+0x198/0x1a0

---[ end trace 0000000000000000 ]---

BTRFS warning (device sdd): unable to release extent buffer 365985792 owner 3 gen 17 refs 3 flags 0x5

[CAUSE]

In that invalidate_and_check_btree_folios() we wait for the eb to finish

its read, then check if it's only held by us and the btree inode.

If not, then do a warning as it may be still held, and could cause

problems.

But there is a small window where the check can lead to false alerts:

Thread A (Read endio) | Thread B (Unmount)

----------------------------------+-------------------------------------

end_bbio_meta_read() |

| The eb has one extra ref held |

| by the reader, and has |

| EXTENT_BUFFER_READING flag set | invalidate_and_check_btree_folios()

| | |

|- clear_extent_buffer_reading() | |

| | |- wait_on_bit_io();

| | | The EXTENT_BUFFER_READING flag is

| | | cleared

| | |- if (refcount_read(eb->refs) > 2)

| | The eb is held by the read, us

| | and btree inode, thus it

| | will trigger the warning

|- free_extent_buffer() |

[FIX]

Introduce a helper, free_extent_buffer_clear_reading().

If the new parameter, @clear_reading, is set, we will hold the spinlock

at the beginning of free_extent_buffer_clear_reading() to make sure the

EXTENT_BUFFER_READING flag is cleared inside the same critical section

of decreasing refs.

Now free_extent_buffer() will just call

free_extent_buffer_clear_reading() with @clear_reading set to false, so

no behavior change.

But for end_bbio_meta_read(), it will not clear_extent_buffer_reading()

directly, but pass @clear_reading as true.

Then inside invalidate_and_check_btree_folios(), hold the refs_lock

before reading refs.

So that we eliminate the race window completely.

The record
Technical detail
CVSS
Not scored
CVSS v4.0
Not supplied
EPSS
0.00198 · 9.0th percentile
Published
2026-09-24T20:17Z
References (3)
EPSS history
Timeline
  • 26 SEP 03:27Z
    EPSS moved — → 0%
    epss
  • 24 SEP 15:51Z
    btrfs: make sure EXTENT_BUFFER_READING is cleared under refs_lock
    cvelistv5