sunrpc: add routine for comparing addresses
authorJeff Layton <jlayton@redhat.com>
Fri, 14 Aug 2009 16:57:54 +0000 (12:57 -0400)
committerJ. Bruce Fields <bfields@citi.umich.edu>
Fri, 21 Aug 2009 15:27:42 +0000 (11:27 -0400)
lockd needs these sort of routines, as does the NFSv4 callback code.

Move lockd's routines into common code and rename them so that they can
be used by others.

Signed-off-by: Jeff Layton <jlayton@redhat.com>
Acked-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
fs/lockd/clntlock.c
fs/lockd/host.c
fs/lockd/mon.c
fs/lockd/svcsubs.c
include/linux/lockd/lockd.h
include/linux/sunrpc/clnt.h

index 1f3b0fc0d351de0f6bd6ea7f48e3344e99f1fe56..fc9032dc8862df3408a56e7208aef0fb446e3a5e 100644 (file)
@@ -166,7 +166,7 @@ __be32 nlmclnt_grant(const struct sockaddr *addr, const struct nlm_lock *lock)
                 */
                if (fl_blocked->fl_u.nfs_fl.owner->pid != lock->svid)
                        continue;
-               if (!nlm_cmp_addr(nlm_addr(block->b_host), addr))
+               if (!rpc_cmp_addr(nlm_addr(block->b_host), addr))
                        continue;
                if (nfs_compare_fh(NFS_FH(fl_blocked->fl_file->f_path.dentry->d_inode) ,fh) != 0)
                        continue;
index 7cb076ac6b453b939924b6fc173b362cf98ce8b4..4600c2037b8bb8dd71dee46c2cac3cec5cfce296 100644 (file)
@@ -111,7 +111,7 @@ static struct nlm_host *nlm_lookup_host(struct nlm_lookup_host_info *ni)
         */
        chain = &nlm_hosts[nlm_hash_address(ni->sap)];
        hlist_for_each_entry(host, pos, chain, h_hash) {
-               if (!nlm_cmp_addr(nlm_addr(host), ni->sap))
+               if (!rpc_cmp_addr(nlm_addr(host), ni->sap))
                        continue;
 
                /* See if we have an NSM handle for this client */
@@ -125,7 +125,7 @@ static struct nlm_host *nlm_lookup_host(struct nlm_lookup_host_info *ni)
                if (host->h_server != ni->server)
                        continue;
                if (ni->server &&
-                   !nlm_cmp_addr(nlm_srcaddr(host), ni->src_sap))
+                   !rpc_cmp_addr(nlm_srcaddr(host), ni->src_sap))
                        continue;
 
                /* Move to head of hash chain. */
index 30c933188dd79567ad234d4089d452f60ce03b42..f956651d0f651a66a00d4bb9a1d05febf761d524 100644 (file)
@@ -209,7 +209,7 @@ static struct nsm_handle *nsm_lookup_addr(const struct sockaddr *sap)
        struct nsm_handle *nsm;
 
        list_for_each_entry(nsm, &nsm_handles, sm_link)
-               if (nlm_cmp_addr(nsm_addr(nsm), sap))
+               if (rpc_cmp_addr(nsm_addr(nsm), sap))
                        return nsm;
        return NULL;
 }
index 9e4d6aab611b829a22640e7bcdbcbecfc6ee5c45..ad478da7ca63138e6dda728ed6640c4630c5e02e 100644 (file)
@@ -417,7 +417,7 @@ EXPORT_SYMBOL_GPL(nlmsvc_unlock_all_by_sb);
 static int
 nlmsvc_match_ip(void *datap, struct nlm_host *host)
 {
-       return nlm_cmp_addr(nlm_srcaddr(host), datap);
+       return rpc_cmp_addr(nlm_srcaddr(host), datap);
 }
 
 /**
index c325b187966bfc1bd0728a510714affe5117fd40..e7a251a988c031e7e4895afbe5db70e955941910 100644 (file)
@@ -338,49 +338,6 @@ static inline int nlm_privileged_requester(const struct svc_rqst *rqstp)
        }
 }
 
-static inline int __nlm_cmp_addr4(const struct sockaddr *sap1,
-                                 const struct sockaddr *sap2)
-{
-       const struct sockaddr_in *sin1 = (const struct sockaddr_in *)sap1;
-       const struct sockaddr_in *sin2 = (const struct sockaddr_in *)sap2;
-       return sin1->sin_addr.s_addr == sin2->sin_addr.s_addr;
-}
-
-#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
-static inline int __nlm_cmp_addr6(const struct sockaddr *sap1,
-                                 const struct sockaddr *sap2)
-{
-       const struct sockaddr_in6 *sin1 = (const struct sockaddr_in6 *)sap1;
-       const struct sockaddr_in6 *sin2 = (const struct sockaddr_in6 *)sap2;
-       return ipv6_addr_equal(&sin1->sin6_addr, &sin2->sin6_addr);
-}
-#else  /* !(CONFIG_IPV6 || CONFIG_IPV6_MODULE) */
-static inline int __nlm_cmp_addr6(const struct sockaddr *sap1,
-                                 const struct sockaddr *sap2)
-{
-       return 0;
-}
-#endif /* !(CONFIG_IPV6 || CONFIG_IPV6_MODULE) */
-
-/*
- * Compare two host addresses
- *
- * Return TRUE if the addresses are the same; otherwise FALSE.
- */
-static inline int nlm_cmp_addr(const struct sockaddr *sap1,
-                              const struct sockaddr *sap2)
-{
-       if (sap1->sa_family == sap2->sa_family) {
-               switch (sap1->sa_family) {
-               case AF_INET:
-                       return __nlm_cmp_addr4(sap1, sap2);
-               case AF_INET6:
-                       return __nlm_cmp_addr6(sap1, sap2);
-               }
-       }
-       return 0;
-}
-
 /*
  * Compare two NLM locks.
  * When the second lock is of type F_UNLCK, this acts like a wildcard.
index ab3f6e90caa5f6b40c2ff2451d6872617eaecb98..b17df361be82ce19ce553d3bd9883c8d93a046bb 100644 (file)
@@ -22,6 +22,7 @@
 #include <linux/sunrpc/timer.h>
 #include <asm/signal.h>
 #include <linux/path.h>
+#include <net/ipv6.h>
 
 struct rpc_inode;
 
@@ -188,5 +189,52 @@ static inline void rpc_set_port(struct sockaddr *sap,
 #define IPV6_SCOPE_DELIMITER           '%'
 #define IPV6_SCOPE_ID_LEN              sizeof("%nnnnnnnnnn")
 
+static inline bool __rpc_cmp_addr4(const struct sockaddr *sap1,
+                                  const struct sockaddr *sap2)
+{
+       const struct sockaddr_in *sin1 = (const struct sockaddr_in *)sap1;
+       const struct sockaddr_in *sin2 = (const struct sockaddr_in *)sap2;
+
+       return sin1->sin_addr.s_addr == sin2->sin_addr.s_addr;
+}
+
+#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
+static inline bool __rpc_cmp_addr6(const struct sockaddr *sap1,
+                                  const struct sockaddr *sap2)
+{
+       const struct sockaddr_in6 *sin1 = (const struct sockaddr_in6 *)sap1;
+       const struct sockaddr_in6 *sin2 = (const struct sockaddr_in6 *)sap2;
+       return ipv6_addr_equal(&sin1->sin6_addr, &sin2->sin6_addr);
+}
+#else  /* !(CONFIG_IPV6 || CONFIG_IPV6_MODULE) */
+static inline bool __rpc_cmp_addr6(const struct sockaddr *sap1,
+                                  const struct sockaddr *sap2)
+{
+       return false;
+}
+#endif /* !(CONFIG_IPV6 || CONFIG_IPV6_MODULE) */
+
+/**
+ * rpc_cmp_addr - compare the address portion of two sockaddrs.
+ * @sap1: first sockaddr
+ * @sap2: second sockaddr
+ *
+ * Just compares the family and address portion. Ignores port, scope, etc.
+ * Returns true if the addrs are equal, false if they aren't.
+ */
+static inline bool rpc_cmp_addr(const struct sockaddr *sap1,
+                               const struct sockaddr *sap2)
+{
+       if (sap1->sa_family == sap2->sa_family) {
+               switch (sap1->sa_family) {
+               case AF_INET:
+                       return __rpc_cmp_addr4(sap1, sap2);
+               case AF_INET6:
+                       return __rpc_cmp_addr6(sap1, sap2);
+               }
+       }
+       return false;
+}
+
 #endif /* __KERNEL__ */
 #endif /* _LINUX_SUNRPC_CLNT_H */