diff options
Diffstat (limited to 'net/ipv4/ipcomp.c')
| -rw-r--r-- | net/ipv4/ipcomp.c | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/net/ipv4/ipcomp.c b/net/ipv4/ipcomp.c index d64e2ec8da7b..c95020f7c81e 100644 --- a/net/ipv4/ipcomp.c +++ b/net/ipv4/ipcomp.c | |||
| @@ -24,6 +24,7 @@ | |||
| 24 | #include <linux/list.h> | 24 | #include <linux/list.h> |
| 25 | #include <linux/vmalloc.h> | 25 | #include <linux/vmalloc.h> |
| 26 | #include <linux/rtnetlink.h> | 26 | #include <linux/rtnetlink.h> |
| 27 | #include <linux/mutex.h> | ||
| 27 | #include <net/ip.h> | 28 | #include <net/ip.h> |
| 28 | #include <net/xfrm.h> | 29 | #include <net/xfrm.h> |
| 29 | #include <net/icmp.h> | 30 | #include <net/icmp.h> |
| @@ -36,7 +37,7 @@ struct ipcomp_tfms { | |||
| 36 | int users; | 37 | int users; |
| 37 | }; | 38 | }; |
| 38 | 39 | ||
| 39 | static DECLARE_MUTEX(ipcomp_resource_sem); | 40 | static DEFINE_MUTEX(ipcomp_resource_mutex); |
| 40 | static void **ipcomp_scratches; | 41 | static void **ipcomp_scratches; |
| 41 | static int ipcomp_scratch_users; | 42 | static int ipcomp_scratch_users; |
| 42 | static LIST_HEAD(ipcomp_tfms_list); | 43 | static LIST_HEAD(ipcomp_tfms_list); |
| @@ -253,7 +254,7 @@ error: | |||
| 253 | } | 254 | } |
| 254 | 255 | ||
| 255 | /* | 256 | /* |
| 256 | * Must be protected by xfrm_cfg_sem. State and tunnel user references are | 257 | * Must be protected by xfrm_cfg_mutex. State and tunnel user references are |
| 257 | * always incremented on success. | 258 | * always incremented on success. |
| 258 | */ | 259 | */ |
| 259 | static int ipcomp_tunnel_attach(struct xfrm_state *x) | 260 | static int ipcomp_tunnel_attach(struct xfrm_state *x) |
| @@ -411,9 +412,9 @@ static void ipcomp_destroy(struct xfrm_state *x) | |||
| 411 | if (!ipcd) | 412 | if (!ipcd) |
| 412 | return; | 413 | return; |
| 413 | xfrm_state_delete_tunnel(x); | 414 | xfrm_state_delete_tunnel(x); |
| 414 | down(&ipcomp_resource_sem); | 415 | mutex_lock(&ipcomp_resource_mutex); |
| 415 | ipcomp_free_data(ipcd); | 416 | ipcomp_free_data(ipcd); |
| 416 | up(&ipcomp_resource_sem); | 417 | mutex_unlock(&ipcomp_resource_mutex); |
| 417 | kfree(ipcd); | 418 | kfree(ipcd); |
| 418 | } | 419 | } |
| 419 | 420 | ||
| @@ -440,14 +441,14 @@ static int ipcomp_init_state(struct xfrm_state *x) | |||
| 440 | if (x->props.mode) | 441 | if (x->props.mode) |
| 441 | x->props.header_len += sizeof(struct iphdr); | 442 | x->props.header_len += sizeof(struct iphdr); |
| 442 | 443 | ||
| 443 | down(&ipcomp_resource_sem); | 444 | mutex_lock(&ipcomp_resource_mutex); |
| 444 | if (!ipcomp_alloc_scratches()) | 445 | if (!ipcomp_alloc_scratches()) |
| 445 | goto error; | 446 | goto error; |
| 446 | 447 | ||
| 447 | ipcd->tfms = ipcomp_alloc_tfms(x->calg->alg_name); | 448 | ipcd->tfms = ipcomp_alloc_tfms(x->calg->alg_name); |
| 448 | if (!ipcd->tfms) | 449 | if (!ipcd->tfms) |
| 449 | goto error; | 450 | goto error; |
| 450 | up(&ipcomp_resource_sem); | 451 | mutex_unlock(&ipcomp_resource_mutex); |
| 451 | 452 | ||
| 452 | if (x->props.mode) { | 453 | if (x->props.mode) { |
| 453 | err = ipcomp_tunnel_attach(x); | 454 | err = ipcomp_tunnel_attach(x); |
| @@ -464,10 +465,10 @@ out: | |||
| 464 | return err; | 465 | return err; |
| 465 | 466 | ||
| 466 | error_tunnel: | 467 | error_tunnel: |
| 467 | down(&ipcomp_resource_sem); | 468 | mutex_lock(&ipcomp_resource_mutex); |
| 468 | error: | 469 | error: |
| 469 | ipcomp_free_data(ipcd); | 470 | ipcomp_free_data(ipcd); |
| 470 | up(&ipcomp_resource_sem); | 471 | mutex_unlock(&ipcomp_resource_mutex); |
| 471 | kfree(ipcd); | 472 | kfree(ipcd); |
| 472 | goto out; | 473 | goto out; |
| 473 | } | 474 | } |
