diff options
author | Chuck Lever <chuck.lever@oracle.com> | 2010-01-26 14:04:22 -0500 |
---|---|---|
committer | J. Bruce Fields <bfields@citi.umich.edu> | 2010-01-27 17:01:08 -0500 |
commit | 37498292aa97658a5d0a9bb84699ce8c1016bb74 (patch) | |
tree | d428a82fd275b739a7d631a2707314d76b82e84c /fs/nfsd/nfsctl.c | |
parent | 68717908155a9dcd4161f4d730fea478712d9794 (diff) |
NFSD: Create PF_INET6 listener in write_ports
Try to create a PF_INET6 listener for NFSD, if IPv6 is enabled in the
kernel.
Make sure nfsd_serv's reference count is decreased if
__write_ports_addxprt() failed to create a listener. See
__write_ports_addfd().
Our current plan is to rely on rpc.nfsd to create appropriate IPv6
listeners when server-side NFS/IPv6 support is desired. Legacy
behavior, via the write_threads or write_svc kernel APIs, will remain
the same -- only IPv4 listeners are created.
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
[bfields@citi.umich.edu: Move error-handling code to end]
Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
Diffstat (limited to 'fs/nfsd/nfsctl.c')
-rw-r--r-- | fs/nfsd/nfsctl.c | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c index f43ecd61fa81..0f0e77f2012f 100644 --- a/fs/nfsd/nfsctl.c +++ b/fs/nfsd/nfsctl.c | |||
@@ -988,6 +988,7 @@ static ssize_t __write_ports_delfd(char *buf) | |||
988 | static ssize_t __write_ports_addxprt(char *buf) | 988 | static ssize_t __write_ports_addxprt(char *buf) |
989 | { | 989 | { |
990 | char transport[16]; | 990 | char transport[16]; |
991 | struct svc_xprt *xprt; | ||
991 | int port, err; | 992 | int port, err; |
992 | 993 | ||
993 | if (sscanf(buf, "%15s %4u", transport, &port) != 2) | 994 | if (sscanf(buf, "%15s %4u", transport, &port) != 2) |
@@ -1003,8 +1004,23 @@ static ssize_t __write_ports_addxprt(char *buf) | |||
1003 | err = svc_create_xprt(nfsd_serv, transport, | 1004 | err = svc_create_xprt(nfsd_serv, transport, |
1004 | PF_INET, port, SVC_SOCK_ANONYMOUS); | 1005 | PF_INET, port, SVC_SOCK_ANONYMOUS); |
1005 | if (err < 0) | 1006 | if (err < 0) |
1006 | return err; | 1007 | goto out_err; |
1008 | |||
1009 | err = svc_create_xprt(nfsd_serv, transport, | ||
1010 | PF_INET6, port, SVC_SOCK_ANONYMOUS); | ||
1011 | if (err < 0 && err != -EAFNOSUPPORT) | ||
1012 | goto out_close; | ||
1007 | return 0; | 1013 | return 0; |
1014 | out_close: | ||
1015 | xprt = svc_find_xprt(nfsd_serv, transport, PF_INET, port); | ||
1016 | if (xprt != NULL) { | ||
1017 | svc_close_xprt(xprt); | ||
1018 | svc_xprt_put(xprt); | ||
1019 | } | ||
1020 | out_err: | ||
1021 | /* Decrease the count, but don't shut down the service */ | ||
1022 | nfsd_serv->sv_nrthreads--; | ||
1023 | return err; | ||
1008 | } | 1024 | } |
1009 | 1025 | ||
1010 | /* | 1026 | /* |