Complete the support of IPv6 for NFSv2/v3 client.

Signed-off-by: Gilles Quillard <gilles.quillard@bull.net>
---

diff -Nru linux-2.6.9-cel5-gq-05/fs/nfs/inode.c linux-2.6.9-cel5-gq-06/fs/nfs/inode.c
--- linux-2.6.9-cel5-gq-05/fs/nfs/inode.c	2005-01-24 11:21:55.000000000 +0100
+++ linux-2.6.9-cel5-gq-06/fs/nfs/inode.c	2005-01-24 11:22:05.000000000 +0100
@@ -1455,17 +1455,31 @@
 	memcpy(root->data, data->root.data, root->size);
 
 	/* We now require that the mount process passes the remote address */
-	if (data->addr.sin_addr.s_addr == INADDR_ANY) {
-	    printk("NFS: mount program didn't pass remote address!\n");
-	    kfree(server);
-	    return ERR_PTR(-EINVAL);
-	}
-	server->addr.sin6_family = AF_INET6;
-	server->addr.sin6_port = data->addr.sin_port;
-	server->addr.sin6_addr.s6_addr32[0] = 0;
-	server->addr.sin6_addr.s6_addr32[1] = 0;
-	server->addr.sin6_addr.s6_addr32[2] = htonl(0xffff);
-	server->addr.sin6_addr.s6_addr32[3] = data->addr.sin_addr.s_addr;
+	if (data->addr.sin_family == AF_INET) {
+		if (data->addr.sin_addr.s_addr == INADDR_ANY) {
+			printk(KERN_ERR "NFS: mount program didn't pass remote IP address!\n");
+			kfree(server);
+			return ERR_PTR(-EINVAL);
+		}
+		server->addr.sin6_family = AF_INET6;
+		server->addr.sin6_port = data->addr.sin_port;
+		server->addr.sin6_addr.s6_addr32[0] = 0;
+		server->addr.sin6_addr.s6_addr32[1] = 0;
+		server->addr.sin6_addr.s6_addr32[2] = htonl(0xffff);
+		server->addr.sin6_addr.s6_addr32[3] = data->addr.sin_addr.s_addr;
+	} else if (data->addr.sin_family == AF_INET6) {
+		if (data->addr6.sin6_family != AF_INET6 ||
+	    	    IS_ADDR6_ANY(data->addr6.sin6_addr.s6_addr32)) {
+			printk(KERN_ERR "NFS: mount program didn't pass remote IP address!\n");
+			kfree(server);
+			return ERR_PTR(-EINVAL);
+		}
+		memcpy(&server->addr, &data->addr6, sizeof(struct sockaddr_in6));
+	} else {
+		printk(KERN_ERR "NFS: mount program didn't pass remote IP address!\n");
+		kfree(server);
+		return ERR_PTR(-EINVAL);
+	}
 
 	s = sget(fs_type, nfs_compare_super, nfs_set_super, server);
 
diff -Nru linux-2.6.9-cel5-gq-05/include/linux/nfs_mount.h linux-2.6.9-cel5-gq-06/include/linux/nfs_mount.h
--- linux-2.6.9-cel5-gq-05/include/linux/nfs_mount.h	2005-01-21 16:07:03.000000000 +0100
+++ linux-2.6.9-cel5-gq-06/include/linux/nfs_mount.h	2005-01-21 17:10:29.000000000 +0100
@@ -20,7 +20,7 @@
  * mount-to-kernel version compatibility.  Some of these aren't used yet
  * but here they are anyway.
  */
-#define NFS_MOUNT_VERSION	6
+#define NFS_MOUNT_VERSION	7
 #define NFS_MAX_CONTEXT_LEN	256
 
 struct nfs_mount_data {
@@ -43,6 +43,7 @@
 	struct nfs3_fh	root;			/* 4 */
 	int		pseudoflavor;		/* 5 */
 	char		context[NFS_MAX_CONTEXT_LEN + 1];	/* 6 */
+	struct sockaddr_in6 addr6;		/* 7 */
 };
 
 /* bits in the flags field */
