Re: [PATCH] IPv6 support for NFS server

2008-01-18 Thread J. Bruce Fields
On Fri, Jan 18, 2008 at 03:50:56PM +0100, Aurélien Charbon wrote:
 OK Bruce I have added this comment before the patch.
 I have also done the changes pointed by Brian.
 Please let me know if there is still something to change.

Thanks.  For the future, if you could just make the comment part of the
actual git commit, that'll help produce a patch that can be fed to my
scripts with less hassle

Anyway, looks fine to me, applied.  (But I may wait till 2.6.26 to
submit.)

--b.
--
To unsubscribe from this list: send the line unsubscribe netdev in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] IPv6 support for NFS server

2008-01-18 Thread Aurélien Charbon

OK Bruce I have added this comment before the patch.
I have also done the changes pointed by Brian.
Please let me know if there is still something to change.

Regards,
Aurélien

J. Bruce Fields wrote:


On Thu, Jan 17, 2008 at 06:04:35PM +0100, Aurélien Charbon wrote:
 


Hi Bruce.

Thanks for your comments.
Here is the patch with some cleanups.
   


--


  Aurelien Charbon
  Linux NFSv4 team
  Bull SAS
Echirolles - France
http://nfsv4.bullopensource.org/


Here is some correction for the ip_map caching code part. It allows us to enable IPv6 in exports.
It completely maintains backward compatibility with IPv4 by using mapped address.
Thanks to Bruce Fields, Brian Haley, Neil Brown and Hideaki Joshifuji for comments

From 51755892e19186cd18230bac3f783b0382bf9ae0 Mon Sep 17 00:00:00 2001
From: Aurelien Charbon [EMAIL PROTECTED]
Date: Thu, 17 Jan 2008 14:55:03 +0100
Subject: [PATCH 1/1] IPv6 support for NFS server

---
 fs/nfsd/export.c   |9 ++-
 fs/nfsd/nfsctl.c   |   15 +-
 include/linux/sunrpc/svcauth.h |4 +-
 include/net/ipv6.h |9 +++
 net/sunrpc/svcauth_unix.c  |  118 +++-
 5 files changed, 110 insertions(+), 45 deletions(-)

diff --git a/fs/nfsd/export.c b/fs/nfsd/export.c
index 66d0aeb..208db3a 100644
--- a/fs/nfsd/export.c
+++ b/fs/nfsd/export.c
@@ -35,6 +35,7 @@
 #include linux/lockd/bind.h
 #include linux/sunrpc/msg_prot.h
 #include linux/sunrpc/gss_api.h
+#include net/ipv6.h
 
 #define NFSDDBG_FACILITY	NFSDDBG_EXPORT
 
@@ -1556,6 +1557,7 @@ exp_addclient(struct nfsctl_client *ncp)
 {
 	struct auth_domain	*dom;
 	int			i, err;
+	struct in6_addr addr6;
 
 	/* First, consistency check. */
 	err = -EINVAL;
@@ -1574,9 +1576,10 @@ exp_addclient(struct nfsctl_client *ncp)
 		goto out_unlock;
 
 	/* Insert client into hashtable. */
-	for (i = 0; i  ncp-cl_naddr; i++)
-		auth_unix_add_addr(ncp-cl_addrlist[i], dom);
-
+	for (i = 0; i  ncp-cl_naddr; i++) {
+		ipv6_addr_set_v4mapped(ncp-cl_addrlist[i].s_addr, addr6);
+		auth_unix_add_addr(addr6, dom);
+	}
 	auth_unix_forget_old(dom);
 	auth_domain_put(dom);
 
diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c
index 77dc989..13d6b6b 100644
--- a/fs/nfsd/nfsctl.c
+++ b/fs/nfsd/nfsctl.c
@@ -37,6 +37,7 @@
 #include linux/nfsd/syscall.h
 
 #include asm/uaccess.h
+#include net/ipv6.h
 
 /*
  *	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)
 	struct auth_domain *clp;
 	int err = 0;
 	struct knfsd_fh *res;
+	struct in6_addr in6;
 
 	if (size  sizeof(*data))
 		return -EINVAL;
@@ -236,7 +238,11 @@ static ssize_t write_getfs(struct file *file, char *buf, size_t size)
 	res = (struct knfsd_fh*)buf;
 
 	exp_readlock();
-	if (!(clp = auth_unix_lookup(sin-sin_addr)))
+
+	ipv6_addr_set_v4mapped(sin-sin_addr.s_addr, in6);
+
+	clp = auth_unix_lookup(in6);
+	if (!clp)
 		err = -EPERM;
 	else {
 		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)
 	int err = 0;
 	struct knfsd_fh fh;
 	char *res;
+	struct in6_addr in6;
 
 	if (size  sizeof(*data))
 		return -EINVAL;
@@ -271,7 +278,11 @@ static ssize_t write_getfd(struct file *file, char *buf, size_t size)
 	res = buf;
 	sin = (struct sockaddr_in *)data-gd_addr;
 	exp_readlock();
-	if (!(clp = auth_unix_lookup(sin-sin_addr)))
+
+	ipv6_addr_set_v4mapped(sin-sin_addr.s_addr,in6);
+
+	clp = auth_unix_lookup(in6);
+	if (!clp)
 		err = -EPERM;
 	else {
 		err = exp_rootfh(clp, data-gd_path, fh, NFS_FHSIZE);
diff --git a/include/linux/sunrpc/svcauth.h b/include/linux/sunrpc/svcauth.h
index 22e1ef8..9e6fb86 100644
--- a/include/linux/sunrpc/svcauth.h
+++ b/include/linux/sunrpc/svcauth.h
@@ -120,10 +120,10 @@ extern void	svc_auth_unregister(rpc_authflavor_t flavor);
 
 extern struct auth_domain *unix_domain_find(char *name);
 extern void auth_domain_put(struct auth_domain *item);
-extern int auth_unix_add_addr(struct in_addr addr, struct auth_domain *dom);
+extern int auth_unix_add_addr(struct in6_addr *addr, struct auth_domain *dom);
 extern struct auth_domain *auth_domain_lookup(char *name, struct auth_domain *new);
 extern struct auth_domain *auth_domain_find(char *name);
-extern struct auth_domain *auth_unix_lookup(struct in_addr addr);
+extern struct auth_domain *auth_unix_lookup(struct in6_addr *addr);
 extern int auth_unix_forget_old(struct auth_domain *dom);
 extern void svcauth_unix_purge(void);
 extern void svcauth_unix_info_release(void *);
diff --git a/include/net/ipv6.h b/include/net/ipv6.h
index ae328b6..9394710 100644
--- a/include/net/ipv6.h
+++ b/include/net/ipv6.h
@@ -400,6 +400,15 @@ static inline int ipv6_addr_v4mapped(const struct in6_addr *a)
 		 a-s6_addr32[2] == htonl(0x));
 }
 
+static inline void ipv6_addr_set_v4mapped(const __be32 addr,
+	  

Re: [PATCH] IPv6 support for NFS server

2008-01-17 Thread Aurélien Charbon

Hi Bruce.

Thanks for your comments.
Here is the patch with some cleanups.

Regards,
Aurélien


--


  Aurelien Charbon
  Linux NFSv4 team
  Bull SAS
Echirolles - France
http://nfsv4.bullopensource.org/


From 51755892e19186cd18230bac3f783b0382bf9ae0 Mon Sep 17 00:00:00 2001
From: Aurelien Charbon [EMAIL PROTECTED]
Date: Thu, 17 Jan 2008 14:55:03 +0100
Subject: [PATCH 1/1] IPv6 support for NFS server

---
 fs/nfsd/export.c   |9 ++-
 fs/nfsd/nfsctl.c   |   15 +-
 include/linux/sunrpc/svcauth.h |4 +-
 include/net/ipv6.h |9 +++
 net/sunrpc/svcauth_unix.c  |  118 +++-
 5 files changed, 110 insertions(+), 45 deletions(-)

diff --git a/fs/nfsd/export.c b/fs/nfsd/export.c
index 66d0aeb..208db3a 100644
--- a/fs/nfsd/export.c
+++ b/fs/nfsd/export.c
@@ -35,6 +35,7 @@
 #include linux/lockd/bind.h
 #include linux/sunrpc/msg_prot.h
 #include linux/sunrpc/gss_api.h
+#include net/ipv6.h
 
 #define NFSDDBG_FACILITY	NFSDDBG_EXPORT
 
@@ -1556,6 +1557,7 @@ exp_addclient(struct nfsctl_client *ncp)
 {
 	struct auth_domain	*dom;
 	int			i, err;
+	struct in6_addr addr6;
 
 	/* First, consistency check. */
 	err = -EINVAL;
@@ -1574,9 +1576,10 @@ exp_addclient(struct nfsctl_client *ncp)
 		goto out_unlock;
 
 	/* Insert client into hashtable. */
-	for (i = 0; i  ncp-cl_naddr; i++)
-		auth_unix_add_addr(ncp-cl_addrlist[i], dom);
-
+	for (i = 0; i  ncp-cl_naddr; i++) {
+		ipv6_addr_set_v4mapped(ncp-cl_addrlist[i].s_addr, addr6);
+		auth_unix_add_addr(addr6, dom);
+	}
 	auth_unix_forget_old(dom);
 	auth_domain_put(dom);
 
diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c
index 77dc989..13d6b6b 100644
--- a/fs/nfsd/nfsctl.c
+++ b/fs/nfsd/nfsctl.c
@@ -37,6 +37,7 @@
 #include linux/nfsd/syscall.h
 
 #include asm/uaccess.h
+#include net/ipv6.h
 
 /*
  *	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)
 	struct auth_domain *clp;
 	int err = 0;
 	struct knfsd_fh *res;
+	struct in6_addr in6;
 
 	if (size  sizeof(*data))
 		return -EINVAL;
@@ -236,7 +238,11 @@ static ssize_t write_getfs(struct file *file, char *buf, size_t size)
 	res = (struct knfsd_fh*)buf;
 
 	exp_readlock();
-	if (!(clp = auth_unix_lookup(sin-sin_addr)))
+
+	ipv6_addr_set_v4mapped(sin-sin_addr.s_addr, in6);
+
+	clp = auth_unix_lookup(in6);
+	if (!clp)
 		err = -EPERM;
 	else {
 		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)
 	int err = 0;
 	struct knfsd_fh fh;
 	char *res;
+	struct in6_addr in6;
 
 	if (size  sizeof(*data))
 		return -EINVAL;
@@ -271,7 +278,11 @@ static ssize_t write_getfd(struct file *file, char *buf, size_t size)
 	res = buf;
 	sin = (struct sockaddr_in *)data-gd_addr;
 	exp_readlock();
-	if (!(clp = auth_unix_lookup(sin-sin_addr)))
+
+	ipv6_addr_set_v4mapped(sin-sin_addr.s_addr,in6);
+
+	clp = auth_unix_lookup(in6);
+	if (!clp)
 		err = -EPERM;
 	else {
 		err = exp_rootfh(clp, data-gd_path, fh, NFS_FHSIZE);
diff --git a/include/linux/sunrpc/svcauth.h b/include/linux/sunrpc/svcauth.h
index 22e1ef8..9e6fb86 100644
--- a/include/linux/sunrpc/svcauth.h
+++ b/include/linux/sunrpc/svcauth.h
@@ -120,10 +120,10 @@ extern void	svc_auth_unregister(rpc_authflavor_t flavor);
 
 extern struct auth_domain *unix_domain_find(char *name);
 extern void auth_domain_put(struct auth_domain *item);
-extern int auth_unix_add_addr(struct in_addr addr, struct auth_domain *dom);
+extern int auth_unix_add_addr(struct in6_addr *addr, struct auth_domain *dom);
 extern struct auth_domain *auth_domain_lookup(char *name, struct auth_domain *new);
 extern struct auth_domain *auth_domain_find(char *name);
-extern struct auth_domain *auth_unix_lookup(struct in_addr addr);
+extern struct auth_domain *auth_unix_lookup(struct in6_addr *addr);
 extern int auth_unix_forget_old(struct auth_domain *dom);
 extern void svcauth_unix_purge(void);
 extern void svcauth_unix_info_release(void *);
diff --git a/include/net/ipv6.h b/include/net/ipv6.h
index ae328b6..9394710 100644
--- a/include/net/ipv6.h
+++ b/include/net/ipv6.h
@@ -400,6 +400,15 @@ static inline int ipv6_addr_v4mapped(const struct in6_addr *a)
 		 a-s6_addr32[2] == htonl(0x));
 }
 
+static inline void ipv6_addr_set_v4mapped(const __be32 addr,
+	  struct in6_addr *v4mapped)
+{
+	ipv6_addr_set(v4mapped,
+			0, 0,
+			htonl(0x),
+			addr);
+}
+
 /*
  * find the first different bit between two addresses
  * length of address must be a multiple of 32bits
diff --git a/net/sunrpc/svcauth_unix.c b/net/sunrpc/svcauth_unix.c
index 4114794..10ba208 100644
--- a/net/sunrpc/svcauth_unix.c
+++ b/net/sunrpc/svcauth_unix.c
@@ -11,7 +11,8 @@
 #include linux/hash.h
 #include linux/string.h
 #include net/sock.h
-
+#include net/ipv6.h
+#include linux/kernel.h
 #define 

Re: [PATCH] IPv6 support for NFS server

2008-01-17 Thread Brian Haley

Aurélien Charbon wrote:

Thanks for your comments.
Here is the patch with some cleanups.


Hi Aurelien,

Just two nits.


--- a/include/net/ipv6.h
+++ b/include/net/ipv6.h
@@ -400,6 +400,15 @@ static inline int ipv6_addr_v4mapped(const struct in6_addr 
*a)
 a-s6_addr32[2] == htonl(0x));
 }
 
+static inline void ipv6_addr_set_v4mapped(const __be32 addr,

+ struct in6_addr *v4mapped)
+{
+   ipv6_addr_set(v4mapped,
+   0, 0,
+   htonl(0x),
+   addr);
+}


I think Bruce wanted you to put as much on one line here as possible.


@@ -641,9 +668,24 @@ static int unix_gid_find(uid_t uid, struct group_info 
**gip,
 int
 svcauth_unix_set_client(struct svc_rqst *rqstp)
 {
-   struct sockaddr_in *sin = svc_addr_in(rqstp);
+   struct sockaddr_in *sin;
+   struct sockaddr_in6 *sin6, sin6_storage;
struct ip_map *ipm;
 
+	switch (rqstp-rq_addr.ss_family) {

+   case AF_INET:
+   sin = svc_addr_in(rqstp);
+   sin6 = sin6_storage;
+   ipv6_addr_set(sin6-sin6_addr, 0, 0,
+   htonl(0x), sin-sin_addr.s_addr);
+   break;


ipv6_addr_set_v4mapped(sin-sin_addr.s_addr, sin6-sin6_addr);

-Brian
--
To unsubscribe from this list: send the line unsubscribe netdev in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] IPv6 support for NFS server

2008-01-17 Thread J. Bruce Fields
On Thu, Jan 17, 2008 at 06:04:35PM +0100, Aurélien Charbon wrote:
 Hi Bruce.

 Thanks for your comments.
 Here is the patch with some cleanups.

Thanks for the revisions.  We need to submit this with a patch comment
that:

- Explains more precisely what this does (fixes export
  interfaces to allow ipv6) and what remains to be done (?)
- Credits the folks (like Brian Haley) who have provided
  feedback.

I'll help clean up that comment if needed but please make sure it's
always included with the patch when you resend it.

--b.


 Regards,
 Aurélien


 -- 

 
   Aurelien Charbon
   Linux NFSv4 team
   Bull SAS
 Echirolles - France
 http://nfsv4.bullopensource.org/
 


 From 51755892e19186cd18230bac3f783b0382bf9ae0 Mon Sep 17 00:00:00 2001
 From: Aurelien Charbon [EMAIL PROTECTED]
 Date: Thu, 17 Jan 2008 14:55:03 +0100
 Subject: [PATCH 1/1] IPv6 support for NFS server
 
 ---
  fs/nfsd/export.c   |9 ++-
  fs/nfsd/nfsctl.c   |   15 +-
  include/linux/sunrpc/svcauth.h |4 +-
  include/net/ipv6.h |9 +++
  net/sunrpc/svcauth_unix.c  |  118 
 +++-
  5 files changed, 110 insertions(+), 45 deletions(-)
 
 diff --git a/fs/nfsd/export.c b/fs/nfsd/export.c
 index 66d0aeb..208db3a 100644
 --- a/fs/nfsd/export.c
 +++ b/fs/nfsd/export.c
 @@ -35,6 +35,7 @@
  #include linux/lockd/bind.h
  #include linux/sunrpc/msg_prot.h
  #include linux/sunrpc/gss_api.h
 +#include net/ipv6.h
  
  #define NFSDDBG_FACILITY NFSDDBG_EXPORT
  
 @@ -1556,6 +1557,7 @@ exp_addclient(struct nfsctl_client *ncp)
  {
   struct auth_domain  *dom;
   int i, err;
 + struct in6_addr addr6;
  
   /* First, consistency check. */
   err = -EINVAL;
 @@ -1574,9 +1576,10 @@ exp_addclient(struct nfsctl_client *ncp)
   goto out_unlock;
  
   /* Insert client into hashtable. */
 - for (i = 0; i  ncp-cl_naddr; i++)
 - auth_unix_add_addr(ncp-cl_addrlist[i], dom);
 -
 + for (i = 0; i  ncp-cl_naddr; i++) {
 + ipv6_addr_set_v4mapped(ncp-cl_addrlist[i].s_addr, addr6);
 + auth_unix_add_addr(addr6, dom);
 + }
   auth_unix_forget_old(dom);
   auth_domain_put(dom);
  
 diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c
 index 77dc989..13d6b6b 100644
 --- a/fs/nfsd/nfsctl.c
 +++ b/fs/nfsd/nfsctl.c
 @@ -37,6 +37,7 @@
  #include linux/nfsd/syscall.h
  
  #include asm/uaccess.h
 +#include net/ipv6.h
  
  /*
   *   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)
   struct auth_domain *clp;
   int err = 0;
   struct knfsd_fh *res;
 + struct in6_addr in6;
  
   if (size  sizeof(*data))
   return -EINVAL;
 @@ -236,7 +238,11 @@ static ssize_t write_getfs(struct file *file, char *buf, 
 size_t size)
   res = (struct knfsd_fh*)buf;
  
   exp_readlock();
 - if (!(clp = auth_unix_lookup(sin-sin_addr)))
 +
 + ipv6_addr_set_v4mapped(sin-sin_addr.s_addr, in6);
 +
 + clp = auth_unix_lookup(in6);
 + if (!clp)
   err = -EPERM;
   else {
   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)
   int err = 0;
   struct knfsd_fh fh;
   char *res;
 + struct in6_addr in6;
  
   if (size  sizeof(*data))
   return -EINVAL;
 @@ -271,7 +278,11 @@ static ssize_t write_getfd(struct file *file, char *buf, 
 size_t size)
   res = buf;
   sin = (struct sockaddr_in *)data-gd_addr;
   exp_readlock();
 - if (!(clp = auth_unix_lookup(sin-sin_addr)))
 +
 + ipv6_addr_set_v4mapped(sin-sin_addr.s_addr,in6);
 +
 + clp = auth_unix_lookup(in6);
 + if (!clp)
   err = -EPERM;
   else {
   err = exp_rootfh(clp, data-gd_path, fh, NFS_FHSIZE);
 diff --git a/include/linux/sunrpc/svcauth.h b/include/linux/sunrpc/svcauth.h
 index 22e1ef8..9e6fb86 100644
 --- a/include/linux/sunrpc/svcauth.h
 +++ b/include/linux/sunrpc/svcauth.h
 @@ -120,10 +120,10 @@ extern void svc_auth_unregister(rpc_authflavor_t 
 flavor);
  
  extern struct auth_domain *unix_domain_find(char *name);
  extern void auth_domain_put(struct auth_domain *item);
 -extern int auth_unix_add_addr(struct in_addr addr, struct auth_domain *dom);
 +extern int auth_unix_add_addr(struct in6_addr *addr, struct auth_domain 
 *dom);
  extern struct auth_domain *auth_domain_lookup(char *name, struct auth_domain 
 *new);
  extern struct auth_domain *auth_domain_find(char *name);
 -extern struct auth_domain *auth_unix_lookup(struct in_addr addr);
 +extern struct auth_domain *auth_unix_lookup(struct in6_addr *addr);
  extern int auth_unix_forget_old(struct auth_domain *dom);
  extern void 

Re: [PATCH] IPv6 support for NFS server

2008-01-15 Thread J. Bruce Fields
On Tue, Dec 11, 2007 at 07:00:08PM +0100, Aurélien Charbon wrote:
 Brian Haley wrote:

 In an email back on October 29th I sent-out a similar patch with a new  
 ipv6_addr_set_v4mapped() inline - it might be useful to pull that  
 piece into your patch since it cleans it up a bit to get rid of the  
 ipv6_addr_set() calls.  I can re-send you that patch off-line if you  
 can't find it.

 -Brian


 Thanks Brian. I forgot to include your changes in my tree.
 OK Bruce you can take this one.

One trivial note: I'd prefer patches inline with the message, instead of
attached.  If you need to attach it, please add From:, Subject: and a
patch comment in the standard format.  Something like git-format-patch
will do all that stuff for you.

E.g. see below (also with a minor whitespace problem fixed--fun
scripts/checkpatch.pl before submitting and it'll catch that.)

--b.
From c19360e877cfa1576dce98792cd513665deaa2ec Mon Sep 17 00:00:00 2001
From: =?utf-8?q?Aur=C3=A9lien=20Charbon?= [EMAIL PROTECTED]
Date: Fri, 21 Dec 2007 16:44:46 +0100
Subject: [PATCH] IPv6 support for NFS server

Prepare for IPv6 text-based mounts and exports.

Tested with IPv4 network and basic nfs ops (mount, file creation and
modification), and with unmodified nfs-utils-1.1.1 + CITI_NFS4_ALL
patch.

Signed-off-by: Aurelien Charbon [EMAIL PROTECTED]
Cc: Neil Brown [EMAIL PROTECTED]
---
 fs/nfsd/export.c   |   10 ++-
 fs/nfsd/nfsctl.c   |   19 ++-
 include/linux/sunrpc/svcauth.h |4 +-
 include/net/ipv6.h |9 +++
 net/sunrpc/svcauth_unix.c  |  119 +++-
 5 files changed, 116 insertions(+), 45 deletions(-)

diff --git a/fs/nfsd/export.c b/fs/nfsd/export.c
index cbbc594..e29b431 100644
--- a/fs/nfsd/export.c
+++ b/fs/nfsd/export.c
@@ -35,6 +35,7 @@
 #include linux/lockd/bind.h
 #include linux/sunrpc/msg_prot.h
 #include linux/sunrpc/gss_api.h
+#include net/ipv6.h
 
 #define NFSDDBG_FACILITY   NFSDDBG_EXPORT
 
@@ -1556,6 +1557,7 @@ exp_addclient(struct nfsctl_client *ncp)
 {
struct auth_domain  *dom;
int i, err;
+   struct in6_addr addr6;
 
/* First, consistency check. */
err = -EINVAL;
@@ -1574,9 +1576,11 @@ exp_addclient(struct nfsctl_client *ncp)
goto out_unlock;
 
/* Insert client into hashtable. */
-   for (i = 0; i  ncp-cl_naddr; i++)
-   auth_unix_add_addr(ncp-cl_addrlist[i], dom);
-
+   for (i = 0; i  ncp-cl_naddr; i++) {
+   /* Mapping address */
+   ipv6_addr_set_v4mapped(ncp-cl_addrlist[i].s_addr, addr6);
+   auth_unix_add_addr(addr6, dom);
+   }
auth_unix_forget_old(dom);
auth_domain_put(dom);
 
diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c
index e307972..a8f7a90 100644
--- a/fs/nfsd/nfsctl.c
+++ b/fs/nfsd/nfsctl.c
@@ -37,6 +37,7 @@
 #include linux/nfsd/syscall.h
 
 #include asm/uaccess.h
+#include net/ipv6.h
 
 /*
  * 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)
struct auth_domain *clp;
int err = 0;
struct knfsd_fh *res;
+   struct in6_addr in6;
 
if (size  sizeof(*data))
return -EINVAL;
@@ -236,7 +238,13 @@ static ssize_t write_getfs(struct file *file, char *buf, 
size_t size)
res = (struct knfsd_fh*)buf;
 
exp_readlock();
-   if (!(clp = auth_unix_lookup(sin-sin_addr)))
+
+   /* IPv6 address mapping */
+   ipv6_addr_set_v4mapped(
+   (((struct sockaddr_in *)data-gd_addr)-sin_addr.s_addr),
+   in6);
+
+   if (!(clp = auth_unix_lookup(in6)))
err = -EPERM;
else {
err = exp_rootfh(clp, data-gd_path, res, data-gd_maxlen);
@@ -257,6 +265,7 @@ static ssize_t write_getfd(struct file *file, char *buf, 
size_t size)
int err = 0;
struct knfsd_fh fh;
char *res;
+   struct in6_addr in6;
 
if (size  sizeof(*data))
return -EINVAL;
@@ -271,7 +280,13 @@ static ssize_t write_getfd(struct file *file, char *buf, 
size_t size)
res = buf;
sin = (struct sockaddr_in *)data-gd_addr;
exp_readlock();
-   if (!(clp = auth_unix_lookup(sin-sin_addr)))
+   /* IPv6 address mapping */
+   ipv6_addr_set_v4mapped(
+   (((struct sockaddr_in *)data-gd_addr)-sin_addr.s_addr),
+   in6
+   );
+
+   if (!(clp = auth_unix_lookup(in6)))
err = -EPERM;
else {
err = exp_rootfh(clp, data-gd_path, fh, NFS_FHSIZE);
diff --git a/include/linux/sunrpc/svcauth.h b/include/linux/sunrpc/svcauth.h
index 22e1ef8..9e6fb86 100644
--- a/include/linux/sunrpc/svcauth.h
+++ b/include/linux/sunrpc/svcauth.h
@@ -120,10 +120,10 @@ extern void   svc_auth_unregister(rpc_authflavor_t 
flavor);
 
 extern struct auth_domain *unix_domain_find(char

Re: [PATCH] IPv6 support for NFS server

2008-01-15 Thread J. Bruce Fields
Mostly just more trivial stuff for now, apologies:

On Tue, Jan 15, 2008 at 05:32:21PM -0500, J. Bruce Fields wrote:
 diff --git a/fs/nfsd/export.c b/fs/nfsd/export.c
 index cbbc594..e29b431 100644
 --- a/fs/nfsd/export.c
 +++ b/fs/nfsd/export.c
 @@ -35,6 +35,7 @@
  #include linux/lockd/bind.h
  #include linux/sunrpc/msg_prot.h
  #include linux/sunrpc/gss_api.h
 +#include net/ipv6.h
  
  #define NFSDDBG_FACILITY NFSDDBG_EXPORT
  
 @@ -1556,6 +1557,7 @@ exp_addclient(struct nfsctl_client *ncp)
  {
   struct auth_domain  *dom;
   int i, err;
 + struct in6_addr addr6;
  
   /* First, consistency check. */
   err = -EINVAL;
 @@ -1574,9 +1576,11 @@ exp_addclient(struct nfsctl_client *ncp)
   goto out_unlock;
  
   /* Insert client into hashtable. */
 - for (i = 0; i  ncp-cl_naddr; i++)
 - auth_unix_add_addr(ncp-cl_addrlist[i], dom);
 -
 + for (i = 0; i  ncp-cl_naddr; i++) {
 + /* Mapping address */
 + ipv6_addr_set_v4mapped(ncp-cl_addrlist[i].s_addr, addr6);

I think the name of the function explains well enough what it's doing,
so the preceding comment is superfluous.

 + auth_unix_add_addr(addr6, dom);
 + }
   auth_unix_forget_old(dom);
   auth_domain_put(dom);
  
 diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c
 index e307972..a8f7a90 100644
 --- a/fs/nfsd/nfsctl.c
 +++ b/fs/nfsd/nfsctl.c
 @@ -37,6 +37,7 @@
  #include linux/nfsd/syscall.h
  
  #include asm/uaccess.h
 +#include net/ipv6.h
  
  /*
   *   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)
   struct auth_domain *clp;
   int err = 0;
   struct knfsd_fh *res;
 + struct in6_addr in6;
  
   if (size  sizeof(*data))
   return -EINVAL;
 @@ -236,7 +238,13 @@ static ssize_t write_getfs(struct file *file, char *buf, 
 size_t size)
   res = (struct knfsd_fh*)buf;
  
   exp_readlock();
 - if (!(clp = auth_unix_lookup(sin-sin_addr)))
 +
 + /* IPv6 address mapping */
 + ipv6_addr_set_v4mapped(
 + (((struct sockaddr_in *)data-gd_addr)-sin_addr.s_addr),
 + in6);

The case there appears to already have been done in the assignment of
sin a few lines above; so couldn't this last line just be written:

ipv6_addr_set_v4mapped(sin-sin_addr.s_addr, in6);

?

 +
 + if (!(clp = auth_unix_lookup(in6)))
   err = -EPERM;

I'd rather assignments be made separately from tests, so:

clp = auth_unix_lookup(in6);
if (!clp)
err = -EPERM;

Yeah, I know, that's not what the original code did, but as long as
we're modifying that line anyway

   else {
   err = exp_rootfh(clp, data-gd_path, res, data-gd_maxlen);
 @@ -257,6 +265,7 @@ static ssize_t write_getfd(struct file *file, char *buf, 
 size_t size)
   int err = 0;
   struct knfsd_fh fh;
   char *res;
 + struct in6_addr in6;
  
   if (size  sizeof(*data))
   return -EINVAL;
 @@ -271,7 +280,13 @@ static ssize_t write_getfd(struct file *file, char *buf, 
 size_t size)
   res = buf;
   sin = (struct sockaddr_in *)data-gd_addr;
   exp_readlock();
 - if (!(clp = auth_unix_lookup(sin-sin_addr)))
 + /* IPv6 address mapping */
 + ipv6_addr_set_v4mapped(
 + (((struct sockaddr_in *)data-gd_addr)-sin_addr.s_addr),
 + in6
 + );
 +
 + if (!(clp = auth_unix_lookup(in6)))
   err = -EPERM;

See both comments above.

   else {
   err = exp_rootfh(clp, data-gd_path, fh, NFS_FHSIZE);
 diff --git a/include/linux/sunrpc/svcauth.h b/include/linux/sunrpc/svcauth.h
 index 22e1ef8..9e6fb86 100644
 --- a/include/linux/sunrpc/svcauth.h
 +++ b/include/linux/sunrpc/svcauth.h
 @@ -120,10 +120,10 @@ extern void svc_auth_unregister(rpc_authflavor_t 
 flavor);
  
  extern struct auth_domain *unix_domain_find(char *name);
  extern void auth_domain_put(struct auth_domain *item);
 -extern int auth_unix_add_addr(struct in_addr addr, struct auth_domain *dom);
 +extern int auth_unix_add_addr(struct in6_addr *addr, struct auth_domain 
 *dom);
  extern struct auth_domain *auth_domain_lookup(char *name, struct auth_domain 
 *new);
  extern struct auth_domain *auth_domain_find(char *name);
 -extern struct auth_domain *auth_unix_lookup(struct in_addr addr);
 +extern struct auth_domain *auth_unix_lookup(struct in6_addr *addr);
  extern int auth_unix_forget_old(struct auth_domain *dom);
  extern void svcauth_unix_purge(void);
  extern void svcauth_unix_info_release(void *);
 diff --git a/include/net/ipv6.h b/include/net/ipv6.h
 index ae328b6..9394710 100644
 --- a/include/net/ipv6.h
 +++ b/include/net/ipv6.h
 @@ -400,6 +400,15 @@ static inline int ipv6_addr_v4mapped(const struct 
 in6_addr *a)
a-s6_addr32[2] == htonl(0x));
  }
  
 +static inline void 

Re: [PATCH] IPv6 support for NFS server

2007-12-11 Thread Aurélien Charbon

J. Bruce Fields wrote:


On Mon, Dec 10, 2007 at 07:34:41PM +0100, Aurélien Charbon wrote:
 


Here is a cleanup for the ip_map caching patch in nfs server.

It prepares for IPv6 text-based mounts and exports.

Tests: tested with only IPv4 network and basic nfs ops (mount, file 
creation and modification)
   



Thanks!  And also tested with an unmodified rpc.mountd?
 


Yes I also tested it with a basic nfs-utils-1.1.1 + CITI NFS4_ALL-1 patch.

Aurélien

--


  Aurelien Charbon
  Linux NFSv4 team
  Bull SAS
Echirolles - France
http://nfsv4.bullopensource.org/


--
To unsubscribe from this list: send the line unsubscribe netdev in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] IPv6 support for NFS server

2007-12-11 Thread Brian Haley

Hi Aurelien,

Aurélien Charbon wrote:


Here is a cleanup for the ip_map caching patch in nfs server.

It prepares for IPv6 text-based mounts and exports.

Tests: tested with only IPv4 network and basic nfs ops (mount, file 
creation and modification)


In an email back on October 29th I sent-out a similar patch with a new 
ipv6_addr_set_v4mapped() inline - it might be useful to pull that piece 
into your patch since it cleans it up a bit to get rid of the 
ipv6_addr_set() calls.  I can re-send you that patch off-line if you 
can't find it.


-Brian
--
To unsubscribe from this list: send the line unsubscribe netdev in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] IPv6 support for NFS server

2007-12-11 Thread Aurélien Charbon

Brian Haley wrote:

In an email back on October 29th I sent-out a similar patch with a new 
ipv6_addr_set_v4mapped() inline - it might be useful to pull that 
piece into your patch since it cleans it up a bit to get rid of the 
ipv6_addr_set() calls.  I can re-send you that patch off-line if you 
can't find it.


-Brian



Thanks Brian. I forgot to include your changes in my tree.
OK Bruce you can take this one.

Aurélien

--


  Aurelien Charbon
  Linux NFSv4 team
  Bull SAS
Echirolles - France
http://nfsv4.bullopensource.org/


diff -p -u -r -N linux-2.6.24-rc4/fs/nfsd/export.c linux-2.6.24-rc4-IPv6-cache-based/fs/nfsd/export.c
--- linux-2.6.24-rc4/fs/nfsd/export.c	2007-12-10 16:11:37.0 +0100
+++ linux-2.6.24-rc4-IPv6-cache-based/fs/nfsd/export.c	2007-12-11 17:49:51.0 +0100
@@ -35,6 +35,7 @@
 #include linux/lockd/bind.h
 #include linux/sunrpc/msg_prot.h
 #include linux/sunrpc/gss_api.h
+#include net/ipv6.h
 
 #define NFSDDBG_FACILITY	NFSDDBG_EXPORT
 
@@ -1556,6 +1557,7 @@ exp_addclient(struct nfsctl_client *ncp)
 {
 	struct auth_domain	*dom;
 	int			i, err;
+	struct in6_addr addr6;
 
 	/* First, consistency check. */
 	err = -EINVAL;
@@ -1574,9 +1576,11 @@ exp_addclient(struct nfsctl_client *ncp)
 		goto out_unlock;
 
 	/* Insert client into hashtable. */
-	for (i = 0; i  ncp-cl_naddr; i++)
-		auth_unix_add_addr(ncp-cl_addrlist[i], dom);
-
+	for (i = 0; i  ncp-cl_naddr; i++) {
+		/* Mapping address */
+		ipv6_addr_set_v4mapped(ncp-cl_addrlist[i].s_addr, addr6);
+		auth_unix_add_addr(addr6, dom);
+	}
 	auth_unix_forget_old(dom);
 	auth_domain_put(dom);
 
diff -p -u -r -N linux-2.6.24-rc4/fs/nfsd/nfsctl.c linux-2.6.24-rc4-IPv6-cache-based/fs/nfsd/nfsctl.c
--- linux-2.6.24-rc4/fs/nfsd/nfsctl.c	2007-12-10 16:11:37.0 +0100
+++ linux-2.6.24-rc4-IPv6-cache-based/fs/nfsd/nfsctl.c	2007-12-11 18:27:24.0 +0100
@@ -37,6 +37,7 @@
 #include linux/nfsd/syscall.h
 
 #include asm/uaccess.h
+#include net/ipv6.h
 
 /*
  *	We have a single directory with 9 nodes in it.
@@ -222,6 +223,7 @@ static ssize_t write_getfs(struct file *
 	struct auth_domain *clp;
 	int err = 0;
 	struct knfsd_fh *res;
+	struct in6_addr in6;
 
 	if (size  sizeof(*data))
 		return -EINVAL;
@@ -236,7 +238,14 @@ static ssize_t write_getfs(struct file *
 	res = (struct knfsd_fh*)buf;
 
 	exp_readlock();
-	if (!(clp = auth_unix_lookup(sin-sin_addr)))
+
+	/* IPv6 address mapping */
+	ipv6_addr_set_v4mapped(
+		(((struct sockaddr_in *)data-gd_addr)-sin_addr.s_addr), 
+		in6
+		);
+
+	if (!(clp = auth_unix_lookup(in6)))
 		err = -EPERM;
 	else {
 		err = exp_rootfh(clp, data-gd_path, res, data-gd_maxlen);
@@ -257,6 +266,7 @@ static ssize_t write_getfd(struct file *
 	int err = 0;
 	struct knfsd_fh fh;
 	char *res;
+	struct in6_addr in6;
 
 	if (size  sizeof(*data))
 		return -EINVAL;
@@ -271,7 +281,13 @@ static ssize_t write_getfd(struct file *
 	res = buf;
 	sin = (struct sockaddr_in *)data-gd_addr;
 	exp_readlock();
-	if (!(clp = auth_unix_lookup(sin-sin_addr)))
+	/* IPv6 address mapping */
+	ipv6_addr_set_v4mapped(
+		(((struct sockaddr_in *)data-gd_addr)-sin_addr.s_addr),
+		in6
+		);
+
+	if (!(clp = auth_unix_lookup(in6)))
 		err = -EPERM;
 	else {
 		err = exp_rootfh(clp, data-gd_path, fh, NFS_FHSIZE);
diff -p -u -r -N linux-2.6.24-rc4/include/linux/sunrpc/svcauth.h linux-2.6.24-rc4-IPv6-cache-based/include/linux/sunrpc/svcauth.h
--- linux-2.6.24-rc4/include/linux/sunrpc/svcauth.h	2007-12-10 16:01:43.0 +0100
+++ linux-2.6.24-rc4-IPv6-cache-based/include/linux/sunrpc/svcauth.h	2007-12-10 17:09:34.0 +0100
@@ -120,10 +120,10 @@ extern void	svc_auth_unregister(rpc_auth
 
 extern struct auth_domain *unix_domain_find(char *name);
 extern void auth_domain_put(struct auth_domain *item);
-extern int auth_unix_add_addr(struct in_addr addr, struct auth_domain *dom);
+extern int auth_unix_add_addr(struct in6_addr *addr, struct auth_domain *dom);
 extern struct auth_domain *auth_domain_lookup(char *name, struct auth_domain *new);
 extern struct auth_domain *auth_domain_find(char *name);
-extern struct auth_domain *auth_unix_lookup(struct in_addr addr);
+extern struct auth_domain *auth_unix_lookup(struct in6_addr *addr);
 extern int auth_unix_forget_old(struct auth_domain *dom);
 extern void svcauth_unix_purge(void);
 extern void svcauth_unix_info_release(void *);
diff -p -u -r -N linux-2.6.24-rc4/include/net/ipv6.h linux-2.6.24-rc4-IPv6-cache-based/include/net/ipv6.h
--- linux-2.6.24-rc4/include/net/ipv6.h	2007-12-10 16:11:38.0 +0100
+++ linux-2.6.24-rc4-IPv6-cache-based/include/net/ipv6.h	2007-12-11 17:52:39.0 +0100
@@ -400,6 +400,15 @@ static inline int ipv6_addr_v4mapped(con
 		 a-s6_addr32[2] == htonl(0x));
 }
 
+static inline void ipv6_addr_set_v4mapped(const __be32 addr,
+	  struct in6_addr *v4mapped)
+{
+	ipv6_addr_set(v4mapped,
+			0, 0,
+			__constant_htonl(0x),
+			addr);
+}
+
 /*
  * 

Re: [PATCH] IPv6 support for NFS server

2007-12-11 Thread YOSHIFUJI Hideaki / 吉藤英明
In article [EMAIL PROTECTED] (at Tue, 11 Dec 2007 19:00:08 +0100), Aurélien 
Charbon [EMAIL PROTECTED] says:

 --- linux-2.6.24-rc4/include/net/ipv6.h   2007-12-10 16:11:38.0 
 +0100
 +++ linux-2.6.24-rc4-IPv6-cache-based/include/net/ipv6.h  2007-12-11 
 17:52:39.0 +0100
 @@ -400,6 +400,15 @@ static inline int ipv6_addr_v4mapped(con
a-s6_addr32[2] == htonl(0x));
  }
  
 +static inline void ipv6_addr_set_v4mapped(const __be32 addr,
 +   struct in6_addr *v4mapped)
 +{
 + ipv6_addr_set(v4mapped,
 + 0, 0,
 + __constant_htonl(0x),
 + addr);
 +}
 +
  /*
   * find the first different bit between two addresses
   * length of address must be a multiple of 32bits

Use htonl() here, not __constant_htonl().

--yoshfuji
--
To unsubscribe from this list: send the line unsubscribe netdev in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH] IPv6 support for NFS server

2007-12-10 Thread Aurélien Charbon


Here is a cleanup for the ip_map caching patch in nfs server.

It prepares for IPv6 text-based mounts and exports.

Tests: tested with only IPv4 network and basic nfs ops (mount, file 
creation and modification)


-

Signed-off-by: Aurelien Charbon [EMAIL PROTECTED]

diff -p -u -r -N linux-2.6.24-rc4/fs/nfsd/export.c 
linux-2.6.24-rc4-IPv6-cache-based/fs/nfsd/export.c

--- linux-2.6.24-rc4/fs/nfsd/export.c2007-12-10 16:11:37.0 +0100
+++ linux-2.6.24-rc4-IPv6-cache-based/fs/nfsd/export.c2007-12-10 
17:50:37.0 +0100

@@ -35,6 +35,7 @@
#include linux/lockd/bind.h
#include linux/sunrpc/msg_prot.h
#include linux/sunrpc/gss_api.h
+#include net/ipv6.h

#define NFSDDBG_FACILITYNFSDDBG_EXPORT

@@ -1556,6 +1557,7 @@ exp_addclient(struct nfsctl_client *ncp)
{
struct auth_domain*dom;
inti, err;
+struct in6_addr addr6;

/* First, consistency check. */
err = -EINVAL;
@@ -1574,9 +1576,12 @@ exp_addclient(struct nfsctl_client *ncp)
goto out_unlock;

/* Insert client into hashtable. */
-for (i = 0; i  ncp-cl_naddr; i++)
-auth_unix_add_addr(ncp-cl_addrlist[i], dom);
-
+for (i = 0; i  ncp-cl_naddr; i++) {
+/* Mapping address */
+ipv6_addr_set(addr6, 0, 0,
+htonl(0x), ncp-cl_addrlist[i].s_addr);
+auth_unix_add_addr(addr6, dom);
+}
auth_unix_forget_old(dom);
auth_domain_put(dom);

diff -p -u -r -N linux-2.6.24-rc4/fs/nfsd/nfsctl.c 
linux-2.6.24-rc4-IPv6-cache-based/fs/nfsd/nfsctl.c

--- linux-2.6.24-rc4/fs/nfsd/nfsctl.c2007-12-10 16:11:37.0 +0100
+++ linux-2.6.24-rc4-IPv6-cache-based/fs/nfsd/nfsctl.c2007-12-10 
18:15:22.0 +0100

@@ -37,6 +37,7 @@
#include linux/nfsd/syscall.h

#include asm/uaccess.h
+#include net/ipv6.h

/*
 *We have a single directory with 9 nodes in it.
@@ -222,6 +223,7 @@ static ssize_t write_getfs(struct file *
struct auth_domain *clp;
int err = 0;
struct knfsd_fh *res;
+struct in6_addr in6;

if (size  sizeof(*data))
return -EINVAL;
@@ -236,7 +238,13 @@ static ssize_t write_getfs(struct file *
res = (struct knfsd_fh*)buf;

exp_readlock();
-if (!(clp = auth_unix_lookup(sin-sin_addr)))
+
+/* IPv6 address mapping */
+ipv6_addr_set(in6, 0, 0,
+htonl(0x),
+(((struct sockaddr_in *)data-gd_addr)-sin_addr.s_addr));
+
+if (!(clp = auth_unix_lookup(in6)))
err = -EPERM;
else {
err = exp_rootfh(clp, data-gd_path, res, data-gd_maxlen);
@@ -257,6 +265,7 @@ static ssize_t write_getfd(struct file *
int err = 0;
struct knfsd_fh fh;
char *res;
+struct in6_addr in6;

if (size  sizeof(*data))
return -EINVAL;
@@ -271,7 +280,12 @@ static ssize_t write_getfd(struct file *
res = buf;
sin = (struct sockaddr_in *)data-gd_addr;
exp_readlock();
-if (!(clp = auth_unix_lookup(sin-sin_addr)))
+/* IPv6 address mapping */
+ipv6_addr_set(in6, 0, 0,
+htonl(0x),
+(((struct sockaddr_in *)data-gd_addr)-sin_addr.s_addr));
+
+if (!(clp = auth_unix_lookup(in6)))
err = -EPERM;
else {
err = exp_rootfh(clp, data-gd_path, fh, NFS_FHSIZE);
diff -p -u -r -N linux-2.6.24-rc4/include/linux/sunrpc/svcauth.h 
linux-2.6.24-rc4-IPv6-cache-based/include/linux/sunrpc/svcauth.h
--- linux-2.6.24-rc4/include/linux/sunrpc/svcauth.h2007-12-10 
16:01:43.0 +0100
+++ linux-2.6.24-rc4-IPv6-cache-based/include/linux/sunrpc/svcauth.h
2007-12-10 17:09:34.0 +0100

@@ -120,10 +120,10 @@ extern voidsvc_auth_unregister(rpc_auth

extern struct auth_domain *unix_domain_find(char *name);
extern void auth_domain_put(struct auth_domain *item);
-extern int auth_unix_add_addr(struct in_addr addr, struct auth_domain 
*dom);
+extern int auth_unix_add_addr(struct in6_addr *addr, struct auth_domain 
*dom);
extern struct auth_domain *auth_domain_lookup(char *name, struct 
auth_domain *new);

extern struct auth_domain *auth_domain_find(char *name);
-extern struct auth_domain *auth_unix_lookup(struct in_addr addr);
+extern struct auth_domain *auth_unix_lookup(struct in6_addr *addr);
extern int auth_unix_forget_old(struct auth_domain *dom);
extern void svcauth_unix_purge(void);
extern void svcauth_unix_info_release(void *);
diff -p -u -r -N linux-2.6.24-rc4/net/sunrpc/svcauth_unix.c 
linux-2.6.24-rc4-IPv6-cache-based/net/sunrpc/svcauth_unix.c
--- linux-2.6.24-rc4/net/sunrpc/svcauth_unix.c2007-12-10 
16:01:46.0 +0100
+++ linux-2.6.24-rc4-IPv6-cache-based/net/sunrpc/svcauth_unix.c
2007-12-10 17:38:50.0 +0100

@@ -11,7 +11,8 @@
#include linux/hash.h
#include linux/string.h
#include net/sock.h
-
+#include net/ipv6.h
+#include linux/kernel.h
#define RPCDBG_FACILITYRPCDBG_AUTH


@@ -84,7 +85,7 @@ static void svcauth_unix_domain_release(
struct ip_map {
struct cache_headh;
charm_class[8]; /* e.g. nfsd */
-struct in_addr 

Re: [PATCH] IPv6 support for NFS server

2007-12-10 Thread J. Bruce Fields
On Mon, Dec 10, 2007 at 07:34:41PM +0100, Aurélien Charbon wrote:

 Here is a cleanup for the ip_map caching patch in nfs server.

 It prepares for IPv6 text-based mounts and exports.

 Tests: tested with only IPv4 network and basic nfs ops (mount, file 
 creation and modification)

Thanks!  And also tested with an unmodified rpc.mountd?

--b.


 -

 Signed-off-by: Aurelien Charbon [EMAIL PROTECTED]

 diff -p -u -r -N linux-2.6.24-rc4/fs/nfsd/export.c 
 linux-2.6.24-rc4-IPv6-cache-based/fs/nfsd/export.c
 --- linux-2.6.24-rc4/fs/nfsd/export.c2007-12-10 16:11:37.0 +0100
 +++ linux-2.6.24-rc4-IPv6-cache-based/fs/nfsd/export.c2007-12-10 
 17:50:37.0 +0100
 @@ -35,6 +35,7 @@
 #include linux/lockd/bind.h
 #include linux/sunrpc/msg_prot.h
 #include linux/sunrpc/gss_api.h
 +#include net/ipv6.h

 #define NFSDDBG_FACILITYNFSDDBG_EXPORT

 @@ -1556,6 +1557,7 @@ exp_addclient(struct nfsctl_client *ncp)
 {
 struct auth_domain*dom;
 inti, err;
 +struct in6_addr addr6;

 /* First, consistency check. */
 err = -EINVAL;
 @@ -1574,9 +1576,12 @@ exp_addclient(struct nfsctl_client *ncp)
 goto out_unlock;

 /* Insert client into hashtable. */
 -for (i = 0; i  ncp-cl_naddr; i++)
 -auth_unix_add_addr(ncp-cl_addrlist[i], dom);
 -
 +for (i = 0; i  ncp-cl_naddr; i++) {
 +/* Mapping address */
 +ipv6_addr_set(addr6, 0, 0,
 +htonl(0x), ncp-cl_addrlist[i].s_addr);
 +auth_unix_add_addr(addr6, dom);
 +}
 auth_unix_forget_old(dom);
 auth_domain_put(dom);

 diff -p -u -r -N linux-2.6.24-rc4/fs/nfsd/nfsctl.c 
 linux-2.6.24-rc4-IPv6-cache-based/fs/nfsd/nfsctl.c
 --- linux-2.6.24-rc4/fs/nfsd/nfsctl.c2007-12-10 16:11:37.0 +0100
 +++ linux-2.6.24-rc4-IPv6-cache-based/fs/nfsd/nfsctl.c2007-12-10 
 18:15:22.0 +0100
 @@ -37,6 +37,7 @@
 #include linux/nfsd/syscall.h

 #include asm/uaccess.h
 +#include net/ipv6.h

 /*
  *We have a single directory with 9 nodes in it.
 @@ -222,6 +223,7 @@ static ssize_t write_getfs(struct file *
 struct auth_domain *clp;
 int err = 0;
 struct knfsd_fh *res;
 +struct in6_addr in6;

 if (size  sizeof(*data))
 return -EINVAL;
 @@ -236,7 +238,13 @@ static ssize_t write_getfs(struct file *
 res = (struct knfsd_fh*)buf;

 exp_readlock();
 -if (!(clp = auth_unix_lookup(sin-sin_addr)))
 +
 +/* IPv6 address mapping */
 +ipv6_addr_set(in6, 0, 0,
 +htonl(0x),
 +(((struct sockaddr_in *)data-gd_addr)-sin_addr.s_addr));
 +
 +if (!(clp = auth_unix_lookup(in6)))
 err = -EPERM;
 else {
 err = exp_rootfh(clp, data-gd_path, res, data-gd_maxlen);
 @@ -257,6 +265,7 @@ static ssize_t write_getfd(struct file *
 int err = 0;
 struct knfsd_fh fh;
 char *res;
 +struct in6_addr in6;

 if (size  sizeof(*data))
 return -EINVAL;
 @@ -271,7 +280,12 @@ static ssize_t write_getfd(struct file *
 res = buf;
 sin = (struct sockaddr_in *)data-gd_addr;
 exp_readlock();
 -if (!(clp = auth_unix_lookup(sin-sin_addr)))
 +/* IPv6 address mapping */
 +ipv6_addr_set(in6, 0, 0,
 +htonl(0x),
 +(((struct sockaddr_in *)data-gd_addr)-sin_addr.s_addr));
 +
 +if (!(clp = auth_unix_lookup(in6)))
 err = -EPERM;
 else {
 err = exp_rootfh(clp, data-gd_path, fh, NFS_FHSIZE);
 diff -p -u -r -N linux-2.6.24-rc4/include/linux/sunrpc/svcauth.h 
 linux-2.6.24-rc4-IPv6-cache-based/include/linux/sunrpc/svcauth.h
 --- linux-2.6.24-rc4/include/linux/sunrpc/svcauth.h2007-12-10 
 16:01:43.0 +0100
 +++ linux-2.6.24-rc4-IPv6-cache-based/include/linux/sunrpc/svcauth.h
 2007-12-10 17:09:34.0 +0100
 @@ -120,10 +120,10 @@ extern voidsvc_auth_unregister(rpc_auth

 extern struct auth_domain *unix_domain_find(char *name);
 extern void auth_domain_put(struct auth_domain *item);
 -extern int auth_unix_add_addr(struct in_addr addr, struct auth_domain 
 *dom);
 +extern int auth_unix_add_addr(struct in6_addr *addr, struct auth_domain 
 *dom);
 extern struct auth_domain *auth_domain_lookup(char *name, struct 
 auth_domain *new);
 extern struct auth_domain *auth_domain_find(char *name);
 -extern struct auth_domain *auth_unix_lookup(struct in_addr addr);
 +extern struct auth_domain *auth_unix_lookup(struct in6_addr *addr);
 extern int auth_unix_forget_old(struct auth_domain *dom);
 extern void svcauth_unix_purge(void);
 extern void svcauth_unix_info_release(void *);
 diff -p -u -r -N linux-2.6.24-rc4/net/sunrpc/svcauth_unix.c 
 linux-2.6.24-rc4-IPv6-cache-based/net/sunrpc/svcauth_unix.c
 --- linux-2.6.24-rc4/net/sunrpc/svcauth_unix.c2007-12-10 
 16:01:46.0 +0100
 +++ linux-2.6.24-rc4-IPv6-cache-based/net/sunrpc/svcauth_unix.c
 2007-12-10 17:38:50.0 +0100
 @@ -11,7 +11,8 @@
 #include linux/hash.h
 #include linux/string.h
 #include net/sock.h
 -
 +#include