SUNRPC: search for service transports in network namespace context
Subsystems (4)
PATCH 1/1 SUNRPC: search for service transports in network namespace context
Service transports are parametrized by network namespace. And thus lookup of transport instance have to take network namespace into account.
--- fs/lockd/svc.c | 2 +- fs/nfsd/nfsctl.c | 4 ++-- include/linux/sunrpc/svc_xprt.h | 3 ++- net/sunrpc/svc_xprt.c | 6 +++++- 4 files changed, 10 insertions(+), 5 deletions(-)
fs/lockd/svc.c +1 -1
@@ -193,7 +193,7 @@ static int create_lockd_listener(struct svc_serv *serv, const char *name, {struct svc_xprt *xprt; - xprt =svc_find_xprt (serv, name, family,0 ); + xprt =svc_find_xprt (serv, name, &init_net, family,0 );if (xprt ==NULL )return svc_create_xprt (serv, name, &init_net, family, port,SVC_SOCK_DEFAULTS );
fs/nfsd/nfsctl.c +2 -2
@@ -721,7 +721,7 @@ static ssize_t __write_ports_addxprt(char *buf) nfsd_serv->sv_nrthreads--;return 0 ; out_close: - xprt =svc_find_xprt (nfsd_serv, transport,PF_INET , port); + xprt =svc_find_xprt (nfsd_serv, transport, &init_net,PF_INET , port);if (xprt !=NULL ) {svc_close_xprt (xprt);svc_xprt_put (xprt);
@@ -747,7 +747,7 @@ static ssize_t __write_ports_delxprt(char *buf)if (port <1 || port >USHRT_MAX || nfsd_serv ==NULL )return -EINVAL ; - xprt =svc_find_xprt (nfsd_serv, transport,AF_UNSPEC , port); + xprt =svc_find_xprt (nfsd_serv, transport, &init_net,AF_UNSPEC , port);if (xprt ==NULL )return -ENOTCONN ;
include/linux/sunrpc/svc_xprt.h +2 -1
@@ -122,7 +122,8 @@ void svc_delete_xprt(struct svc_xprt *xprt);int svc_port_is_privileged (struct sockaddr *sin);int svc_print_xprts (char *buf,int maxlen);struct svc_xprt *svc_find_xprt (struct svc_serv *serv,const char *xcl_name, -const sa_family_t af,const unsigned short port); +struct net *net,const sa_family_t af, +const unsigned short port);int svc_xprt_names (struct svc_serv *serv,char *buf,const int buflen);static inline void svc_xprt_get (struct svc_xprt *xprt)
net/sunrpc/svc_xprt.c +5 -1
@@ -1069,6 +1069,7 @@ static struct svc_deferred_req *svc_deferred_dequeue(struct svc_xprt *xprt)* svc_find_xprt - find an RPC transport instance * @serv: pointer to svc_serv to search * @xcl_name: C string containing transport's class name +* @net: owner net pointer * @af: Address family of transport's local address * @port: transport's IP port number *
@@ -1081,7 +1082,8 @@ static struct svc_deferred_req *svc_deferred_dequeue(struct svc_xprt *xprt)* service's list that has a matching class name. */ struct svc_xprt *svc_find_xprt (struct svc_serv *serv,const char *xcl_name, -const sa_family_t af,const unsigned short port) +struct net *net,const sa_family_t af, +const unsigned short port) {struct svc_xprt *xprt;struct svc_xprt *found =NULL ;
@@ -1092,6 +1094,8 @@ struct svc_xprt *svc_find_xprt(struct svc_serv *serv, const char *xcl_name,spin_lock_bh (&serv->sv_lock);list_for_each_entry (xprt, &serv->sv_permsocks, xpt_list) { +if (xprt->xpt_net != net) +continue ;if (strcmp (xprt->xpt_class->xcl_name, xcl_name))continue ;if (af !=AF_UNSPEC && af != xprt->xpt_local.ss_family)
Quoted 17 lines · Stanislav Kinsbursky
Service transports are parametrized by network namespace. And thus lookup of transport instance have to take network namespace into account.
Signed-off-by Stanislav Kinsbursky<[email protected]>--- fs/lockd/svc.c | 2 +- fs/nfsd/nfsctl.c | 4 ++-- include/linux/sunrpc/svc_xprt.h | 3 ++- net/sunrpc/svc_xprt.c | 6 +++++- 4 files changed, 10 insertions(+), 5 deletions(-)fs/lockd/svc.c +0
-0
fs/lockd/svc.c static int create_lockd_listener(struct svc_serv *serv, const char *name, · line 199
Quoted 8 lines
fs/lockd/svc.c +1
-1@@ -193,7 +193,7 @@ static int create_lockd_listener(struct svc_serv *serv, const char *name, {struct svc_xprt *xprt; - xprt =svc_find_xprt (serv, name, family,0 ); + xprt =svc_find_xprt (serv, name,&init_net, family,0 );if (xprt ==NULL )return svc_create_xprt (serv, name,&init_net, family, port,SVC_SOCK_DEFAULTS );
I might be missing something, but isn't it (at least part of it) already merged in commit fc5d00b04a3a58cac8620403dfe9f43f72578ec1 ?
--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
20.12.2011 14:25, Glauber Costa пишет:
Quoted 21 lines · Stanislav Kinsbursky
Quoted 20 lines
Service transports are parametrized by network namespace. And thus lookup of transport instance have to take network namespace into account.
Signed-off-by Stanislav Kinsbursky<[email protected]>--- fs/lockd/svc.c | 2 +- fs/nfsd/nfsctl.c | 4 ++-- include/linux/sunrpc/svc_xprt.h | 3 ++- net/sunrpc/svc_xprt.c | 6 +++++- 4 files changed, 10 insertions(+), 5 deletions(-)fs/lockd/svc.c +0
-0@@ -193,7 +193,7 @@ static int create_lockd_listener(struct svc_serv *serv, const char *name, {struct svc_xprt *xprt;
Quoted 9 lines
fs/lockd/svc.c static int create_lockd_listener(struct svc_serv *serv, const char *name, · line 199
Quoted 5 lines
fs/lockd/svc.c +1
-1- xprt =svc_find_xprt (serv, name, family,0 ); + xprt =svc_find_xprt (serv, name,&init_net, family,0 );if (xprt ==NULL )return svc_create_xprt (serv, name,&init_net, family, port,SVC_SOCK_DEFAULTS );I might be missing something, but isn't it (at least part of it) already merged in commit
fc5d00b04a3a58cac8620403dfe9f43f72578ec1?
Nope, those one was parameterizing transport creation by network namespace. This one is parameterizing search in poll of existent service transports by network namespace.
Signature · 2 lines
Best regards, Stanislav Kinsbursky