aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/icmp.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/ipv4/icmp.c')
-rw-r--r--net/ipv4/icmp.c26
1 files changed, 22 insertions, 4 deletions
diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c
index 98372db66c66..b345b3d9bcaa 100644
--- a/net/ipv4/icmp.c
+++ b/net/ipv4/icmp.c
@@ -1139,19 +1139,32 @@ static const struct icmp_control icmp_pointers[NR_ICMP_TYPES + 1] = {
1139 }, 1139 },
1140}; 1140};
1141 1141
1142void __init icmp_init(void) 1142static void __exit icmp_exit(void)
1143{ 1143{
1144 struct inet_sock *inet;
1145 int i; 1144 int i;
1146 1145
1147 for_each_possible_cpu(i) { 1146 for_each_possible_cpu(i) {
1148 int err; 1147 struct socket *sock;
1148
1149 sock = per_cpu(__icmp_socket, i);
1150 if (sock == NULL)
1151 continue;
1152 per_cpu(__icmp_socket, i) = NULL;
1153 sock_release(sock);
1154 }
1155}
1149 1156
1157int __init icmp_init(void)
1158{
1159 struct inet_sock *inet;
1160 int i, err;
1161
1162 for_each_possible_cpu(i) {
1150 err = sock_create_kern(PF_INET, SOCK_RAW, IPPROTO_ICMP, 1163 err = sock_create_kern(PF_INET, SOCK_RAW, IPPROTO_ICMP,
1151 &per_cpu(__icmp_socket, i)); 1164 &per_cpu(__icmp_socket, i));
1152 1165
1153 if (err < 0) 1166 if (err < 0)
1154 panic("Failed to create the ICMP control socket.\n"); 1167 goto fail;
1155 1168
1156 per_cpu(__icmp_socket, i)->sk->sk_allocation = GFP_ATOMIC; 1169 per_cpu(__icmp_socket, i)->sk->sk_allocation = GFP_ATOMIC;
1157 1170
@@ -1171,6 +1184,11 @@ void __init icmp_init(void)
1171 */ 1184 */
1172 per_cpu(__icmp_socket, i)->sk->sk_prot->unhash(per_cpu(__icmp_socket, i)->sk); 1185 per_cpu(__icmp_socket, i)->sk->sk_prot->unhash(per_cpu(__icmp_socket, i)->sk);
1173 } 1186 }
1187 return 0;
1188
1189fail:
1190 icmp_exit();
1191 return err;
1174} 1192}
1175 1193
1176EXPORT_SYMBOL(icmp_err_convert); 1194EXPORT_SYMBOL(icmp_err_convert);