android_kernel_xiaomi_sm8450/fs/nfsd
Jeff Layton 3025d489f9 nfsd: move init of percpu reply_cache_stats counters back to nfsd_init_net
[ Upstream commit ed9ab7346e908496816cffdecd46932035f66e2e ]

Commit f5f9d4a314da ("nfsd: move reply cache initialization into nfsd
startup") moved the initialization of the reply cache into nfsd startup,
but didn't account for the stats counters, which can be accessed before
nfsd is ever started. The result can be a NULL pointer dereference when
someone accesses /proc/fs/nfsd/reply_cache_stats while nfsd is still
shut down.

This is a regression and a user-triggerable oops in the right situation:

- non-x86_64 arch
- /proc/fs/nfsd is mounted in the namespace
- nfsd is not started in the namespace
- unprivileged user calls "cat /proc/fs/nfsd/reply_cache_stats"

Although this is easy to trigger on some arches (like aarch64), on
x86_64, calling this_cpu_ptr(NULL) evidently returns a pointer to the
fixed_percpu_data. That struct looks just enough like a newly
initialized percpu var to allow nfsd_reply_cache_stats_show to access
it without Oopsing.

Move the initialization of the per-net+per-cpu reply-cache counters
back into nfsd_init_net, while leaving the rest of the reply cache
allocations to be done at nfsd startup time.

Kudos to Eirik who did most of the legwork to track this down.

Cc: stable@vger.kernel.org # v6.3+
Fixes: f5f9d4a314da ("nfsd: move reply cache initialization into nfsd startup")
Reported-and-tested-by: Eirik Fuller <efuller@redhat.com>
Closes: https://bugzilla.redhat.com/show_bug.cgi?id=2215429
Signed-off-by: Jeff Layton <jlayton@kernel.org>
Stable-dep-of: 4b14885411f7 ("nfsd: make all of the nfsd stats per-network namespace")
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2024-09-12 11:06:44 +02:00
..
acl.h NFSD: add posix ACLs to struct nfsd_attrs 2024-06-21 14:53:55 +02:00
auth.c nfsd: auth: Fix gid sorting when rootsquash enabled 2018-01-22 20:13:07 -08:00
auth.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
blocklayout.c nfsd: move nfserrno() to vfs.c 2024-06-21 14:54:05 +02:00
blocklayoutxdr.c nfsd: move nfserrno() to vfs.c 2024-06-21 14:54:05 +02:00
blocklayoutxdr.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
cache.h nfsd: move init of percpu reply_cache_stats counters back to nfsd_init_net 2024-09-12 11:06:44 +02:00
current_stateid.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
export.c nfsd: report per-export stats 2024-06-21 14:52:56 +02:00
export.h nfsd: move nfserrno() to vfs.c 2024-06-21 14:54:05 +02:00
fault_inject.c nfsd: no need to check return value of debugfs_create functions 2019-07-03 16:57:17 +02:00
filecache.c NFSD: Fix problem of COMMIT and NFS4ERR_DELAY in infinite loop 2024-06-21 14:54:14 +02:00
filecache.h NFSD: Convert filecache to rhltable 2024-06-21 14:54:13 +02:00
flexfilelayout.c nfsd: move nfserrno() to vfs.c 2024-06-21 14:54:05 +02:00
flexfilelayoutxdr.c NFSD: da_addr_body field missing in some GETDEVICEINFO replies 2023-09-19 12:20:15 +02:00
flexfilelayoutxdr.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
idmap.h nfsd: Remove duplicate define of IDMAP_NAMESZ/IDMAP_TYPE_xx 2015-07-20 14:58:46 -04:00
Kconfig nfsd: allow disabling NFSv2 at compile time 2024-06-21 14:54:05 +02:00
lockd.c NFSD: simplify struct nfsfh 2024-06-21 14:53:25 +02:00
Makefile nfsd: allow disabling NFSv2 at compile time 2024-06-21 14:54:05 +02:00
netns.h NFSD: replace delayed_work with work_struct for nfsd_client_shrinker 2024-06-21 14:54:10 +02:00
nfs2acl.c NFSD: Finish converting the NFSv2 GETACL result encoder 2024-06-21 14:54:04 +02:00
nfs3acl.c NFSD: Finish converting the NFSv3 GETACL result encoder 2024-06-21 14:54:04 +02:00
nfs3proc.c NFSD: Add an NFSD_FILE_GC flag to enable nfsd_file garbage collection 2024-06-21 14:54:05 +02:00
nfs3xdr.c NFSD: Clean up WRITE arg decoders 2024-06-21 14:54:00 +02:00
nfs4acl.c NFSD: add posix ACLs to struct nfsd_attrs 2024-06-21 14:53:55 +02:00
nfs4callback.c NFSD: add support for sending CB_RECALL_ANY 2024-06-21 14:54:09 +02:00
nfs4idmap.c nfsd: move nfserrno() to vfs.c 2024-06-21 14:54:05 +02:00
nfs4layouts.c NFSD: Add tracepoints to report NFSv4 callback completions 2024-06-21 14:53:59 +02:00
nfs4proc.c nfsd: Fix a regression in nfsd_setattr() 2024-06-21 14:54:16 +02:00
nfs4recover.c nfsd: Propagate some error code returned by memdup_user() 2024-06-21 14:53:57 +02:00
nfs4state.c nfsd: hold a lighter-weight client reference over CB_RECALL_ANY 2024-07-05 09:12:48 +02:00
nfs4xdr.c nfsd: Fix creation time serialization order 2024-06-21 14:54:14 +02:00
nfscache.c nfsd: move init of percpu reply_cache_stats counters back to nfsd_init_net 2024-09-12 11:06:44 +02:00
nfsctl.c nfsd: move init of percpu reply_cache_stats counters back to nfsd_init_net 2024-09-12 11:06:44 +02:00
nfsd.h nfsd: drop the nfsd_put helper 2024-06-21 14:54:15 +02:00
nfsfh.c knfsd: LOOKUP can return an illegal error value 2024-07-05 09:12:42 +02:00
nfsfh.h NFSD: Use const pointers as parameters to fh_ helpers 2024-06-21 14:54:06 +02:00
nfsproc.c NFSD: Use set_bit(RQ_DROPME) 2024-06-21 14:54:10 +02:00
nfssvc.c nfsd: move reply cache initialization into nfsd startup 2024-09-12 11:06:44 +02:00
nfsxdr.c NFSD: Clean up WRITE arg decoders 2024-06-21 14:54:00 +02:00
pnfs.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
state.h NFSD: add delegation reaper to react to low memory condition 2024-06-21 14:54:09 +02:00
stats.c nfsd: use DEFINE_PROC_SHOW_ATTRIBUTE to define nfsd_proc_ops 2024-06-21 14:54:01 +02:00
stats.h nfsd: make nfsd_stats.th_cnt atomic_t 2024-06-21 14:53:29 +02:00
trace.c NFSD: Add SPDX header for fs/nfsd/trace.c 2024-06-21 14:52:33 +02:00
trace.h nfsd: don't fsync nfsd_files on last close 2024-06-21 14:54:11 +02:00
vfs.c nfsd: Fix a regression in nfsd_setattr() 2024-06-21 14:54:16 +02:00
vfs.h NFSD: Pass the target nfsd_file to nfsd_commit() 2024-06-21 14:54:05 +02:00
xdr3.h SUNRPC: Change return value type of .pc_encode 2024-06-21 14:53:26 +02:00
xdr4.h NFSD: enhance inter-server copy cleanup 2024-06-21 14:54:10 +02:00
xdr4cb.h NFSD: add support for sending CB_RECALL_ANY 2024-06-21 14:54:09 +02:00
xdr.h SUNRPC: Change return value type of .pc_encode 2024-06-21 14:53:26 +02:00