]> Pileus Git - ~andy/linux/blobdiff - net/sunrpc/svcauth_unix.c
Merge branch 'upstream-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid
[~andy/linux] / net / sunrpc / svcauth_unix.c
index 2777fa896645de3f063aa5ad67cb054bbb75a894..4d012920373345ccb7b76957e792900c143505e9 100644 (file)
@@ -104,23 +104,9 @@ static void ip_map_put(struct kref *kref)
        kfree(im);
 }
 
-#if IP_HASHBITS == 8
-/* hash_long on a 64 bit machine is currently REALLY BAD for
- * IP addresses in reverse-endian (i.e. on a little-endian machine).
- * So use a trivial but reliable hash instead
- */
-static inline int hash_ip(__be32 ip)
-{
-       int hash = (__force u32)ip ^ ((__force u32)ip>>16);
-       return (hash ^ (hash>>8)) & 0xff;
-}
-#endif
-static inline int hash_ip6(struct in6_addr ip)
+static inline int hash_ip6(const struct in6_addr *ip)
 {
-       return (hash_ip(ip.s6_addr32[0]) ^
-               hash_ip(ip.s6_addr32[1]) ^
-               hash_ip(ip.s6_addr32[2]) ^
-               hash_ip(ip.s6_addr32[3]));
+       return hash_32(ipv6_addr_hash(ip), IP_HASHBITS);
 }
 static int ip_map_match(struct cache_head *corig, struct cache_head *cnew)
 {
@@ -301,7 +287,7 @@ static struct ip_map *__ip_map_lookup(struct cache_detail *cd, char *class,
        ip.m_addr = *addr;
        ch = sunrpc_cache_lookup(cd, &ip.h,
                                 hash_str(class, IP_HASHBITS) ^
-                                hash_ip6(*addr));
+                                hash_ip6(addr));
 
        if (ch)
                return container_of(ch, struct ip_map, h);
@@ -331,7 +317,7 @@ static int __ip_map_update(struct cache_detail *cd, struct ip_map *ipm,
        ip.h.expiry_time = expiry;
        ch = sunrpc_cache_update(cd, &ip.h, &ipm->h,
                                 hash_str(ipm->m_class, IP_HASHBITS) ^
-                                hash_ip6(ipm->m_addr));
+                                hash_ip6(&ipm->m_addr));
        if (!ch)
                return -ENOMEM;
        cache_put(ch, cd);