aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfsd
diff options
context:
space:
mode:
authorJeff Layton <jlayton@redhat.com>2009-08-14 12:57:58 -0400
committerJ. Bruce Fields <bfields@citi.umich.edu>2009-08-21 11:27:44 -0400
commit7077ecbabd626cce1fcf5cc9766c83ec04d919f9 (patch)
tree20123b656c9e95d5bec27d552ec6e46f84c5bb1b /fs/nfsd
parentnfsd: convert nfs4_cb_conn struct to hold address in sockaddr_storage (diff)
downloadlinux-dev-7077ecbabd626cce1fcf5cc9766c83ec04d919f9.tar.xz
linux-dev-7077ecbabd626cce1fcf5cc9766c83ec04d919f9.zip
nfsd: add support for NFSv4 callbacks over IPv6
The framework to add this is all in place. Now, add the code to allow support for establishing a callback channel on an IPv6 socket. Signed-off-by: Jeff Layton <jlayton@redhat.com> Acked-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
Diffstat (limited to 'fs/nfsd')
-rw-r--r--fs/nfsd/nfs4state.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 96a742308cee..9ec0ca1ef4ea 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -901,9 +901,16 @@ static void
gen_callback(struct nfs4_client *clp, struct nfsd4_setclientid *se)
{
struct nfs4_cb_conn *cb = &clp->cl_cb_conn;
-
- /* Currently, we only support tcp for the callback channel */
- if ((se->se_callback_netid_len != 3) || memcmp((char *)se->se_callback_netid_val, "tcp", 3))
+ unsigned short expected_family;
+
+ /* Currently, we only support tcp and tcp6 for the callback channel */
+ if (se->se_callback_netid_len == 3 &&
+ !memcmp(se->se_callback_netid_val, "tcp", 3))
+ expected_family = AF_INET;
+ else if (se->se_callback_netid_len == 4 &&
+ !memcmp(se->se_callback_netid_val, "tcp6", 4))
+ expected_family = AF_INET6;
+ else
goto out_err;
cb->cb_addrlen = rpc_uaddr2sockaddr(se->se_callback_addr_val,
@@ -911,7 +918,7 @@ gen_callback(struct nfs4_client *clp, struct nfsd4_setclientid *se)
(struct sockaddr *) &cb->cb_addr,
sizeof(cb->cb_addr));
- if (!cb->cb_addrlen || cb->cb_addr.ss_family != AF_INET)
+ if (!cb->cb_addrlen || cb->cb_addr.ss_family != expected_family)
goto out_err;
cb->cb_minorversion = 0;