NFS: Clean-up: Refactor IP address sanity checks in NFS client

NFS and NFSv4 mounts can now share server address sanity checking.  And, it
provides an easy mechanism for adding IPv6 address checking at some later
point.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Cc: Aurelien Charbon <aurelien.charbon@ext.bull.net>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
diff --git a/fs/nfs/super.c b/fs/nfs/super.c
index 6eac5bf..7f5bc28 100644
--- a/fs/nfs/super.c
+++ b/fs/nfs/super.c
@@ -447,6 +447,23 @@
 }
 
 /*
+ * Sanity-check a server address provided by the mount command
+ */
+static int nfs_verify_server_address(struct sockaddr *addr)
+{
+	switch (addr->sa_family) {
+	case AF_INET: {
+		struct sockaddr_in *sa = (struct sockaddr_in *) addr;
+		if (sa->sin_addr.s_addr != INADDR_ANY)
+			return 1;
+		break;
+	}
+	}
+
+	return 0;
+}
+
+/*
  * Validate the NFS2/NFS3 mount data
  * - fills in the mount root filehandle
  */
@@ -501,7 +518,7 @@
 #endif /* CONFIG_NFS_V3 */
 
 	/* We now require that the mount process passes the remote address */
-	if (data->addr.sin_addr.s_addr == INADDR_ANY) {
+	if (!nfs_verify_server_address((struct sockaddr *) &data->addr)) {
 		dprintk("%s: mount program didn't pass remote address!\n",
 			__FUNCTION__);
 		return -EINVAL;
@@ -819,13 +836,12 @@
 	if (copy_from_user(&addr, data->host_addr, sizeof(addr)))
 		return -EFAULT;
 
-	if (addr.sin_family != AF_INET ||
-	    addr.sin_addr.s_addr == INADDR_ANY
-	    ) {
+	if (!nfs_verify_server_address((struct sockaddr *) &addr)) {
 		dprintk("%s: mount program didn't pass remote IP address!\n",
 				__FUNCTION__);
 		return -EINVAL;
 	}
+
 	/* RFC3530: The default port for NFS is 2049 */
 	if (addr.sin_port == 0)
 		addr.sin_port = htons(NFS_PORT);