nfsd: don't ignore the return code of svc_proc_register()
Subsystems (3)
[email protected]
maintainerPATCH 1/1 nfsd: don't ignore the return code of svc_proc_register()
From: Jeff Layton <[email protected]>
[ Upstream commit 930b64ca0c511521f0abdd1d57ce52b2a6e3476b ]
Currently, nfsd_proc_stat_init() ignores the return value of svc_proc_register(). If the procfile creation fails, then the kernel will WARN when it tries to remove the entry later.
Fix nfsd_proc_stat_init() to return the same type of pointer as svc_proc_register(), and fix up nfsd_net_init() to check that and fail the nfsd_net construction if it occurs.
svc_proc_register() can fail if the dentry can't be allocated, or if an identical dentry already exists. The second case is pretty unlikely in the nfsd_net construction codepath, so if this happens, return -ENOMEM.
--- fs/nfsd/nfsctl.c | 9 ++++++++- fs/nfsd/stats.c | 4 ++-- fs/nfsd/stats.h | 2 +- 3 files changed, 11 insertions(+), 4 deletions(-)
I did not have any problem cherry-picking 930b64 onto v6.13.11. This built and ran some simple NFSD tests in my lab.
fs/nfsd/nfsctl.c +8 -1
@@ -2244,8 +2244,14 @@ static __net_init int nfsd_net_init(struct net *net) NFSD_STATS_COUNTERS_NUM);if (retval) goto out_repcache_error; +memset (&nn->nfsd_svcstats,0 ,sizeof (nn->nfsd_svcstats)); nn->nfsd_svcstats.program = &nfsd_programs[0 ]; +if (!nfsd_proc_stat_init (net)) { + retval = -ENOMEM ; + goto out_proc_error; + } +for (i =0 ; i <sizeof (nn->nfsd_versions); i++) nn->nfsd_versions[i] =nfsd_support_version (i);for (i =0 ; i <sizeof (nn->nfsd4_minorversions); i++)
@@ -2255,12 +2261,13 @@ static __net_init int nfsd_net_init(struct net *net)nfsd4_init_leases_net (nn);get_random_bytes (&nn->siphash_key,sizeof (nn->siphash_key));seqlock_init (&nn->writeverf_lock); -nfsd_proc_stat_init (net);#if IS_ENABLED (CONFIG_NFS_LOCALIO )INIT_LIST_HEAD (&nn->local_clients);#endif return 0 ; +out_proc_error: +percpu_counter_destroy_many (nn->counter,NFSD_STATS_COUNTERS_NUM ); out_repcache_error:nfsd_idmap_shutdown (net); out_idmap_error:
fs/nfsd/stats.c +2 -2
@@ -73,11 +73,11 @@ static int nfsd_show(struct seq_file *seq, void *v)DEFINE_PROC_SHOW_ATTRIBUTE (nfsd); -void nfsd_proc_stat_init (struct net *net) +struct proc_dir_entry *nfsd_proc_stat_init (struct net *net) {struct nfsd_net *nn =net_generic (net, nfsd_net_id); -svc_proc_register (net, &nn->nfsd_svcstats, &nfsd_proc_ops); +return svc_proc_register (net, &nn->nfsd_svcstats, &nfsd_proc_ops); }void nfsd_proc_stat_shutdown (struct net *net)
fs/nfsd/stats.h +1 -1
@@ -10,7 +10,7 @@#include <uapi/linux/nfsd/stats.h> #include <linux/percpu_counter.h> -void nfsd_proc_stat_init (struct net *net); +struct proc_dir_entry *nfsd_proc_stat_init (struct net *net);void nfsd_proc_stat_shutdown (struct net *net);static inline void nfsd_stats_rc_hits_inc (struct nfsd_net *nn)
Signature · 1 line
2.47.0
Sasha Levin
maintainer[ Sasha's backport helper bot ]
Hi,
✅ All tests passed successfully. No issues detected. No action required from the submitter.
The upstream commit SHA1 provided is correct: 930b64ca0c511521f0abdd1d57ce52b2a6e3476b
WARNING: Author mismatch between patch and upstream commit:
Backport author: [email protected]
Commit author: Jeff Layton<[email protected]>
Status in newer kernel trees:
6.14.y | Present (different SHA1: 9d9456185fd5)
Note: The patch differs from the upstream commit:
---
1: 930b64ca0c511 ! 1: 23c220e9285a7 nfsd: don't ignore the return code of svc_proc_register()
@@ Metadata
## Commit message ##
nfsd: don't ignore the return code of svc_proc_register()
+ [ Upstream commit 930b64ca0c511521f0abdd1d57ce52b2a6e3476b ]
+
Currently, nfsd_proc_stat_init() ignores the return value of svc_proc_register(). If the procfile creation fails, then the kernel will WARN when it tries to remove the entry later.
@@ fs/nfsd/nfsctl.c: static __net_init int nfsd_net_init(struct net *net)
seqlock_init(&nn->writeverf_lock);
- nfsd_proc_stat_init(net);
#if IS_ENABLED(CONFIG_NFS_LOCALIO)
- spin_lock_init(&nn->local_clients_lock);
INIT_LIST_HEAD(&nn->local_clients);
#endif
return 0;
---
Results of testing on various branches:
| Branch | Patch Apply | Build Test | |---------------------------|-------------|------------| | stable/linux-6.13.y | Success | Success |