linux-stable/fs/nfsd
NeilBrown 5ea9a7c5fe nfsd: don't take fi_lock in nfsd_break_deleg_cb()
A recent change to check_for_locks() changed it to take ->flc_lock while
holding ->fi_lock.  This creates a lock inversion (reported by lockdep)
because there is a case where ->fi_lock is taken while holding
->flc_lock.

->flc_lock is held across ->fl_lmops callbacks, and
nfsd_break_deleg_cb() is one of those and does take ->fi_lock.  However
it doesn't need to.

Prior to v4.17-rc1~110^2~22 ("nfsd: create a separate lease for each
delegation") nfsd_break_deleg_cb() would walk the ->fi_delegations list
and so needed the lock.  Since then it doesn't walk the list and doesn't
need the lock.

Two actions are performed under the lock.  One is to call
nfsd_break_one_deleg which calls nfsd4_run_cb().  These doesn't act on
the nfs4_file at all, so don't need the lock.

The other is to set ->fi_had_conflict which is in the nfs4_file.
This field is only ever set here (except when initialised to false)
so there is no possible problem will multiple threads racing when
setting it.

The field is tested twice in nfs4_set_delegation().  The first test does
not hold a lock and is documented as an opportunistic optimisation, so
it doesn't impose any need to hold ->fi_lock while setting
->fi_had_conflict.

The second test in nfs4_set_delegation() *is* make under ->fi_lock, so
removing the locking when ->fi_had_conflict is set could make a change.
The change could only be interesting if ->fi_had_conflict tested as
false even though nfsd_break_one_deleg() ran before ->fi_lock was
unlocked.  i.e. while hash_delegation_locked() was running.
As hash_delegation_lock() doesn't interact in any way with nfs4_run_cb()
there can be no importance to this interaction.

So this patch removes the locking from nfsd_break_one_deleg() and moves
the final test on ->fi_had_conflict out of the locked region to make it
clear that locking isn't important to the test.  It is still tested
*after* vfs_setlease() has succeeded.  This might be significant and as
vfs_setlease() takes ->flc_lock, and nfsd_break_one_deleg() is called
under ->flc_lock this "after" is a true ordering provided by a spinlock.

Fixes: edcf972515 ("nfsd: fix RELEASE_LOCKOWNER")
Signed-off-by: NeilBrown <neilb@suse.de>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
2024-02-05 09:49:47 -05:00
..
acl.h NFSD: add posix ACLs to struct nfsd_attrs 2022-08-04 10:28:03 -04:00
auth.c cred: get rid of CONFIG_DEBUG_CREDENTIALS 2023-12-15 14:19:48 -08:00
auth.h
blocklayout.c nfsd: convert to new timestamp accessors 2023-10-18 14:08:24 +02:00
blocklayoutxdr.c NFSD: Make @gdev parameter of ->encode_getdeviceinfo a const pointer 2023-10-16 12:44:29 -04:00
blocklayoutxdr.h NFSD: Make @gdev parameter of ->encode_getdeviceinfo a const pointer 2023-10-16 12:44:29 -04:00
cache.h NFSD: Fix checksum mismatches in the duplicate reply cache 2023-11-17 15:13:01 -05:00
current_stateid.h
export.c vfs-6.7.fsid 2023-11-07 12:11:26 -08:00
export.h NFSD: Fix frame size warning in svc_export_parse() 2023-10-16 12:44:39 -04:00
filecache.c NFSD: Make the file_delayed_close workqueue UNBOUND 2024-01-07 17:54:25 -05:00
filecache.h NFSD: Convert filecache to rhltable 2023-04-26 09:04:59 -04:00
flexfilelayout.c nfsd: move nfserrno() to vfs.c 2022-11-28 12:54:44 -05:00
flexfilelayoutxdr.c NFSD: Make @gdev parameter of ->encode_getdeviceinfo a const pointer 2023-10-16 12:44:29 -04:00
flexfilelayoutxdr.h NFSD: Make @gdev parameter of ->encode_getdeviceinfo a const pointer 2023-10-16 12:44:29 -04:00
idmap.h
Kconfig nfsd: new Kconfig option for legacy client tracking 2024-01-07 17:54:24 -05:00
lockd.c
Makefile NFSD: introduce netlink stubs 2023-10-16 12:44:09 -04:00
netlink.c NFSD: introduce netlink stubs 2023-10-16 12:44:09 -04:00
netlink.h NFSD: introduce netlink stubs 2023-10-16 12:44:09 -04:00
netns.h SUNRPC: discard sv_refcnt, and svc_get/svc_put 2024-01-07 17:54:33 -05:00
nfs2acl.c NFSD 6.3 Release Notes 2023-02-22 14:21:40 -08:00
nfs3acl.c NFSD 6.3 Release Notes 2023-02-22 14:21:40 -08:00
nfs3proc.c NFSD 6.7 Release Notes 2023-10-30 10:12:29 -10:00
nfs3xdr.c NFSD: Ensure that xdr_write_pages updates rq_next_page 2023-06-05 09:01:44 -04:00
nfs4acl.c nfsd: inherit required unset default acls from effective set 2023-08-29 17:45:22 -04:00
nfs4callback.c NFSv4, NFSD: move enum nfs_cb_opnum4 to include/linux/nfs4.h 2024-01-07 17:54:26 -05:00
nfs4idmap.c SUNRPC: return proper error from get_expiry() 2023-04-26 09:05:00 -04:00
nfs4layouts.c NFSD: Clean up nfsd4_encode_layoutreturn() 2023-10-16 12:44:29 -04:00
nfs4proc.c NFSD: Modify NFSv4 to use nfsd_read_splice_ok() 2024-01-07 17:54:25 -05:00
nfs4recover.c nfsd: new Kconfig option for legacy client tracking 2024-01-07 17:54:24 -05:00
nfs4state.c nfsd: don't take fi_lock in nfsd_break_deleg_cb() 2024-02-05 09:49:47 -05:00
nfs4xdr.c NFSD: Modify NFSv4 to use nfsd_read_splice_ok() 2024-01-07 17:54:25 -05:00
nfscache.c NFSD: Remove nfsd_drc_gc() tracepoint 2024-01-07 17:54:25 -05:00
nfsctl.c nfsd: rename nfsd_last_thread() to nfsd_destroy_serv() 2024-01-07 17:54:33 -05:00
nfsd.h nfsd: rename nfsd_last_thread() to nfsd_destroy_serv() 2024-01-07 17:54:33 -05:00
nfsfh.c NFSD: Add nfsd4_encode_fattr4_change() 2023-10-16 12:44:14 -04:00
nfsfh.h NFSD: Add nfsd4_encode_fattr4_change() 2023-10-16 12:44:14 -04:00
nfsproc.c NFSD: Hoist rq_vec preparation into nfsd_read() 2023-06-11 16:37:45 -04:00
nfssvc.c nfsd: rename nfsd_last_thread() to nfsd_destroy_serv() 2024-01-07 17:54:33 -05:00
nfsxdr.c NFSD: Ensure that xdr_write_pages updates rq_next_page 2023-06-05 09:01:44 -04:00
pnfs.h NFSD: Make @gdev parameter of ->encode_getdeviceinfo a const pointer 2023-10-16 12:44:29 -04:00
state.h NFSD: Revert 738401a9bd 2023-12-18 11:22:19 -05:00
stats.c NFSD: Rewrite synopsis of nfsd_percpu_counters_init() 2023-10-16 12:44:39 -04:00
stats.h NFSD: Fix frame size warning in svc_export_parse() 2023-10-16 12:44:39 -04:00
trace.c
trace.h NFSD: Remove nfsd_drc_gc() tracepoint 2024-01-07 17:54:25 -05:00
vfs.c NFSD: Replace RQ_SPLICE_OK in nfsd_read() 2024-01-07 17:54:25 -05:00
vfs.h NFSD: Replace RQ_SPLICE_OK in nfsd_read() 2024-01-07 17:54:25 -05:00
xdr.h NFSD: prevent underflow in nfssvc_decode_writeargs() 2022-03-15 09:35:56 -04:00
xdr3.h
xdr4.h NFSD: Modify NFSv4 to use nfsd_read_splice_ok() 2024-01-07 17:54:25 -05:00
xdr4cb.h NFSD: Revert 738401a9bd 2023-12-18 11:22:19 -05:00