]> git.ipfire.org Git - thirdparty/kernel/stable.git/commit
NFSD: Fix nfsd4_shutdown_copy()
authorChuck Lever <chuck.lever@oracle.com>
Thu, 31 Oct 2024 13:40:03 +0000 (09:40 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 14 Dec 2024 18:51:07 +0000 (19:51 +0100)
commitb6a394fe4c6bed03641a989b2099e747c5521692
treecf69869f90e7f51b87c7e220f870cd0c8c7684b1
parenta12c897adf40b6e2b4a56e6912380c31bd7b2479
NFSD: Fix nfsd4_shutdown_copy()

[ Upstream commit 62a8642ba00aa8ceb0a02ade942f5ec52e877c95 ]

nfsd4_shutdown_copy() is just this:

while ((copy = nfsd4_get_copy(clp)) != NULL)
nfsd4_stop_copy(copy);

nfsd4_get_copy() bumps @copy's reference count, preventing
nfsd4_stop_copy() from releasing @copy.

A while loop like this usually works by removing the first element
of the list, but neither nfsd4_get_copy() nor nfsd4_stop_copy()
alters the async_copies list.

Best I can tell, then, is that nfsd4_shutdown_copy() continues to
loop until other threads manage to remove all the items from this
list. The spinning loop blocks shutdown until these items are gone.

Possibly the reason we haven't seen this issue in the field is
because client_has_state() prevents __destroy_client() from calling
nfsd4_shutdown_copy() if there are any items on this list. In a
subsequent patch I plan to remove that restriction.

Fixes: e0639dc5805a ("NFSD introduce async copy feature")
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
fs/nfsd/nfs4proc.c