diff options
Diffstat (limited to 'net/ipv4/af_inet.c')
| -rw-r--r-- | net/ipv4/af_inet.c | 56 | 
1 files changed, 26 insertions, 30 deletions
diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c index eae1f676f870..1b745d412cf6 100644 --- a/net/ipv4/af_inet.c +++ b/net/ipv4/af_inet.c @@ -465,8 +465,10 @@ int inet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)  	if (addr_len < sizeof(struct sockaddr_in))  		goto out; -	if (addr->sin_family != AF_INET) +	if (addr->sin_family != AF_INET) { +		err = -EAFNOSUPPORT;  		goto out; +	}  	chk_addr_ret = inet_addr_type(sock_net(sk), addr->sin_addr.s_addr); @@ -1438,11 +1440,11 @@ EXPORT_SYMBOL_GPL(inet_ctl_sock_create);  unsigned long snmp_fold_field(void __percpu *mib[], int offt)  {  	unsigned long res = 0; -	int i; +	int i, j;  	for_each_possible_cpu(i) { -		res += *(((unsigned long *) per_cpu_ptr(mib[0], i)) + offt); -		res += *(((unsigned long *) per_cpu_ptr(mib[1], i)) + offt); +		for (j = 0; j < SNMP_ARRAY_SZ; j++) +			res += *(((unsigned long *) per_cpu_ptr(mib[j], i)) + offt);  	}  	return res;  } @@ -1456,28 +1458,19 @@ u64 snmp_fold_field64(void __percpu *mib[], int offt, size_t syncp_offset)  	int cpu;  	for_each_possible_cpu(cpu) { -		void *bhptr, *userptr; +		void *bhptr;  		struct u64_stats_sync *syncp; -		u64 v_bh, v_user; +		u64 v;  		unsigned int start; -		/* first mib used by softirq context, we must use _bh() accessors */ -		bhptr = per_cpu_ptr(SNMP_STAT_BHPTR(mib), cpu); +		bhptr = per_cpu_ptr(mib[0], cpu);  		syncp = (struct u64_stats_sync *)(bhptr + syncp_offset);  		do {  			start = u64_stats_fetch_begin_bh(syncp); -			v_bh = *(((u64 *) bhptr) + offt); +			v = *(((u64 *) bhptr) + offt);  		} while (u64_stats_fetch_retry_bh(syncp, start)); -		/* second mib used in USER context */ -		userptr = per_cpu_ptr(SNMP_STAT_USRPTR(mib), cpu); -		syncp = (struct u64_stats_sync *)(userptr + syncp_offset); -		do { -			start = u64_stats_fetch_begin(syncp); -			v_user = *(((u64 *) userptr) + offt); -		} while (u64_stats_fetch_retry(syncp, start)); - -		res += v_bh + v_user; +		res += v;  	}  	return res;  } @@ -1489,25 +1482,28 @@ int snmp_mib_init(void __percpu *ptr[2], size_t mibsize, size_t align)  	BUG_ON(ptr == NULL);  	ptr[0] = __alloc_percpu(mibsize, align);  	if (!ptr[0]) -		goto err0; +		return -ENOMEM; +#if SNMP_ARRAY_SZ == 2  	ptr[1] = __alloc_percpu(mibsize, align); -	if (!ptr[1]) -		goto err1; +	if (!ptr[1]) { +		free_percpu(ptr[0]); +		ptr[0] = NULL; +		return -ENOMEM; +	} +#endif  	return 0; -err1: -	free_percpu(ptr[0]); -	ptr[0] = NULL; -err0: -	return -ENOMEM;  }  EXPORT_SYMBOL_GPL(snmp_mib_init); -void snmp_mib_free(void __percpu *ptr[2]) +void snmp_mib_free(void __percpu *ptr[SNMP_ARRAY_SZ])  { +	int i; +  	BUG_ON(ptr == NULL); -	free_percpu(ptr[0]); -	free_percpu(ptr[1]); -	ptr[0] = ptr[1] = NULL; +	for (i = 0; i < SNMP_ARRAY_SZ; i++) { +		free_percpu(ptr[i]); +		ptr[i] = NULL; +	}  }  EXPORT_SYMBOL_GPL(snmp_mib_free);  |