On Tue, 2009-03-03 at 15:34 -0700, Chuck Lever wrote: > Apparently a lot of people need to disable IPv6 completely on their > distributor-built systems, which have CONFIG_IPV6_MODULE enabled. > > They do this by blacklisting the ipv6.ko module. This causes the > creation of the lockd service listener to fail if CONFIG_IPV6_MODULE > is set, but the module cannot be loaded. > > Now that the kernel's PF_INET6 RPC listeners are completely separate > from PF_INET listeners, we can always start PF_INET. Then lockd can > try to start PF_INET6, but it isn't required to be available. > > Note this has the added benefit that NLM callbacks from AF_INET6 > servers will never come from AF_INET remotes. We no longer have to > worry about matching mapped IPv4 addresses to AF_INET when comparing > addresses. > > Signed-off-by: Chuck Lever <chuck.lever@xxxxxxxxxx> > --- > > fs/lockd/svc.c | 28 ++++++++++++++++++++-------- > 1 files changed, 20 insertions(+), 8 deletions(-) > > diff --git a/fs/lockd/svc.c b/fs/lockd/svc.c > index 566932b..4342b41 100644 > --- a/fs/lockd/svc.c > +++ b/fs/lockd/svc.c > @@ -194,19 +194,29 @@ lockd(void *vrqstp) > } > > static int create_lockd_listener(struct svc_serv *serv, char *name, > - unsigned short port) > + const int family, const unsigned > short port) > { > struct svc_xprt *xprt; > > - xprt = svc_find_xprt(serv, name, 0, 0); > + xprt = svc_find_xprt(serv, name, family, 0); > if (xprt == NULL) > - return svc_create_xprt(serv, name, PF_INET, > - port, SVC_SOCK_DEFAULTS); > - > + return svc_create_xprt(serv, name, family, port, > + SVC_SOCK_DEFAULTS); > svc_xprt_put(xprt); > return 0; > } > > +static int create_lockd_family(struct svc_serv *serv, const int > family) > +{ > + int err; > + > + err = create_lockd_listener(serv, "udp", family, nlm_udpport); > + if (err < 0) > + return err; > + > + return create_lockd_listener(serv, "tcp", family, > nlm_tcpport); > +} > + > /* > * Ensure there are active UDP and TCP listeners for lockd. > * > @@ -222,13 +232,15 @@ static int make_socks(struct svc_serv *serv) > static int warned; > int err; > > - err = create_lockd_listener(serv, "udp", nlm_udpport); > + err = create_lockd_family(serv, PF_INET); > if (err < 0) > goto out_err; > > - err = create_lockd_listener(serv, "tcp", nlm_tcpport); > - if (err < 0) > +#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) > + err = create_lockd_family(serv, PF_INET6); > + if (err < 0 && err != -EAFNOSUPPORT) > goto out_err; > +#endif /* CONFIG_IPV6 || CONFIG_IPV6_MODULE */ > > warned = 0; > return 0; > lockd_up: makesock failed, error=-98 IOW: EADDRINUSE Isn't that call to IPV6_V6ONLY supposed to be set _before_ you bind the socket to a particular port? -- Trond Myklebust Linux NFS client maintainer NetApp Trond.Myklebust@xxxxxxxxxx www.netapp.com -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html