diff mbox

[4/9] NFS: Use RPC functions for matching sockaddrs

Message ID 1436561897-8051-5-git-send-email-Anna.Schumaker@Netapp.com (mailing list archive)
State New, archived
Headers show

Commit Message

Schumaker, Anna July 10, 2015, 8:58 p.m. UTC
They already exist and do the exact same thing.  Let's save ourselves
several lines of code!

Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
---
 fs/nfs/client.c     | 78 +++--------------------------------------------------
 fs/nfs/internal.h   |  4 ---
 fs/nfs/nfs4client.c |  5 +---
 3 files changed, 4 insertions(+), 83 deletions(-)

Comments

Christoph Hellwig July 13, 2015, 7:03 a.m. UTC | #1
>  static int nfs_sockaddr_cmp_ip6(const struct sockaddr *sa1,
>  				const struct sockaddr *sa2)
>  {
>  	const struct sockaddr_in6 *sin1 = (const struct sockaddr_in6 *)sa1;
>  	const struct sockaddr_in6 *sin2 = (const struct sockaddr_in6 *)sa2;
>  
> -	return nfs_sockaddr_match_ipaddr6(sa1, sa2) &&
> -		(sin1->sin6_port == sin2->sin6_port);
> +	return rpc_cmp_addr6(sa1, sa2) && (sin1->sin6_port == sin2->sin6_port);
>  }
>  
>  static int nfs_sockaddr_cmp_ip4(const struct sockaddr *sa1,
> @@ -350,31 +301,8 @@ static int nfs_sockaddr_cmp_ip4(const struct sockaddr *sa1,
>  	const struct sockaddr_in *sin1 = (const struct sockaddr_in *)sa1;
>  	const struct sockaddr_in *sin2 = (const struct sockaddr_in *)sa2;
>  
> -	return nfs_sockaddr_match_ipaddr4(sa1, sa2) &&
> -		(sin1->sin_port == sin2->sin_port);
> -}

I'd say kill nfs_sockaddr_cmp as well and use rpc_cmp_addr in
nfs_match_client.

--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Schumaker, Anna July 13, 2015, 1:56 p.m. UTC | #2
Hi Christoph,

On 07/13/2015 03:03 AM, Christoph Hellwig wrote:
>>  static int nfs_sockaddr_cmp_ip6(const struct sockaddr *sa1,
>>  				const struct sockaddr *sa2)
>>  {
>>  	const struct sockaddr_in6 *sin1 = (const struct sockaddr_in6 *)sa1;
>>  	const struct sockaddr_in6 *sin2 = (const struct sockaddr_in6 *)sa2;
>>  
>> -	return nfs_sockaddr_match_ipaddr6(sa1, sa2) &&
>> -		(sin1->sin6_port == sin2->sin6_port);
>> +	return rpc_cmp_addr6(sa1, sa2) && (sin1->sin6_port == sin2->sin6_port);
>>  }
>>  
>>  static int nfs_sockaddr_cmp_ip4(const struct sockaddr *sa1,
>> @@ -350,31 +301,8 @@ static int nfs_sockaddr_cmp_ip4(const struct sockaddr *sa1,
>>  	const struct sockaddr_in *sin1 = (const struct sockaddr_in *)sa1;
>>  	const struct sockaddr_in *sin2 = (const struct sockaddr_in *)sa2;
>>  
>> -	return nfs_sockaddr_match_ipaddr4(sa1, sa2) &&
>> -		(sin1->sin_port == sin2->sin_port);
>> -}
> 
> I'd say kill nfs_sockaddr_cmp as well and use rpc_cmp_addr in
> nfs_match_client.
> 

Good idea!  I'll add that in.

Thanks!
Anna

--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Schumaker, Anna July 13, 2015, 2:21 p.m. UTC | #3
On 07/13/2015 03:03 AM, Christoph Hellwig wrote:
>>  static int nfs_sockaddr_cmp_ip6(const struct sockaddr *sa1,
>>  				const struct sockaddr *sa2)
>>  {
>>  	const struct sockaddr_in6 *sin1 = (const struct sockaddr_in6 *)sa1;
>>  	const struct sockaddr_in6 *sin2 = (const struct sockaddr_in6 *)sa2;
>>  
>> -	return nfs_sockaddr_match_ipaddr6(sa1, sa2) &&
>> -		(sin1->sin6_port == sin2->sin6_port);
>> +	return rpc_cmp_addr6(sa1, sa2) && (sin1->sin6_port == sin2->sin6_port);
>>  }
>>  
>>  static int nfs_sockaddr_cmp_ip4(const struct sockaddr *sa1,
>> @@ -350,31 +301,8 @@ static int nfs_sockaddr_cmp_ip4(const struct sockaddr *sa1,
>>  	const struct sockaddr_in *sin1 = (const struct sockaddr_in *)sa1;
>>  	const struct sockaddr_in *sin2 = (const struct sockaddr_in *)sa2;
>>  
>> -	return nfs_sockaddr_match_ipaddr4(sa1, sa2) &&
>> -		(sin1->sin_port == sin2->sin_port);
>> -}
> 
> I'd say kill nfs_sockaddr_cmp as well and use rpc_cmp_addr in
> nfs_match_client.
> 

Okay, looking closer at the code now.  rpc_cmp_addr() explicitely doesn't check for port number, but nfs_sockaddr_cmp() does.  I could add port checking to rpc_cmp_addr(), but I don't know if it was left out intentionally when the code was written.

Trond?

Anna
--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Chuck Lever July 13, 2015, 2:32 p.m. UTC | #4
On Jul 13, 2015, at 10:21 AM, Anna Schumaker <Anna.Schumaker@netapp.com> wrote:

> On 07/13/2015 03:03 AM, Christoph Hellwig wrote:
>>> static int nfs_sockaddr_cmp_ip6(const struct sockaddr *sa1,
>>> 				const struct sockaddr *sa2)
>>> {
>>> 	const struct sockaddr_in6 *sin1 = (const struct sockaddr_in6 *)sa1;
>>> 	const struct sockaddr_in6 *sin2 = (const struct sockaddr_in6 *)sa2;
>>> 
>>> -	return nfs_sockaddr_match_ipaddr6(sa1, sa2) &&
>>> -		(sin1->sin6_port == sin2->sin6_port);
>>> +	return rpc_cmp_addr6(sa1, sa2) && (sin1->sin6_port == sin2->sin6_port);
>>> }
>>> 
>>> static int nfs_sockaddr_cmp_ip4(const struct sockaddr *sa1,
>>> @@ -350,31 +301,8 @@ static int nfs_sockaddr_cmp_ip4(const struct sockaddr *sa1,
>>> 	const struct sockaddr_in *sin1 = (const struct sockaddr_in *)sa1;
>>> 	const struct sockaddr_in *sin2 = (const struct sockaddr_in *)sa2;
>>> 
>>> -	return nfs_sockaddr_match_ipaddr4(sa1, sa2) &&
>>> -		(sin1->sin_port == sin2->sin_port);
>>> -}
>> 
>> I'd say kill nfs_sockaddr_cmp as well and use rpc_cmp_addr in
>> nfs_match_client.
>> 
> 
> Okay, looking closer at the code now.  rpc_cmp_addr() explicitely doesn't check for port number, but nfs_sockaddr_cmp() does.  I could add port checking to rpc_cmp_addr(), but I don't know if it was left out intentionally when the code was written.

Consider adding rpc_cmp_addr_port() which does port checking too?


--
Chuck Lever



--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Anna Schumaker July 13, 2015, 2:49 p.m. UTC | #5
On 07/13/2015 10:32 AM, Chuck Lever wrote:
> 
> On Jul 13, 2015, at 10:21 AM, Anna Schumaker <Anna.Schumaker@netapp.com> wrote:
> 
>> On 07/13/2015 03:03 AM, Christoph Hellwig wrote:
>>>> static int nfs_sockaddr_cmp_ip6(const struct sockaddr *sa1,
>>>> 				const struct sockaddr *sa2)
>>>> {
>>>> 	const struct sockaddr_in6 *sin1 = (const struct sockaddr_in6 *)sa1;
>>>> 	const struct sockaddr_in6 *sin2 = (const struct sockaddr_in6 *)sa2;
>>>>
>>>> -	return nfs_sockaddr_match_ipaddr6(sa1, sa2) &&
>>>> -		(sin1->sin6_port == sin2->sin6_port);
>>>> +	return rpc_cmp_addr6(sa1, sa2) && (sin1->sin6_port == sin2->sin6_port);
>>>> }
>>>>
>>>> static int nfs_sockaddr_cmp_ip4(const struct sockaddr *sa1,
>>>> @@ -350,31 +301,8 @@ static int nfs_sockaddr_cmp_ip4(const struct sockaddr *sa1,
>>>> 	const struct sockaddr_in *sin1 = (const struct sockaddr_in *)sa1;
>>>> 	const struct sockaddr_in *sin2 = (const struct sockaddr_in *)sa2;
>>>>
>>>> -	return nfs_sockaddr_match_ipaddr4(sa1, sa2) &&
>>>> -		(sin1->sin_port == sin2->sin_port);
>>>> -}
>>>
>>> I'd say kill nfs_sockaddr_cmp as well and use rpc_cmp_addr in
>>> nfs_match_client.
>>>
>>
>> Okay, looking closer at the code now.  rpc_cmp_addr() explicitely doesn't check for port number, but nfs_sockaddr_cmp() does.  I could add port checking to rpc_cmp_addr(), but I don't know if it was left out intentionally when the code was written.
> 
> Consider adding rpc_cmp_addr_port() which does port checking too?

I like this idea.  Thanks for the suggestion!

Anna

> 
> 
> --
> Chuck Lever
> 
> 
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 

--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/fs/nfs/client.c b/fs/nfs/client.c
index ecebb40..a8074ec 100644
--- a/fs/nfs/client.c
+++ b/fs/nfs/client.c
@@ -20,6 +20,7 @@ 
 #include <linux/stat.h>
 #include <linux/errno.h>
 #include <linux/unistd.h>
+#include <linux/sunrpc/addr.h>
 #include <linux/sunrpc/clnt.h>
 #include <linux/sunrpc/stats.h>
 #include <linux/sunrpc/metrics.h>
@@ -285,63 +286,13 @@  void nfs_put_client(struct nfs_client *clp)
 }
 EXPORT_SYMBOL_GPL(nfs_put_client);
 
-#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
-/*
- * Test if two ip6 socket addresses refer to the same socket by
- * comparing relevant fields. The padding bytes specifically, are not
- * compared. sin6_flowinfo is not compared because it only affects QoS
- * and sin6_scope_id is only compared if the address is "link local"
- * because "link local" addresses need only be unique to a specific
- * link. Conversely, ordinary unicast addresses might have different
- * sin6_scope_id.
- *
- * The caller should ensure both socket addresses are AF_INET6.
- */
-static int nfs_sockaddr_match_ipaddr6(const struct sockaddr *sa1,
-				      const struct sockaddr *sa2)
-{
-	const struct sockaddr_in6 *sin1 = (const struct sockaddr_in6 *)sa1;
-	const struct sockaddr_in6 *sin2 = (const struct sockaddr_in6 *)sa2;
-
-	if (!ipv6_addr_equal(&sin1->sin6_addr, &sin2->sin6_addr))
-		return 0;
-	else if (ipv6_addr_type(&sin1->sin6_addr) & IPV6_ADDR_LINKLOCAL)
-		return sin1->sin6_scope_id == sin2->sin6_scope_id;
-
-	return 1;
-}
-#else	/* !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE) */
-static int nfs_sockaddr_match_ipaddr6(const struct sockaddr *sa1,
-				      const struct sockaddr *sa2)
-{
-	return 0;
-}
-#endif
-
-/*
- * Test if two ip4 socket addresses refer to the same socket, by
- * comparing relevant fields. The padding bytes specifically, are
- * not compared.
- *
- * The caller should ensure both socket addresses are AF_INET.
- */
-static int nfs_sockaddr_match_ipaddr4(const struct sockaddr *sa1,
-				      const struct sockaddr *sa2)
-{
-	const struct sockaddr_in *sin1 = (const struct sockaddr_in *)sa1;
-	const struct sockaddr_in *sin2 = (const struct sockaddr_in *)sa2;
-
-	return sin1->sin_addr.s_addr == sin2->sin_addr.s_addr;
-}
-
 static int nfs_sockaddr_cmp_ip6(const struct sockaddr *sa1,
 				const struct sockaddr *sa2)
 {
 	const struct sockaddr_in6 *sin1 = (const struct sockaddr_in6 *)sa1;
 	const struct sockaddr_in6 *sin2 = (const struct sockaddr_in6 *)sa2;
 
-	return nfs_sockaddr_match_ipaddr6(sa1, sa2) &&
-		(sin1->sin6_port == sin2->sin6_port);
+	return rpc_cmp_addr6(sa1, sa2) && (sin1->sin6_port == sin2->sin6_port);
 }
 
 static int nfs_sockaddr_cmp_ip4(const struct sockaddr *sa1,
@@ -350,31 +301,8 @@  static int nfs_sockaddr_cmp_ip4(const struct sockaddr *sa1,
 	const struct sockaddr_in *sin1 = (const struct sockaddr_in *)sa1;
 	const struct sockaddr_in *sin2 = (const struct sockaddr_in *)sa2;
 
-	return nfs_sockaddr_match_ipaddr4(sa1, sa2) &&
-		(sin1->sin_port == sin2->sin_port);
-}
-
-#if defined(CONFIG_NFS_V4_1)
-/*
- * Test if two socket addresses represent the same actual socket,
- * by comparing (only) relevant fields, excluding the port number.
- */
-int nfs_sockaddr_match_ipaddr(const struct sockaddr *sa1,
-			      const struct sockaddr *sa2)
-{
-	if (sa1->sa_family != sa2->sa_family)
-		return 0;
-
-	switch (sa1->sa_family) {
-	case AF_INET:
-		return nfs_sockaddr_match_ipaddr4(sa1, sa2);
-	case AF_INET6:
-		return nfs_sockaddr_match_ipaddr6(sa1, sa2);
-	}
-	return 0;
+	return rpc_cmp_addr4(sa1, sa2) && (sin1->sin_port == sin2->sin_port);
 }
-EXPORT_SYMBOL_GPL(nfs_sockaddr_match_ipaddr);
-#endif /* CONFIG_NFS_V4_1 */
 
 /*
  * Test if two socket addresses represent the same actual socket,
diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h
index 9e6475b..b27e81f 100644
--- a/fs/nfs/internal.h
+++ b/fs/nfs/internal.h
@@ -219,10 +219,6 @@  static inline void nfs_fs_proc_exit(void)
 }
 #endif
 
-#ifdef CONFIG_NFS_V4_1
-int nfs_sockaddr_match_ipaddr(const struct sockaddr *, const struct sockaddr *);
-#endif
-
 /* callback_xdr.c */
 extern struct svc_version nfs4_callback_version1;
 extern struct svc_version nfs4_callback_version4;
diff --git a/fs/nfs/nfs4client.c b/fs/nfs/nfs4client.c
index 3aa6a9b..223bedd 100644
--- a/fs/nfs/nfs4client.c
+++ b/fs/nfs/nfs4client.c
@@ -729,10 +729,7 @@  static bool nfs4_cb_match_client(const struct sockaddr *addr,
 		return false;
 
 	/* Match only the IP address, not the port number */
-	if (!nfs_sockaddr_match_ipaddr(addr, clap))
-		return false;
-
-	return true;
+	return rpc_cmp_addr(addr, clap);
 }
 
 /*