nfsd: cleanup "init_net" references
Subsystems (2)
cover nfsd: cleanup "init_net" references
Hard-coded "init_net" pointer is widely used in NFSd code.
This patch replaces "init_net" references by passed struct net pointer where requied.
In future, proper network namespace context will be taken from NFSd file system superblock private data or, where it's impossible, from current.
The following series implements...
---
Stanislav Kinsbursky (7):
nfsd: use "init_net" for portmapper
nfsd: pass net to nfsd_init_socks()
nfsd: pass net to nfsd_startup() and nfsd_shutdown()
nfsd: pass net to nfsd_create_serv()
nfsd: pass net to nfsd_svc()
nfsd: pass net to nfsd_set_nrthreads()
nfsd: pass net to __write_ports() and down
fs/nfsd/nfsctl.c | 27 +++++++++++++++------------ fs/nfsd/nfsd.h | 6 +++--- fs/nfsd/nfssvc.c | 35 ++++++++++++++--------------------- 3 files changed, 32 insertions(+), 36 deletions(-)
PATCH 1/7 nfsd: use "init_net" for portmapper
There could be a situation, when NFSd was started in one network namespace, but stopped in another one.
This will trigger kernel panic, because RPCBIND client is stored on per-net NFSd data, and will be NULL on NFSd shutdown.
--- fs/nfsd/nfssvc.c | 3 +-- 1 files changed, 1 insertions(+), 2 deletions(-)
fs/nfsd/nfssvc.c +1 -2
@@ -11,7 +11,6 @@#include <linux/module.h> #include <linux/fs_struct.h> #include <linux/swap.h> -#include <linux/nsproxy.h> #include <linux/sunrpc/stats.h> #include <linux/sunrpc/svcsock.h>
@@ -341,7 +340,7 @@ static int nfsd_get_default_max_blksize(void)int nfsd_create_serv (void ) {int error; -struct net *net = current->nsproxy->net_ns; +struct net *net = &init_net;WARN_ON (!mutex_is_locked (&nfsd_mutex));if (nfsd_serv) {
PATCH 2/7 nfsd: pass net to nfsd_init_socks()
In reply to Stanislav KinsburskyPrecursor patch. Hard-coded "init_net" will be replaced by proper one in future.
--- fs/nfsd/nfssvc.c | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-)
fs/nfsd/nfssvc.c +4 -4
@@ -182,18 +182,18 @@ int nfsd_nrthreads(void)return rv; } -static int nfsd_init_socks (void ) +static int nfsd_init_socks (struct net *net) {int error;if (!list_empty (&nfsd_serv->sv_permsocks))return 0 ; - error =svc_create_xprt (nfsd_serv,"udp" , &init_net,PF_INET ,NFS_PORT , + error =svc_create_xprt (nfsd_serv,"udp" , net,PF_INET ,NFS_PORT ,SVC_SOCK_DEFAULTS );if (error <0 )return error; - error =svc_create_xprt (nfsd_serv,"tcp" , &init_net,PF_INET ,NFS_PORT , + error =svc_create_xprt (nfsd_serv,"tcp" , net,PF_INET ,NFS_PORT ,SVC_SOCK_DEFAULTS );if (error <0 )return error;
@@ -218,7 +218,7 @@ static int nfsd_startup(int nrservs) ret =nfsd_racache_init (2 *nrservs);if (ret)return ret; - ret =nfsd_init_socks (); + ret =nfsd_init_socks (net);if (ret) goto out_racache; ret =lockd_up (net);
PATCH 3/7 nfsd: pass net to nfsd_startup() and nfsd_shutdown()
In reply to Stanislav KinsburskyPrecursor patch. Hard-coded "init_net" will be replaced by proper one in future.
--- fs/nfsd/nfssvc.c | 15 ++++++--------- 1 files changed, 6 insertions(+), 9 deletions(-)
fs/nfsd/nfssvc.c +6 -9
@@ -203,10 +203,9 @@ static int nfsd_init_socks(struct net *net)static bool nfsd_up = false; -static int nfsd_startup (int nrservs) +static int nfsd_startup (int nrservs,struct net *net) {int ret; -struct net *net = &init_net;if (nfsd_up)return 0 ;
@@ -237,16 +236,14 @@ static int nfsd_startup(int nrservs) out_net_state:nfs4_state_shutdown (); out_lockd: -lockd_down (&init_net); +lockd_down (net); out_racache:nfsd_racache_shutdown ();return ret; } -static void nfsd_shutdown (void ) +static void nfsd_shutdown (struct net *net) { -struct net *net = &init_net; -/* * write_ports can create the server without actually starting * any threads--if we get shut down before any threads are
@@ -264,7 +261,7 @@ static void nfsd_shutdown(void)static void nfsd_last_thread (struct svc_serv *serv,struct net *net) { -nfsd_shutdown (); +nfsd_shutdown (net);svc_rpcb_cleanup (serv, net);
@@ -468,7 +465,7 @@ nfsd_svc(int nrservs) nfsd_up_before = nfsd_up; - error =nfsd_startup (nrservs); + error =nfsd_startup (nrservs, net);if (error) goto out_destroy; error =svc_set_num_threads (nfsd_serv,NULL , nrservs);
@@ -481,7 +478,7 @@ nfsd_svc(int nrservs) error = nfsd_serv->sv_nrthreads -1 ; out_shutdown:if (error <0 && !nfsd_up_before) -nfsd_shutdown (); +nfsd_shutdown (net); out_destroy:nfsd_destroy (net);/* Release server */ out:
PATCH 4/7 nfsd: pass net to nfsd_create_serv()
In reply to Stanislav KinsburskyPrecursor patch. Hard-coded "init_net" will be replaced by proper one in future.
--- fs/nfsd/nfsctl.c | 4 ++-- fs/nfsd/nfsd.h | 2 +- fs/nfsd/nfssvc.c | 5 ++--- 3 files changed, 5 insertions(+), 6 deletions(-)
fs/nfsd/nfsctl.c +2 -2
@@ -664,7 +664,7 @@ static ssize_t __write_ports_addfd(char *buf)if (err !=0 || fd <0 )return -EINVAL ; - err =nfsd_create_serv (); + err =nfsd_create_serv (net);if (err !=0 )return err;
@@ -696,7 +696,7 @@ static ssize_t __write_ports_addxprt(char *buf)if (port <1 || port >USHRT_MAX )return -EINVAL ; - err =nfsd_create_serv (); + err =nfsd_create_serv (net);if (err !=0 )return err;
fs/nfsd/nfsd.h +1 -1
@@ -103,7 +103,7 @@ enum vers_op {NFSD_SET, NFSD_CLEAR, NFSD_TEST, NFSD_AVAIL };int nfsd_vers (int vers,enum vers_op change);int nfsd_minorversion (u32 minorversion,enum vers_op change);void nfsd_reset_versions (void ); -int nfsd_create_serv (void ); +int nfsd_create_serv (struct net *net);extern int nfsd_max_blksize;
fs/nfsd/nfssvc.c +2 -3
@@ -334,10 +334,9 @@ static int nfsd_get_default_max_blksize(void)return ret; } -int nfsd_create_serv (void ) +int nfsd_create_serv (struct net *net) {int error; -struct net *net = &init_net;WARN_ON (!mutex_is_locked (&nfsd_mutex));if (nfsd_serv) {
@@ -459,7 +458,7 @@ nfsd_svc(int nrservs)if (nrservs ==0 && nfsd_serv ==NULL ) goto out; - error =nfsd_create_serv (); + error =nfsd_create_serv (net);if (error) goto out;
PATCH 5/7 nfsd: pass net to nfsd_svc()
In reply to Stanislav KinsburskyPrecursor patch. Hard-coded "init_net" will be replaced by proper one in future.
--- fs/nfsd/nfsctl.c | 4 +++- fs/nfsd/nfsd.h | 2 +- fs/nfsd/nfssvc.c | 3 +-- 3 files changed, 5 insertions(+), 4 deletions(-)
fs/nfsd/nfsctl.c +3 -1
@@ -396,6 +396,8 @@ static ssize_t write_threads(struct file *file, char *buf, size_t size) {char *mesg = buf;int rv; +struct net *net = &init_net; +if (size >0 ) {int newthreads; rv =get_int (&mesg, &newthreads);
@@ -403,7 +405,7 @@ static ssize_t write_threads(struct file *file, char *buf, size_t size)return rv;if (newthreads <0 )return -EINVAL ; - rv =nfsd_svc (newthreads); + rv =nfsd_svc (newthreads, net);if (rv <0 )return rv; }else
fs/nfsd/nfsd.h +1 -1
@@ -65,7 +65,7 @@ extern const struct seq_operations nfs_exports_op;/* * Function prototypes. */ -int nfsd_svc (int nrservs); +int nfsd_svc (int nrservs,struct net *net);int nfsd_dispatch (struct svc_rqst *rqstp,__be32 *statp);int nfsd_nrthreads (void );
fs/nfsd/nfssvc.c +1 -2
@@ -442,11 +442,10 @@ int nfsd_set_nrthreads(int n, int *nthreads)* this is the first time nrservs is nonzero. */ int -nfsd_svc (int nrservs) +nfsd_svc (int nrservs,struct net *net) {int error;bool nfsd_up_before; -struct net *net = &init_net;mutex_lock (&nfsd_mutex);dprintk ("nfsd: creating service\n" );
PATCH 6/7 nfsd: pass net to nfsd_set_nrthreads()
In reply to Stanislav KinsburskyPrecursor patch. Hard-coded "init_net" will be replaced by proper one in future.
--- fs/nfsd/nfsctl.c | 3 ++- fs/nfsd/nfsd.h | 2 +- fs/nfsd/nfssvc.c | 3 +-- 3 files changed, 4 insertions(+), 4 deletions(-)
fs/nfsd/nfsctl.c +2 -1
@@ -447,6 +447,7 @@ static ssize_t write_pool_threads(struct file *file, char *buf, size_t size)int len;int npools;int *nthreads; +struct net *net = &init_net;mutex_lock (&nfsd_mutex); npools =nfsd_nrpools ();
@@ -477,7 +478,7 @@ static ssize_t write_pool_threads(struct file *file, char *buf, size_t size)if (nthreads[i] <0 ) goto out_free; } - rv =nfsd_set_nrthreads (i, nthreads); + rv =nfsd_set_nrthreads (i, nthreads, net);if (rv) goto out_free; }
fs/nfsd/nfsd.h +1 -1
@@ -71,7 +71,7 @@ int nfsd_dispatch(struct svc_rqst *rqstp, __be32 *statp);int nfsd_nrthreads (void );int nfsd_nrpools (void );int nfsd_get_nrthreads (int n,int *); -int nfsd_set_nrthreads (int n,int *); +int nfsd_set_nrthreads (int n,int *,struct net *);int nfsd_pool_stats_open (struct inode *,struct file *);int nfsd_pool_stats_release (struct inode *,struct file *);
fs/nfsd/nfssvc.c +1 -2
@@ -382,12 +382,11 @@ int nfsd_get_nrthreads(int n, int *nthreads)return 0 ; } -int nfsd_set_nrthreads (int n,int *nthreads) +int nfsd_set_nrthreads (int n,int *nthreads,struct net *net) {int i =0 ;int tot =0 ;int err =0 ; -struct net *net = &init_net;WARN_ON (!mutex_is_locked (&nfsd_mutex));
PATCH 7/7 nfsd: pass net to __write_ports() and down
In reply to Stanislav KinsburskyPrecursor patch. Hard-coded "init_net" will be replaced by proper one in future.
--- fs/nfsd/nfsctl.c | 16 ++++++++-------- 1 files changed, 8 insertions(+), 8 deletions(-)
fs/nfsd/nfsctl.c +8 -8
@@ -657,11 +657,10 @@ static ssize_t __write_ports_names(char *buf)* a socket of a supported family/protocol, and we use it as an * nfsd listener. */ -static ssize_t __write_ports_addfd (char *buf) +static ssize_t __write_ports_addfd (char *buf,struct net *net) {char *mesg = buf;int fd, err; -struct net *net = &init_net; err =get_int (&mesg, &fd);if (err !=0 || fd <0 )
@@ -686,12 +685,11 @@ static ssize_t __write_ports_addfd(char *buf)* A transport listener is added by writing it's transport name and * a port number. */ -static ssize_t __write_ports_addxprt (char *buf) +static ssize_t __write_ports_addxprt (char *buf,struct net *net) {char transport[16 ];struct svc_xprt *xprt;int port, err; -struct net *net = &init_net;if (sscanf (buf,"%15s %5u" , transport, &port) !=2 )return -EINVAL ;
@@ -727,16 +725,17 @@ out_err:return err; } -static ssize_t __write_ports (struct file *file,char *buf,size_t size) +static ssize_t __write_ports (struct file *file,char *buf,size_t size, +struct net *net) {if (size ==0 )return __write_ports_names (buf);if (isdigit (buf[0 ])) -return __write_ports_addfd (buf); +return __write_ports_addfd (buf, net);if (isalpha (buf[0 ])) -return __write_ports_addxprt (buf); +return __write_ports_addxprt (buf, net);return -EINVAL ; }
@@ -787,9 +786,10 @@ static ssize_t __write_ports(struct file *file, char *buf, size_t size)static ssize_t write_ports (struct file *file,char *buf,size_t size) {ssize_t rv; +struct net *net = &init_net;mutex_lock (&nfsd_mutex); - rv =__write_ports (file, buf, size); + rv =__write_ports (file, buf, size, net);mutex_unlock (&nfsd_mutex);return rv; }
Quoted 5 lines · Stanislav Kinsbursky
Hard-coded "
init_net" pointer is widely used in NFSd code.
This patch replaces "init_net" references by passed struct net pointer where requied.
In future, proper network namespace context will be taken from NFSd file system superblock private data or, where it's impossible, from current.
Thanks, applying.--b.
Quoted 20 lines
The following series implements...
---
Stanislav Kinsbursky (7):
nfsd: use "init_net" for portmapper
nfsd: pass net tonfsd_init_socks()
nfsd: pass net tonfsd_startup()andnfsd_shutdown()
nfsd: pass net tonfsd_create_serv()
nfsd: pass net tonfsd_svc()
nfsd: pass net tonfsd_set_nrthreads()
nfsd: pass net to__write_ports()and downfs/nfsd/nfsctl.c | 27 +++++++++++++++------------ fs/nfsd/nfsd.h | 6 +++--- fs/nfsd/nfssvc.c | 35 ++++++++++++++--------------------- 3 files changed, 32 insertions(+), 36 deletions(-)