diff options
Diffstat (limited to 'net/ipv4/icmp.c')
-rw-r--r-- | net/ipv4/icmp.c | 26 |
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 | ||
1142 | void __init icmp_init(void) | 1142 | static 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 | ||
1157 | int __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 | |||
1189 | fail: | ||
1190 | icmp_exit(); | ||
1191 | return err; | ||
1174 | } | 1192 | } |
1175 | 1193 | ||
1176 | EXPORT_SYMBOL(icmp_err_convert); | 1194 | EXPORT_SYMBOL(icmp_err_convert); |