CVE-2026-98079: btrfs: zstd: fix lost wakeup when waiting for a workspace

Published Sep 25, 2026
·
Updated

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

btrfs: zstd: fix lost wakeup when waiting for a workspace

A writer can sleep forever in zstdgetworkspace() even though a workspace is free. When zstdallocworkspace() fails, the task is queued on zwsm->wait and schedules unconditionally, never re-testing the pool. zstdputworkspace() publishes the workspace and then calls condwakeup(), which only wakes when a sleeper is already visible, so a workspace returned between the failed allocation and preparetowait() wakes nobody. The window is wide: zstdallocworkspace() goes through kvmalloc() and may enter reclaim.

Only a max level workspace triggers the wakeup and one is deliberately kept allocated as the fallback every waiter waits for, so once its wakeup is lost the writer stays in TASKUNINTERRUPTIBLE until some other task happens to return one. Re-check the pool after preparetowait() has published the waiter, and use the workspace if one turned up.

Affected Software

1 affected component
Linux Linux kernel

Event History

Sep 25, 2026
CVE Published
via MITRE·10:24 AM
Data Sourced
via MITRE·10:24 AM
Description

Frequently Asked Questions

1

What conditions are required for the stall to occur?

A writer must be waiting in zstd_get_workspace() after zstd_alloc_workspace() fails. A workspace must then be returned during the interval before the waiting task has made itself visible, causing the wakeup to be missed.

2

What is the operational impact of a missed wakeup?

The affected writer can remain in TASK_UNINTERRUPTIBLE indefinitely, despite a workspace being available. It may resume only if another task later returns a workspace and generates another wakeup.

3

How can this condition be recognized on an affected system?

A writer may be stuck in zstd_get_workspace() in an uninterruptible sleep while a Zstandard workspace is free. The issue is specifically associated with a failed workspace allocation and a lost wakeup from zstd_put_workspace().

4

Why is the timing window significant?

The allocation path uses kvmalloc() and can enter reclaim, making the interval between allocation failure and waiter setup relatively wide. The fallback maximum-level workspace is deliberately retained and is the workspace that waiters depend on for the wakeup.

Contact

SecAlerts Pty Ltd.
132 Wickham Terrace
Fortitude Valley,
QLD 4006, Australia
info@secalerts.co
By using SecAlerts services, you agree to our services end-user license agreement. This website is safeguarded by reCAPTCHA and governed by the Google Privacy Policy and Terms of Service. All names, logos, and brands of products are owned by their respective owners, and any usage of these names, logos, and brands for identification purposes only does not imply endorsement. If you possess any content that requires removal, please get in touch with us.
© 2026 SecAlerts Pty Ltd.
ABN: 70 645 966 203, ACN: 645 966 203