diff options
| -rw-r--r-- | fs/nfs/callback.c | 12 | ||||
| -rw-r--r-- | fs/nfs/callback.h | 1 | ||||
| -rw-r--r-- | fs/nfs/nfs4state.c | 10 |
3 files changed, 21 insertions, 2 deletions
diff --git a/fs/nfs/callback.c b/fs/nfs/callback.c index 0ef47dff89be..a886e692ddd0 100644 --- a/fs/nfs/callback.c +++ b/fs/nfs/callback.c | |||
| @@ -38,6 +38,7 @@ static struct svc_program nfs4_callback_program; | |||
| 38 | 38 | ||
| 39 | unsigned int nfs_callback_set_tcpport; | 39 | unsigned int nfs_callback_set_tcpport; |
| 40 | unsigned short nfs_callback_tcpport; | 40 | unsigned short nfs_callback_tcpport; |
| 41 | unsigned short nfs_callback_tcpport6; | ||
| 41 | static const int nfs_set_port_min = 0; | 42 | static const int nfs_set_port_min = 0; |
| 42 | static const int nfs_set_port_max = 65535; | 43 | static const int nfs_set_port_max = 65535; |
| 43 | 44 | ||
| @@ -119,6 +120,17 @@ int nfs_callback_up(void) | |||
| 119 | dprintk("NFS: Callback listener port = %u (af %u)\n", | 120 | dprintk("NFS: Callback listener port = %u (af %u)\n", |
| 120 | nfs_callback_tcpport, PF_INET); | 121 | nfs_callback_tcpport, PF_INET); |
| 121 | 122 | ||
| 123 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) | ||
| 124 | ret = svc_create_xprt(serv, "tcp", PF_INET6, | ||
| 125 | nfs_callback_set_tcpport, SVC_SOCK_ANONYMOUS); | ||
| 126 | if (ret > 0) { | ||
| 127 | nfs_callback_tcpport6 = ret; | ||
| 128 | dprintk("NFS: Callback listener port = %u (af %u)\n", | ||
| 129 | nfs_callback_tcpport6, PF_INET6); | ||
| 130 | } else if (ret != -EAFNOSUPPORT) | ||
| 131 | goto out_err; | ||
| 132 | #endif /* defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) */ | ||
| 133 | |||
| 122 | nfs_callback_info.rqst = svc_prepare_thread(serv, &serv->sv_pools[0]); | 134 | nfs_callback_info.rqst = svc_prepare_thread(serv, &serv->sv_pools[0]); |
| 123 | if (IS_ERR(nfs_callback_info.rqst)) { | 135 | if (IS_ERR(nfs_callback_info.rqst)) { |
| 124 | ret = PTR_ERR(nfs_callback_info.rqst); | 136 | ret = PTR_ERR(nfs_callback_info.rqst); |
diff --git a/fs/nfs/callback.h b/fs/nfs/callback.h index bb25d2135ff1..e110e286a262 100644 --- a/fs/nfs/callback.h +++ b/fs/nfs/callback.h | |||
| @@ -72,5 +72,6 @@ extern void nfs_callback_down(void); | |||
| 72 | 72 | ||
| 73 | extern unsigned int nfs_callback_set_tcpport; | 73 | extern unsigned int nfs_callback_set_tcpport; |
| 74 | extern unsigned short nfs_callback_tcpport; | 74 | extern unsigned short nfs_callback_tcpport; |
| 75 | extern unsigned short nfs_callback_tcpport6; | ||
| 75 | 76 | ||
| 76 | #endif /* __LINUX_FS_NFS_CALLBACK_H */ | 77 | #endif /* __LINUX_FS_NFS_CALLBACK_H */ |
diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c index 2022fe47966f..0298e909559f 100644 --- a/fs/nfs/nfs4state.c +++ b/fs/nfs/nfs4state.c | |||
| @@ -62,8 +62,14 @@ static LIST_HEAD(nfs4_clientid_list); | |||
| 62 | 62 | ||
| 63 | static int nfs4_init_client(struct nfs_client *clp, struct rpc_cred *cred) | 63 | static int nfs4_init_client(struct nfs_client *clp, struct rpc_cred *cred) |
| 64 | { | 64 | { |
| 65 | int status = nfs4_proc_setclientid(clp, NFS4_CALLBACK, | 65 | unsigned short port; |
| 66 | nfs_callback_tcpport, cred); | 66 | int status; |
| 67 | |||
| 68 | port = nfs_callback_tcpport; | ||
| 69 | if (clp->cl_addr.ss_family == AF_INET6) | ||
| 70 | port = nfs_callback_tcpport6; | ||
| 71 | |||
| 72 | status = nfs4_proc_setclientid(clp, NFS4_CALLBACK, port, cred); | ||
| 67 | if (status == 0) | 73 | if (status == 0) |
| 68 | status = nfs4_proc_setclientid_confirm(clp, cred); | 74 | status = nfs4_proc_setclientid_confirm(clp, cred); |
| 69 | if (status == 0) | 75 | if (status == 0) |
