FAILED: patch "[PATCH] nfsd: fix BUG_ON in nfsd4_alloc_layout_stateid on racing" failed to apply to 6.1-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 6.1-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.1.y
git checkout FETCH_HEAD
git cherry-pick -x ca94ba36172046be6a694a7986f6931e47ed4d51
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026090305-settle-sarcasm-3f00@gregkh' --subject-prefix 'PATCH 6.1.y' 'HEAD^..'
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From ca94ba36172046be6a694a7986f6931e47ed4d51 Mon Sep 17 00:00:00 2001
From: Jeff Layton <[email protected]>
Date: Sat, 30 May 2026 09:19:17 -0400
Subject: [PATCH] nfsd: fix BUG_ON in nfsd4_alloc_layout_stateid on racing
delegation revoke
nfsd4_alloc_layout_stateid reads fp->fi_deleg_file without holding fi_lock when the parent stateid is a delegation. A concurrent delegation revoke via the laundromat can clear fi_deleg_file under fi_lock, causing nfsd_file_get() to return NULL and triggering the BUG_ON.
This race is client-reachable: two NFS clients can trigger it by having one hold a delegation while another opens the same file to force a recall. When the first client doesn't respond to the recall, the laundromat revokes it. A concurrent LAYOUTGET from any client using the delegation stateid hits the race window.
Fix this by taking fi_lock around the fi_deleg_file read in the SC_TYPE_DELEG path, matching the locking discipline of the find_any_file() arm, and replacing the BUG_ON with a graceful error return that cleans up the partially-initialized layout stateid.
fs/nfsd/nfs4layouts.c +9 -3
@@ -247,11 +247,17 @@ nfsd4_alloc_layout_stateid(struct nfsd4_compound_state *cstate,nfsd4_init_cb (&ls->ls_recall, clp, &nfsd4_cb_layout_ops,NFSPROC4_CLNT_CB_LAYOUT ); -if (parent->sc_type ==SC_TYPE_DELEG ) +if (parent->sc_type ==SC_TYPE_DELEG ) { +spin_lock (&fp->fi_lock); ls->ls_file =nfsd_file_get (fp->fi_deleg_file); -else +spin_unlock (&fp->fi_lock); + }else { ls->ls_file =find_any_file (fp); -BUG_ON (!ls->ls_file); + } +if (!ls->ls_file) { +nfs4_put_stid (stp); +return NULL ; + } ls->ls_fenced = false; ls->ls_fence_delay =0 ;
Sasha Levin
maintainerPATCH 1/1 nfsd: fix BUG_ON in nfsd4_alloc_layout_stateid on racing delegation revoke
From: Jeff Layton <[email protected]>
[ Upstream commit ca94ba36172046be6a694a7986f6931e47ed4d51 ]
nfsd4_alloc_layout_stateid reads fp->fi_deleg_file without holding fi_lock when the parent stateid is a delegation. A concurrent delegation revoke via the laundromat can clear fi_deleg_file under fi_lock, causing nfsd_file_get() to return NULL and triggering the BUG_ON.
This race is client-reachable: two NFS clients can trigger it by having one hold a delegation while another opens the same file to force a recall. When the first client doesn't respond to the recall, the laundromat revokes it. A concurrent LAYOUTGET from any client using the delegation stateid hits the race window.
Fix this by taking fi_lock around the fi_deleg_file read in the SC_TYPE_DELEG path, matching the locking discipline of the find_any_file() arm, and replacing the BUG_ON with a graceful error return that cleans up the partially-initialized layout stateid.
--- fs/nfsd/nfs4layouts.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-)
fs/nfsd/nfs4layouts.c +15 -6
@@ -168,9 +168,12 @@ nfsd4_free_layout_stateid(struct nfs4_stid *stid)list_del_init (&ls->ls_perfile);spin_unlock (&fp->fi_lock); -if (!nfsd4_layout_ops[ls->ls_layout_type]->disable_recalls) -vfs_setlease (ls->ls_file->nf_file,F_UNLCK ,NULL , (void **)&ls); -nfsd_file_put (ls->ls_file); +if (ls->ls_file) { +if (!nfsd4_layout_ops[ls->ls_layout_type]->disable_recalls) +vfs_setlease (ls->ls_file->nf_file,F_UNLCK ,NULL , + (void **)&ls); +nfsd_file_put (ls->ls_file); + }if (ls->ls_recalled)atomic_dec (&ls->ls_stid.sc_file->fi_lo_recalls);
@@ -235,11 +238,17 @@ nfsd4_alloc_layout_stateid(struct nfsd4_compound_state *cstate,nfsd4_init_cb (&ls->ls_recall, clp, &nfsd4_cb_layout_ops,NFSPROC4_CLNT_CB_LAYOUT ); -if (parent->sc_type ==NFS4_DELEG_STID ) +if (parent->sc_type ==NFS4_DELEG_STID ) { +spin_lock (&fp->fi_lock); ls->ls_file =nfsd_file_get (fp->fi_deleg_file); -else +spin_unlock (&fp->fi_lock); + }else { ls->ls_file =find_any_file (fp); -BUG_ON (!ls->ls_file); + } +if (!ls->ls_file) { +nfs4_put_stid (stp); +return NULL ; + }if (nfsd4_layout_setlease (ls)) {nfs4_put_stid (stp);
Signature · 1 line
2.53.0