---
id: CVE-2026-89681
title: 'nfsd: fix layout fence worker double-reference race'
summary: |-
  In the Linux kernel, the following vulnerability has been resolved:

  nfsd: fix layout fence worker double-reference race

  The workqueue core clears WORK_STRUCT_PENDING before the callback
  is invoked, so delayed_work_pending() in lm_break…
severity: critical
cvss: 9.8
cvssVector: 'CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H'
cvssSource: cna
cwe:
  - CWE-772
vendor: Linux
product: Linux
affected:
  - >-
    Linux >= f52792f484ba2316853736856dde19b7e7458861 <
    a278d361e0e8f242211891193d56483a7a9f47a8
  - >-
    Linux >= f52792f484ba2316853736856dde19b7e7458861 <
    8580571227451384399b3fa53fcde19848c48e5a
  - Linux 7.1
published: '2026-09-11'
updated: '2026-10-19'
sourceUpdated: '2026-10-19T08:50:54.644Z'
source: CVEORG
sourceUrl: 'https://www.cve.org/CVERecord?id=CVE-2026-89681'
references:
  - url: 'https://git.kernel.org/stable/c/a278d361e0e8f242211891193d56483a7a9f47a8'
  - url: 'https://git.kernel.org/stable/c/8580571227451384399b3fa53fcde19848c48e5a'
  - url: >-
      https://security.access.redhat.com/data/csaf/v2/vex/2026/cve-2026-89681.json
  - url: 'https://access.redhat.com/security/cve/CVE-2026-89681'
  - url: 'https://bugzilla.redhat.com/show_bug.cgi?id=2532389'
  - url: 'https://www.cve.org/CVERecord?id=CVE-2026-89681'
  - url: 'https://nvd.nist.gov/vuln/detail/CVE-2026-89681'
  - url: >-
      https://git.kernel.org/pub/scm/linux/security/vulns.git/plain/cve/published/2026/CVE-2026-89681.mbox
tags:
  - cve.org
  - csaf
  - vex
  - red-hat
  - score-dispute
epss: 0.00553
epssPercentile: 0.46018
scores:
  cna: 9.8
  vendor: 5.5
ingestedAt: '2026-09-14T15:23:07.473Z'
---

## Overview

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

nfsd: fix layout fence worker double-reference race

The workqueue core clears WORK_STRUCT_PENDING before the callback
is invoked, so delayed_work_pending() in lm_breaker_timedout() can
return false while the fence worker is already running. This lets
the breaker take a duplicate sc_count reference and schedule a new
worker that coalesces with the in-progress one. The extra reference
is never put, leaking the layout stateid.

Replace the racy delayed_work_pending() check with an
ls_fence_inflight boolean set atomically with
refcount_inc_not_zero() under ls_lock, and cleared under ls_lock
before the final nfs4_put_stid() on the dispose path; the retry
path intentionally retains it.  Remove the self-rearm
mod_delayed_work() at the top of the worker.

## Affected

- `Linux >= f52792f484ba2316853736856dde19b7e7458861 < a278d361e0e8f242211891193d56483a7a9f47a8`
- `Linux >= f52792f484ba2316853736856dde19b7e7458861 < 8580571227451384399b3fa53fcde19848c48e5a`
- `Linux 7.1`

## Remediation

Refer to the linked advisories for vendor-supplied fixes and affected version ranges.

## Vendor advisories

- **Red Hat VEX** · Low · affected: Red Hat Enterprise Linux 10 · no fix planned: Red Hat Enterprise Linux 10 · updated 2026-10-05 · [vex](https://security.access.redhat.com/data/csaf/v2/vex/2026/cve-2026-89681.json)
