Add support for the AF_INET6 family of IP addresses in __nfs_find_client.

Signed-off-by: Chuck Lever <[EMAIL PROTECTED]>
Cc: Aurelien Charbon <[EMAIL PROTECTED]>
---

 fs/nfs/client.c |   34 +++++++++++++++++++++++++++-------
 1 files changed, 27 insertions(+), 7 deletions(-)

diff --git a/fs/nfs/client.c b/fs/nfs/client.c
index 8eff0b2..67a5a53 100644
--- a/fs/nfs/client.c
+++ b/fs/nfs/client.c
@@ -34,6 +34,8 @@
 #include <linux/nfs_idmap.h>
 #include <linux/vfs.h>
 #include <linux/inet.h>
+#include <linux/in6.h>
+#include <net/ipv6.h>
 #include <linux/nfs_xdr.h>
 
 #include <asm/system.h>
@@ -213,11 +215,10 @@ static struct nfs_client *__nfs_find_client(const struct 
sockaddr *addr,
                                            unsigned int nfsversion,
                                            int match_port)
 {
-       struct sockaddr_in *ap = (struct sockaddr_in *)addr;
        struct nfs_client *clp;
 
        list_for_each_entry(clp, &nfs_client_list, cl_share_link) {
-               struct sockaddr_in *clap = (struct sockaddr_in *)&clp->cl_addr;
+               struct sockaddr *clap = (struct sockaddr *)&clp->cl_addr;
 
                /* Don't match clients that failed to initialise properly */
                if (clp->cl_cons_state < 0)
@@ -227,14 +228,33 @@ static struct nfs_client *__nfs_find_client(const struct 
sockaddr *addr,
                if (clp->rpc_ops->version != nfsversion)
                        continue;
 
-               if (((struct sockaddr *)clap)->sa_family != addr->sa_family)
+               if (clap->sa_family != addr->sa_family)
                        continue;
 
-               if (clap->sin_addr.s_addr != ap->sin_addr.s_addr)
+               switch (addr->sa_family) {
+               case AF_INET: {
+                       struct sockaddr_in *sap = (struct sockaddr_in *)clap;
+                       struct sockaddr_in *ap = (struct sockaddr_in *)addr;
+                       if (sap->sin_addr.s_addr != ap->sin_addr.s_addr)
+                               continue;
+                       if (!match_port || sap->sin_port == ap->sin_port)
+                               goto found;
                        continue;
-
-               if (!match_port || clap->sin_port == ap->sin_port)
-                       goto found;
+                       }
+               case AF_INET6: {
+                       struct sockaddr_in6 *sap = (struct sockaddr_in6 *)clap;
+                       struct sockaddr_in6 *ap = (struct sockaddr_in6 *)addr;
+                       if (!ipv6_addr_equal(&sap->sin6_addr, &ap->sin6_addr))
+                               continue;
+                       if (!match_port || sap->sin6_port == ap->sin6_port)
+                               goto found;
+                       continue;
+                       }
+               default:
+                       printk(KERN_ERR "%s: address family not supported\n",
+                               __FUNCTION__);
+                       return NULL;
+               }
        }
 
        return NULL;

-
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

Reply via email to