ZeroHour

CVE-2026-89646

moderate

CephFS inode reference leak in Linux kernel triggers BUG at unmount

CVSS 3.1
7.8 high
EPSS
Published
()
Modified
AI analysis

The Linux kernel's Ceph filesystem client leaks a writeback reference (an ihold() taken in ceph_dirty_folio()) when writeback is aborted during unmount: if ceph_inc_osd_stopping_blocker() fails, collected folios are only redirtied and unlocked, writepages_finish() never runs, and the claim is never released. Because subsequent writeback attempts also fail the osd_stopping_blocker, i_wrbuffer_ref never returns to zero, the inode can never be evicted, and unmount ends with 'VFS: Busy inodes after unmount of ceph' and a kernel BUG at fs/super.c:650. The flaw is triggered locally by any process that has written dirty pages to a mounted Ceph filesystem when that filesystem is subsequently unmounted, and it effectively yields a kernel crash/oops and a stuck, non-evictable inode — a denial-of-service condition (the assigned CVSS 3.1 of 7.8 also rates high confidentiality and integrity impact for the local attacker). Affected systems are hosts running Linux kernels whose fs/ceph writeback path predates the fix, which adds ceph_undo_wrbuffer_claim() to undo the orphaned claim in the abort path. No public proof of concept exists and no exploitation has been reported; the issue is resolved upstream and awaits distribution in patched kernel releases.

What to do: Upgrade to a kernel release that includes the ceph_undo_wrbuffer_claim() fix in ceph_submit_write()'s abort path as soon as your distribution ships it. Until then, quiesce writes and run sync on CephFS mounts before unmounting so no in-flight writeback hits the abort path. Monitor dmesg on CephFS clients for 'Busy inodes after unmount of ceph' or a BUG at fs/super.c:650 and reboot affected hosts to clear leaked inodes.

Affected
Linux kernel (CephFS client, fs/ceph)
Estimated exposure
moderateplausibly on the order of tens of thousands of hosts with mounted Ceph filesystems (rough estimate) — Ceph is a widely deployed software-defined storage platform in enterprise, HPC, and private-cloud environments, but no public scan or install-count data exists for hosts actively mounting CephFS, so this is an order-of-magnitude guess.

Order-of-magnitude estimate by the model from install counts, market share and public scan data it knows; verify before quoting.

Description

In the Linux kernel, the following vulnerability has been resolved: ceph: fix leaked inode reference on writeback abort at umount ceph_dirty_folio() takes a wrbuffer claim on each newly dirtied folio: it bumps i_wrbuffer_ref (taking an ihold() on the 0->1 transition) and attaches the snap_context to folio->private. That claim is released only by ceph_put_wrbuffer_cap_refs(), which for a submitted write runs from writepages_finish(). In ceph_submit_write(), if ceph_inc_osd_stopping_blocker() fails -- which happens during umount -- the request is aborted before submission: the already-collected folios are only redirtied and unlocked, so writepages_finish() never runs and the claim is leaked. redirty_page_for_writepage() -> folio_redirty_for_writepage() -> filemap_dirty_folio() sets PG_dirty directly and does not go through ->dirty_folio, so ceph_dirty_folio() is not re-entered to rebalance it. Because every subsequent writeback also fails the osd_stopping_blocker, i_wrbuffer_ref never returns to 0, the ihold() is never dropped, and the inode cannot be evicted: VFS: Busy inodes after unmount of ceph kernel BUG at fs/super.c:650! Release the orphaned claim in the abort path before redirtying, via ceph_undo_wrbuffer_claim(): detach the snap_context, drop the wrbuffer reference (letting i_wrbuffer_ref reach 0 and iput() the inode), and drop the snap_context reference -- i.e. do what writepages_finish() would have done for these never-submitted folios. Only the locked_pages entries are undone; folios still in the fbatch were never dirty-cleared by this call (folio_clear_dirty_for_io() is the ownership-transfer point, and a successful move NULLs the fbatch slot), so they hold no claim this call owns.

Vector
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H

In the news

No ingested article mentions this CVE yet.