diff --git a/patches.suse/NFS-avoid-spurious-warning-of-lost-lock-that-is-bein.patch b/patches.suse/NFS-avoid-spurious-warning-of-lost-lock-that-is-bein.patch new file mode 100644 index 0000000..f23c823 --- /dev/null +++ b/patches.suse/NFS-avoid-spurious-warning-of-lost-lock-that-is-bein.patch @@ -0,0 +1,76 @@ +From: NeilBrown +Date: Mon, 10 Oct 2022 10:26:51 +1100 +Subject: [PATCH] NFS: avoid spurious warning of lost lock that is being + unlocked. +Git-commit: ef8d98f20dfc79777d2b66a30926533225dc6efa +Patch-mainline: v6.2 +References: bsc#1221791 + +When the NFSv4 state manager recovers state after a server restart, it +reports that locks have been lost if it finds any lock state for which +recovery hasn't been successful. i.e. any for which +NFS_LOCK_INITIALIZED is not set. + +However it only tries to recover locks that are still linked to +inode->i_flctx. So if a lock has been removed from inode->i_flctx, but +the state for that lock has not yet been destroyed, then a spurious +warning results. + +nfs4_proc_unlck() calls locks_lock_inode_wait() - which removes the lock +from ->i_flctx - before sending the unlock request to the server and +before the final nfs4_put_lock_state() is called. This allows a window +in which a spurious warning can be produced. + +So add a new flag NFS_LOCK_UNLOCKING which is set once the decision has +been made to unlock the lock. This will prevent it from triggering any +warning. + +Signed-off-by: NeilBrown +Signed-off-by: Trond Myklebust +Acked-by: NeilBrown + +--- + fs/nfs/nfs4_fs.h | 1 + + fs/nfs/nfs4proc.c | 3 ++- + fs/nfs/nfs4state.c | 3 ++- + 3 files changed, 5 insertions(+), 2 deletions(-) + +--- a/fs/nfs/nfs4_fs.h ++++ b/fs/nfs/nfs4_fs.h +@@ -149,6 +149,7 @@ struct nfs4_lock_state { + struct nfs4_state * ls_state; /* Pointer to open state */ + #define NFS_LOCK_INITIALIZED 0 + #define NFS_LOCK_LOST 1 ++#define NFS_LOCK_UNLOCKING 2 + unsigned long ls_flags; + struct nfs_seqid_counter ls_seqid; + nfs4_stateid ls_stateid; +--- a/fs/nfs/nfs4proc.c ++++ b/fs/nfs/nfs4proc.c +@@ -7023,12 +7023,13 @@ static int nfs4_proc_unlck(struct nfs4_s + mutex_unlock(&sp->so_delegreturn_mutex); + goto out; + } ++ lsp = request->fl_u.nfs4_fl.owner; ++ set_bit(NFS_LOCK_UNLOCKING, &lsp->ls_flags); + up_read(&nfsi->rwsem); + mutex_unlock(&sp->so_delegreturn_mutex); + if (status != 0) + goto out; + /* Is this a delegated lock? */ +- lsp = request->fl_u.nfs4_fl.owner; + if (test_bit(NFS_LOCK_INITIALIZED, &lsp->ls_flags) == 0) + goto out; + alloc_seqid = NFS_SERVER(inode)->nfs_client->cl_mvops->alloc_seqid; +--- a/fs/nfs/nfs4state.c ++++ b/fs/nfs/nfs4state.c +@@ -1648,7 +1648,8 @@ static int __nfs4_reclaim_open_state(str + spin_lock(&state->state_lock); + list_for_each_entry(lock, &state->lock_states, ls_locks) { + trace_nfs4_state_lock_reclaim(state, lock); +- if (!test_bit(NFS_LOCK_INITIALIZED, &lock->ls_flags)) ++ if (!test_bit(NFS_LOCK_INITIALIZED, &lock->ls_flags) && ++ !test_bit(NFS_LOCK_UNLOCKING, &lock->ls_flags)) + pr_warn_ratelimited("NFS: %s: Lock reclaim failed!\n", __func__); + } + spin_unlock(&state->state_lock); diff --git a/series.conf b/series.conf index b429465..fe3dbaa 100644 --- a/series.conf +++ b/series.conf @@ -38052,6 +38052,7 @@ patches.suse/NFSv4-Fix-a-credential-leak-in-_nfs4_discover_trunki.patch patches.suse/NFSv4-Fix-a-deadlock-between-nfs4_open_recover_helpe.patch patches.suse/NFS-Fix-an-Oops-in-nfs_d_automount.patch + patches.suse/NFS-avoid-spurious-warning-of-lost-lock-that-is-bein.patch patches.suse/xprtrdma-Fix-regbuf-data-not-freed-in-rpcrdma_req_cr.patch patches.suse/SUNRPC-Fix-missing-release-socket-in-rpc_sockname.patch patches.suse/NFSv4.x-Fail-client-initialisation-if-state-manager-.patch