diff options
Diffstat (limited to 'net/sunrpc/svcauth_unix.c')
| -rw-r--r-- | net/sunrpc/svcauth_unix.c | 22 | 
1 files changed, 4 insertions, 18 deletions
| diff --git a/net/sunrpc/svcauth_unix.c b/net/sunrpc/svcauth_unix.c index 2777fa89664..4d012920373 100644 --- a/net/sunrpc/svcauth_unix.c +++ b/net/sunrpc/svcauth_unix.c @@ -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); | 
