NFS: Start PF_INET6 callback listener only if IPv6 support is available
Apparently a lot of people need to disable IPv6 completely on their distributor-built systems, which have CONFIG_IPV6_MODULE enabled at build time. They do this by blacklisting the ipv6.ko module. This causes the creation of the NFSv4 callback 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 the NFS client can try to start a PF_INET6 listener, but it isn't required to be available. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
Родитель
eb16e90778
Коммит
f738f51703
|
@ -38,6 +38,7 @@ static struct svc_program nfs4_callback_program;
|
||||||
|
|
||||||
unsigned int nfs_callback_set_tcpport;
|
unsigned int nfs_callback_set_tcpport;
|
||||||
unsigned short nfs_callback_tcpport;
|
unsigned short nfs_callback_tcpport;
|
||||||
|
unsigned short nfs_callback_tcpport6;
|
||||||
static const int nfs_set_port_min = 0;
|
static const int nfs_set_port_min = 0;
|
||||||
static const int nfs_set_port_max = 65535;
|
static const int nfs_set_port_max = 65535;
|
||||||
|
|
||||||
|
@ -119,6 +120,17 @@ int nfs_callback_up(void)
|
||||||
dprintk("NFS: Callback listener port = %u (af %u)\n",
|
dprintk("NFS: Callback listener port = %u (af %u)\n",
|
||||||
nfs_callback_tcpport, PF_INET);
|
nfs_callback_tcpport, PF_INET);
|
||||||
|
|
||||||
|
#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
|
||||||
|
ret = svc_create_xprt(serv, "tcp", PF_INET6,
|
||||||
|
nfs_callback_set_tcpport, SVC_SOCK_ANONYMOUS);
|
||||||
|
if (ret > 0) {
|
||||||
|
nfs_callback_tcpport6 = ret;
|
||||||
|
dprintk("NFS: Callback listener port = %u (af %u)\n",
|
||||||
|
nfs_callback_tcpport6, PF_INET6);
|
||||||
|
} else if (ret != -EAFNOSUPPORT)
|
||||||
|
goto out_err;
|
||||||
|
#endif /* defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) */
|
||||||
|
|
||||||
nfs_callback_info.rqst = svc_prepare_thread(serv, &serv->sv_pools[0]);
|
nfs_callback_info.rqst = svc_prepare_thread(serv, &serv->sv_pools[0]);
|
||||||
if (IS_ERR(nfs_callback_info.rqst)) {
|
if (IS_ERR(nfs_callback_info.rqst)) {
|
||||||
ret = PTR_ERR(nfs_callback_info.rqst);
|
ret = PTR_ERR(nfs_callback_info.rqst);
|
||||||
|
|
|
@ -72,5 +72,6 @@ extern void nfs_callback_down(void);
|
||||||
|
|
||||||
extern unsigned int nfs_callback_set_tcpport;
|
extern unsigned int nfs_callback_set_tcpport;
|
||||||
extern unsigned short nfs_callback_tcpport;
|
extern unsigned short nfs_callback_tcpport;
|
||||||
|
extern unsigned short nfs_callback_tcpport6;
|
||||||
|
|
||||||
#endif /* __LINUX_FS_NFS_CALLBACK_H */
|
#endif /* __LINUX_FS_NFS_CALLBACK_H */
|
||||||
|
|
|
@ -62,8 +62,14 @@ static LIST_HEAD(nfs4_clientid_list);
|
||||||
|
|
||||||
static int nfs4_init_client(struct nfs_client *clp, struct rpc_cred *cred)
|
static int nfs4_init_client(struct nfs_client *clp, struct rpc_cred *cred)
|
||||||
{
|
{
|
||||||
int status = nfs4_proc_setclientid(clp, NFS4_CALLBACK,
|
unsigned short port;
|
||||||
nfs_callback_tcpport, cred);
|
int status;
|
||||||
|
|
||||||
|
port = nfs_callback_tcpport;
|
||||||
|
if (clp->cl_addr.ss_family == AF_INET6)
|
||||||
|
port = nfs_callback_tcpport6;
|
||||||
|
|
||||||
|
status = nfs4_proc_setclientid(clp, NFS4_CALLBACK, port, cred);
|
||||||
if (status == 0)
|
if (status == 0)
|
||||||
status = nfs4_proc_setclientid_confirm(clp, cred);
|
status = nfs4_proc_setclientid_confirm(clp, cred);
|
||||||
if (status == 0)
|
if (status == 0)
|
||||||
|
|
Загрузка…
Ссылка в новой задаче