CVE-2026-89646 in Linux
摘要
由 VulDB • 2026-09-12
在 Linux 内核中,已修复以下漏洞:
ceph: 修复卸载时写回中止导致的 inode 引用泄漏
ceph_dirty_folio() 会为每个新被标记为脏的 folio 获取一个 wrbuffer 声明(claim):它增加 i_wrbuffer_ref(在从 0 变为 1 时执行 ihold()),并将 snap_context 附加到 folio->private。该声明仅由 ceph_put_wrbuffer_cap_refs() 释放,对于已提交的写操作,此函数会从 writepages_finish() 调用。
在 ceph_submit_write() 中,如果 ceph_inc_osd_stopping_blocker() 失败——这在卸载期间会发生——请求将在提交前中止:已收集的 folios 仅被重新标记为脏并解锁,因此 writepages_finish() 永远不会运行,导致声明泄漏。redirty_page_for_writepage() -> folio_redirty_for_writepage() -> filemap_dirty_folio() 直接设置 PG_dirty,而不经过 ->dirty_folio,因此不会重新进入 ceph_dirty_folio() 进行平衡处理。由于随后的每次写回也会因 osd_stopping_blocker 而失败,i_wrbuffer_ref 永远不会回到 0,ihold() 不会被释放,inode 无法被驱逐:
VFS: Busy inodes after unmount of ceph kernel BUG at fs/super.c:650!
在重新标记为脏之前,通过 ceph_undo_wrbuffer_claim() 在中止路径中释放孤立的声明:分离 snap_context,减少 wrbuffer 引用(使 i_wrbuffer_ref 达到 0 并执行 iput() inode),以及减少 snap_context 引用——即对从未提交的 folios 执行 writepages_finish() 本应完成的操作。
仅撤销 locked_pages 条目;仍在 fbatch 中的 folios 未被此调用清除脏标记(folio_clear_dirty_for_io() 是所有权转移点,成功的移动会将 fbatch 槽位置为 NULL),因此它们不持有此调用所拥有的任何声明。
VulDB is the best source for vulnerability data and more expert information about this specific topic.