Quadratic inode rescans in Linux kernel writeback cause soft lockups
Key facts
- Attack vector
- —
- Privileges required
- —
- User interaction
- —
- Attack complexity
- —
- Impact type
- —
- Confidentiality · integrity · availability
- —
- Fix status
- Partial Red Hat: 6 without a fix
No CVSS vector from any source. Fix status from CNA and Red Hat.
Summary
The Linux kernel writeback function cleanup_offline_cgwb() rescans the same inodes on every pass while draining a dying writeback structure, which makes the drain quadratic in the number of inodes. Inodes that were already prepared or cannot be switched stay where they are on the lists, so each call walks a growing run of them under a lock. With about 17M inodes attached to one dying cgwb, the source reports soft lockups with CPUs stuck for 21 to 48 seconds.
Written with Claude Haiku 5.5 from the sources below · 2026-10-30
Description from the CNA
In the Linux kernel, the following vulnerability has been resolved: writeback: bound cleanup_offline_cgwb() rescans by rotating scanned inodes cleanup_offline_cgwb() prepares at most WB_MAX_INODES_PER_ISW inodes per call and is called again until the dying wb is drained, but every call walks wb->b_attached and then wb->b_dirty_time from the same end. Inodes already prepared (they stay on the list with I_WB_SWITCH set until the switch worker runs) and inodes that cannot be switched (I_FREEING, I_WILL_FREE, !SB_ACTIVE, DAX, already on the target wb) stay where they are, so each pass rescans a growing run of them under wb->list_lock and a full drain is quadratic in the number of inodes on the list. With ~17M inodes attached to one dying cgwb we saw this end in soft lockups, with CPUs reported stuck for 21-48s. Walk both lists from the oldest end and move every scanned inode to the newest end, so the next pass starts where the previous one stopped and the drain becomes linear. b_attached is unordered, so nobody sees the reorder there. b_dirty_time is ordered by dirtied_when, but the oldest unscanned inode stays at the end move_expired_inodes() picks from, sync takes the whole list regardless of order, and prepared inodes leave the list as soon as the switch work runs and get a new dirtied_time_when on the new wb anyway, so the only inodes left out of order are the ones that can never switch (DAX), and only on the dying wb.
Why it matters now
SSVC decision points
Not available: CISA has not published SSVC decision points for this record.
Affected products
Remediation
Upgrade the Linux kernel to 6.1.189, 6.6.158, 6.12.112, 6.18.55, 7.2.9 or 7.3, the fixed versions listed for the Linux kernel. Red Hat has no fix available for Red Hat Enterprise Linux 8, 9 and 10 or Red Hat OpenShift Container Platform 4 and 5, and has no fix planned for Red Hat Enterprise Linux 6.
Written with Claude Haiku 5.5 from the sources below · 2026-10-30
- Fix · CNA Linux (Linux) Fixed in 6.1.189, 6.6.158, 6.12.112, 6.18.55, 7.2.9, 7.3
Vendor assessments
Red Hat
Red Hat rating: Moderate. Red Hat's page for this CVE →
| Product | Status | Plan or fix |
|---|---|---|
| Red Hat Enterprise Linux 10 | Affected | No fix yet: Fix deferred |
| Red Hat Enterprise Linux 6 | Affected | No fix planned: Out of support scope |
| Red Hat Enterprise Linux 8 | Affected | No fix yet: Fix deferred |
| Red Hat Enterprise Linux 9 | Affected | No fix yet: Fix deferred |
| Red Hat OpenShift Container Platform 4 | Affected | No fix yet: Fix deferred |
| Red Hat OpenShift Container Platform 5 | Affected | No fix yet: Fix deferred |
Not affected: 2 products
- Red Hat Enterprise Linux 7
- Red Hat OpenShift Container Platform 4
Timeline
- 2026-10-18 Threatist record created from CVE-2026-98538
- 2026-10-18 Alias added: GHSA-m444-q4wx-jpmh
- 2026-10-19 Fix available: Linux/[email protected] · CNA
- 2026-10-20 Affected versions changed · Red Hat
- 2026-10-20 CVSS score added · Red Hat
- 2026-10-30 Affected versions changed · Red Hat
References
Other 6
- https://git.kernel.org/stable/c/2d1da58c79b66646721a644c6eb4dd1f9c5c9327
- https://git.kernel.org/stable/c/c96b4d1628868e1195da1a896f79e06f350a3187
- https://git.kernel.org/stable/c/624dd0931162523d70f9db8c120b5ec6429a9b97
- https://git.kernel.org/stable/c/dd4b92067238771b604b59fdda8efed6d70ee823
- https://git.kernel.org/stable/c/9dac137bf77e0683778fb34c86e730c6129e8cb6
- https://git.kernel.org/stable/c/f6988c90671e83db79df1b7b9d6fdb0e5947fd84
More Linux vulnerabilities
- TI-2025-26358 tls: fix handling of zero-length records on the rx_list KEVCVSS 3.1CRITICAL 9.8
- TI-2026-38352 netfilter: bridge: make ebt_snat ARP rewrite writable KEVCVSS 3.1HIGH 8.8
- TI-2021-02452 Incorrect authorization in Ubuntu linux kernel KEVCVSS 3.1HIGH 8.8
- TI-2013-05264 The (1) get_user and (2) put_user API functions in the Linux kernel before 3.5.5 on the… KEVCVSS 3.1HIGH 8.8
- TI-2022-00125 Integer overflow in kernel KEVCVSS 3.1HIGH 8.4
- TI-2013-01864 The perf_swevent_init function in kernel/events/core.c in the Linux kernel before 3.8.9… KEVCVSS 3.1HIGH 8.4
Sources
- CVE-2026-98538 · CVE Program
- CVE-2026-98538 · NVD
- FIRST EPSS
- GHSA-m444-q4wx-jpmh · GitHub Advisory Database · CC BY 4.0
- CVE-2026-98538 · Red Hat security data · CC BY 4.0
This product uses the NVD API but is not endorsed or certified by the NVD. Sources and licences