linux/fs/lockd
NeilBrown ecd91855dd lockd: fix vfs_test_lock() calls
[ Upstream commit a49a2a1baa ]

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>
[ adapted c.flc_* field accesses to direct fl_* fields ]
Signed-off-by: Sasha Levin <sashal@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
History 2026-01-19 13:10:10 +01:00
..
clnt4xdr.c lockd: set file_lock start and end when decoding nlm4 testargs 2023-03-30 12:47:56 +02:00
clntlock.c treewide: Add SPDX license identifier for missed files 2019-05-21 10:50:45 +02:00
clntproc.c lockd: Make two symbols static 2019-07-03 17:52:09 -04:00
clntxdr.c NFS: Remove print_overflow_msg() 2019-02-13 11:53:45 -05:00
host.c lockd: move from strlcpy with unused retval to strscpy 2024-04-10 16:19:15 +02:00
Makefile License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
mon.c fs: lockd: avoid possible wrong NULL parameter 2023-09-19 12:22:43 +02:00
netns.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01: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 nfsd: stop setting ->pg_stats for unused stats 2024-09-04 13:23:30 +02:00
svc4proc.c lockd: fix vfs_test_lock() calls 2026-01-19 13:10:10 +01:00
svclock.c lockd: fix vfs_test_lock() calls 2026-01-19 13:10:10 +01:00
svcproc.c lockd: fix vfs_test_lock() calls 2026-01-19 13:10:10 +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: use locks_inode_context helper 2024-04-10 16:19:20 +02:00
svcxdr.h NLM: Fix svcxdr_encode_owner() 2021-09-17 10:35:10 -04:00
xdr.c SUNRPC: Change return value type of .pc_encode 2024-04-10 16:18:54 +02:00
xdr4.c SUNRPC: Change return value type of .pc_encode 2024-04-10 16:18:54 +02:00