diff options
Diffstat (limited to 'net/ipv6/ipcomp6.c')
-rw-r--r-- | net/ipv6/ipcomp6.c | 22 |
1 files changed, 11 insertions, 11 deletions
diff --git a/net/ipv6/ipcomp6.c b/net/ipv6/ipcomp6.c index d511a884dad0..028b636687ec 100644 --- a/net/ipv6/ipcomp6.c +++ b/net/ipv6/ipcomp6.c | |||
@@ -50,6 +50,7 @@ | |||
50 | #include <net/protocol.h> | 50 | #include <net/protocol.h> |
51 | #include <linux/ipv6.h> | 51 | #include <linux/ipv6.h> |
52 | #include <linux/icmpv6.h> | 52 | #include <linux/icmpv6.h> |
53 | #include <linux/mutex.h> | ||
53 | 54 | ||
54 | struct ipcomp6_tfms { | 55 | struct ipcomp6_tfms { |
55 | struct list_head list; | 56 | struct list_head list; |
@@ -57,7 +58,7 @@ struct ipcomp6_tfms { | |||
57 | int users; | 58 | int users; |
58 | }; | 59 | }; |
59 | 60 | ||
60 | static DECLARE_MUTEX(ipcomp6_resource_sem); | 61 | static DEFINE_MUTEX(ipcomp6_resource_mutex); |
61 | static void **ipcomp6_scratches; | 62 | static void **ipcomp6_scratches; |
62 | static int ipcomp6_scratch_users; | 63 | static int ipcomp6_scratch_users; |
63 | static LIST_HEAD(ipcomp6_tfms_list); | 64 | static LIST_HEAD(ipcomp6_tfms_list); |
@@ -286,8 +287,8 @@ static void ipcomp6_free_scratches(void) | |||
286 | 287 | ||
287 | for_each_cpu(i) { | 288 | for_each_cpu(i) { |
288 | void *scratch = *per_cpu_ptr(scratches, i); | 289 | void *scratch = *per_cpu_ptr(scratches, i); |
289 | if (scratch) | 290 | |
290 | vfree(scratch); | 291 | vfree(scratch); |
291 | } | 292 | } |
292 | 293 | ||
293 | free_percpu(scratches); | 294 | free_percpu(scratches); |
@@ -405,9 +406,9 @@ static void ipcomp6_destroy(struct xfrm_state *x) | |||
405 | if (!ipcd) | 406 | if (!ipcd) |
406 | return; | 407 | return; |
407 | xfrm_state_delete_tunnel(x); | 408 | xfrm_state_delete_tunnel(x); |
408 | down(&ipcomp6_resource_sem); | 409 | mutex_lock(&ipcomp6_resource_mutex); |
409 | ipcomp6_free_data(ipcd); | 410 | ipcomp6_free_data(ipcd); |
410 | up(&ipcomp6_resource_sem); | 411 | mutex_unlock(&ipcomp6_resource_mutex); |
411 | kfree(ipcd); | 412 | kfree(ipcd); |
412 | 413 | ||
413 | xfrm6_tunnel_free_spi((xfrm_address_t *)&x->props.saddr); | 414 | xfrm6_tunnel_free_spi((xfrm_address_t *)&x->props.saddr); |
@@ -427,23 +428,22 @@ static int ipcomp6_init_state(struct xfrm_state *x) | |||
427 | goto out; | 428 | goto out; |
428 | 429 | ||
429 | err = -ENOMEM; | 430 | err = -ENOMEM; |
430 | ipcd = kmalloc(sizeof(*ipcd), GFP_KERNEL); | 431 | ipcd = kzalloc(sizeof(*ipcd), GFP_KERNEL); |
431 | if (!ipcd) | 432 | if (!ipcd) |
432 | goto out; | 433 | goto out; |
433 | 434 | ||
434 | memset(ipcd, 0, sizeof(*ipcd)); | ||
435 | x->props.header_len = 0; | 435 | x->props.header_len = 0; |
436 | if (x->props.mode) | 436 | if (x->props.mode) |
437 | x->props.header_len += sizeof(struct ipv6hdr); | 437 | x->props.header_len += sizeof(struct ipv6hdr); |
438 | 438 | ||
439 | down(&ipcomp6_resource_sem); | 439 | mutex_lock(&ipcomp6_resource_mutex); |
440 | if (!ipcomp6_alloc_scratches()) | 440 | if (!ipcomp6_alloc_scratches()) |
441 | goto error; | 441 | goto error; |
442 | 442 | ||
443 | ipcd->tfms = ipcomp6_alloc_tfms(x->calg->alg_name); | 443 | ipcd->tfms = ipcomp6_alloc_tfms(x->calg->alg_name); |
444 | if (!ipcd->tfms) | 444 | if (!ipcd->tfms) |
445 | goto error; | 445 | goto error; |
446 | up(&ipcomp6_resource_sem); | 446 | mutex_unlock(&ipcomp6_resource_mutex); |
447 | 447 | ||
448 | if (x->props.mode) { | 448 | if (x->props.mode) { |
449 | err = ipcomp6_tunnel_attach(x); | 449 | err = ipcomp6_tunnel_attach(x); |
@@ -459,10 +459,10 @@ static int ipcomp6_init_state(struct xfrm_state *x) | |||
459 | out: | 459 | out: |
460 | return err; | 460 | return err; |
461 | error_tunnel: | 461 | error_tunnel: |
462 | down(&ipcomp6_resource_sem); | 462 | mutex_lock(&ipcomp6_resource_mutex); |
463 | error: | 463 | error: |
464 | ipcomp6_free_data(ipcd); | 464 | ipcomp6_free_data(ipcd); |
465 | up(&ipcomp6_resource_sem); | 465 | mutex_unlock(&ipcomp6_resource_mutex); |
466 | kfree(ipcd); | 466 | kfree(ipcd); |
467 | 467 | ||
468 | goto out; | 468 | goto out; |