aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfsd/nfsctl.c
diff options
context:
space:
mode:
authorAurélien Charbon <aurelien.charbon@ext.bull.net>2008-01-18 09:50:56 -0500
committerJ. Bruce Fields <bfields@citi.umich.edu>2008-04-23 16:13:36 -0400
commitf15364bd4cf8799a7677b6daeed7b67d9139d974 (patch)
treebef48016533d184ea171d4b64336a5ad65ebc18e /fs/nfsd/nfsctl.c
parentd751a7cd0695554498f25d3026ca6710dbb3698f (diff)
IPv6 support for NFS server export caches
This adds IPv6 support to the interfaces that are used to express nfsd exports. All addressed are stored internally as IPv6; backwards compatibility is maintained using mapped addresses. Thanks to Bruce Fields, Brian Haley, Neil Brown and Hideaki Joshifuji for comments Signed-off-by: Aurelien Charbon <aurelien.charbon@bull.net> Cc: Neil Brown <neilb@suse.de> Cc: Brian Haley <brian.haley@hp.com> Cc: YOSHIFUJI Hideaki / 吉藤英明 <yoshfuji@linux-ipv6.org> Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
Diffstat (limited to 'fs/nfsd/nfsctl.c')
-rw-r--r--fs/nfsd/nfsctl.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c
index 8516137cdbb0..9f038a4a148e 100644
--- a/fs/nfsd/nfsctl.c
+++ b/fs/nfsd/nfsctl.c
@@ -37,6 +37,7 @@
37#include <linux/nfsd/syscall.h> 37#include <linux/nfsd/syscall.h>
38 38
39#include <asm/uaccess.h> 39#include <asm/uaccess.h>
40#include <net/ipv6.h>
40 41
41/* 42/*
42 * We have a single directory with 9 nodes in it. 43 * We have a single directory with 9 nodes in it.
@@ -222,6 +223,7 @@ static ssize_t write_getfs(struct file *file, char *buf, size_t size)
222 struct auth_domain *clp; 223 struct auth_domain *clp;
223 int err = 0; 224 int err = 0;
224 struct knfsd_fh *res; 225 struct knfsd_fh *res;
226 struct in6_addr in6;
225 227
226 if (size < sizeof(*data)) 228 if (size < sizeof(*data))
227 return -EINVAL; 229 return -EINVAL;
@@ -236,7 +238,11 @@ static ssize_t write_getfs(struct file *file, char *buf, size_t size)
236 res = (struct knfsd_fh*)buf; 238 res = (struct knfsd_fh*)buf;
237 239
238 exp_readlock(); 240 exp_readlock();
239 if (!(clp = auth_unix_lookup(sin->sin_addr))) 241
242 ipv6_addr_set_v4mapped(sin->sin_addr.s_addr, &in6);
243
244 clp = auth_unix_lookup(&in6);
245 if (!clp)
240 err = -EPERM; 246 err = -EPERM;
241 else { 247 else {
242 err = exp_rootfh(clp, data->gd_path, res, data->gd_maxlen); 248 err = exp_rootfh(clp, data->gd_path, res, data->gd_maxlen);
@@ -257,6 +263,7 @@ static ssize_t write_getfd(struct file *file, char *buf, size_t size)
257 int err = 0; 263 int err = 0;
258 struct knfsd_fh fh; 264 struct knfsd_fh fh;
259 char *res; 265 char *res;
266 struct in6_addr in6;
260 267
261 if (size < sizeof(*data)) 268 if (size < sizeof(*data))
262 return -EINVAL; 269 return -EINVAL;
@@ -271,7 +278,11 @@ static ssize_t write_getfd(struct file *file, char *buf, size_t size)
271 res = buf; 278 res = buf;
272 sin = (struct sockaddr_in *)&data->gd_addr; 279 sin = (struct sockaddr_in *)&data->gd_addr;
273 exp_readlock(); 280 exp_readlock();
274 if (!(clp = auth_unix_lookup(sin->sin_addr))) 281
282 ipv6_addr_set_v4mapped(sin->sin_addr.s_addr, &in6);
283
284 clp = auth_unix_lookup(&in6);
285 if (!clp)
275 err = -EPERM; 286 err = -EPERM;
276 else { 287 else {
277 err = exp_rootfh(clp, data->gd_path, &fh, NFS_FHSIZE); 288 err = exp_rootfh(clp, data->gd_path, &fh, NFS_FHSIZE);