linux/fs/lockd
NeilBrown 181bb67667 lockd: fix vfs_test_lock() calls
commit a49a2a1baa upstream.

Usage of vfs_test_lock() is somewhat confused.  Documentation suggests
it is given a "lock" but this is not the case.  It is given a struct
file_lock which contains some details of the sort of lock it should be
looking for.

In particular passing a "file_lock" containing fl_lmops or fl_ops is
meaningless and possibly confusing.

This is particularly problematic in lockd.  nlmsvc_testlock() receives
an initialised "file_lock" from xdr-decode, including manager ops and an
owner.  It then mistakenly passes this to vfs_test_lock() which might
replace the owner and the ops.  This can lead to confusion when freeing
the lock.

The primary role of the 'struct file_lock' passed to vfs_test_lock() is
to report a conflicting lock that was found, so it makes more sense for
nlmsvc_testlock() to pass "conflock", which it uses for returning the
conflicting lock.

With this change, freeing of the lock is not confused and code in
__nlm4svc_proc_test() and __nlmsvc_proc_test() can be simplified.

Documentation for vfs_test_lock() is improved to reflect its real
purpose, and a WARN_ON_ONCE() is added to avoid a similar problem in the
future.

Reported-by: Olga Kornievskaia <okorniev@redhat.com>
Closes: https://lore.kernel.org/all/20251021130506.45065-1-okorniev@redhat.com
Signed-off-by: NeilBrown <neil@brown.name>
Fixes: 20fa190272 ("nfs: add export operations")
Cc: stable@vger.kernel.org
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
History 2026-01-08 10:14:49 +01:00
..
clnt4xdr.c lockd: adapt to breakup of struct file_lock 2024-02-05 13:11:43 +01:00
clntlock.c lockd: adapt to breakup of struct file_lock 2024-02-05 13:11:43 +01:00
clntproc.c lockd: adapt to breakup of struct file_lock 2024-02-05 13:11:43 +01:00
clntxdr.c lockd: adapt to breakup of struct file_lock 2024-02-05 13:11:43 +01:00
host.c lockd: discard nlmsvc_timeout 2024-09-01 10:04:56 -04:00
Makefile lockd: Use *-y instead of *-objs in Makefile 2024-07-08 14:10:03 -04:00
mon.c move asm/unaligned.h to linux/unaligned.h 2024-10-02 17:23:23 -04:00
netns.h filelock: move file locking definitions to separate header file 2023-01-11 06:52:32 -05:00
procfs.c proc: convert everything to "struct proc_ops" 2020-02-04 03:05:26 +00:00
procfs.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
svc.c sunrpc: allow svc threads to fail initialisation cleanly 2024-09-20 19:31:03 -04:00
svc4proc.c lockd: fix vfs_test_lock() calls 2026-01-08 10:14:49 +01:00
svclock.c lockd: fix vfs_test_lock() calls 2026-01-08 10:14:49 +01:00
svcproc.c lockd: fix vfs_test_lock() calls 2026-01-08 10:14:49 +01:00
svcshare.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
svcsubs.c lockd: adapt to breakup of struct file_lock 2024-02-05 13:11:43 +01:00
svcxdr.h NLM: Fix svcxdr_encode_owner() 2021-09-17 10:35:10 -04:00
trace.c lockd: add some client-side tracepoints 2023-04-26 09:05:00 -04:00
trace.h lockd: add some client-side tracepoints 2023-04-26 09:05:00 -04:00
xdr.c lockd: adapt to breakup of struct file_lock 2024-02-05 13:11:43 +01:00
xdr4.c lockd: adapt to breakup of struct file_lock 2024-02-05 13:11:43 +01:00