diff options
Diffstat (limited to 'net/xfrm/xfrm_state.c')
-rw-r--r-- | net/xfrm/xfrm_state.c | 22 |
1 files changed, 8 insertions, 14 deletions
diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c index b36cc344474b..c9d6a5f1348d 100644 --- a/net/xfrm/xfrm_state.c +++ b/net/xfrm/xfrm_state.c | |||
@@ -1102,7 +1102,7 @@ static struct xfrm_state *xfrm_state_clone(struct xfrm_state *orig, int *errp) | |||
1102 | int err = -ENOMEM; | 1102 | int err = -ENOMEM; |
1103 | struct xfrm_state *x = xfrm_state_alloc(net); | 1103 | struct xfrm_state *x = xfrm_state_alloc(net); |
1104 | if (!x) | 1104 | if (!x) |
1105 | goto error; | 1105 | goto out; |
1106 | 1106 | ||
1107 | memcpy(&x->id, &orig->id, sizeof(x->id)); | 1107 | memcpy(&x->id, &orig->id, sizeof(x->id)); |
1108 | memcpy(&x->sel, &orig->sel, sizeof(x->sel)); | 1108 | memcpy(&x->sel, &orig->sel, sizeof(x->sel)); |
@@ -1160,16 +1160,10 @@ static struct xfrm_state *xfrm_state_clone(struct xfrm_state *orig, int *errp) | |||
1160 | return x; | 1160 | return x; |
1161 | 1161 | ||
1162 | error: | 1162 | error: |
1163 | xfrm_state_put(x); | ||
1164 | out: | ||
1163 | if (errp) | 1165 | if (errp) |
1164 | *errp = err; | 1166 | *errp = err; |
1165 | if (x) { | ||
1166 | kfree(x->aalg); | ||
1167 | kfree(x->ealg); | ||
1168 | kfree(x->calg); | ||
1169 | kfree(x->encap); | ||
1170 | kfree(x->coaddr); | ||
1171 | } | ||
1172 | kfree(x); | ||
1173 | return NULL; | 1167 | return NULL; |
1174 | } | 1168 | } |
1175 | 1169 | ||
@@ -1458,12 +1452,12 @@ EXPORT_SYMBOL(xfrm_find_acq_byseq); | |||
1458 | u32 xfrm_get_acqseq(void) | 1452 | u32 xfrm_get_acqseq(void) |
1459 | { | 1453 | { |
1460 | u32 res; | 1454 | u32 res; |
1461 | static u32 acqseq; | 1455 | static atomic_t acqseq; |
1462 | static DEFINE_SPINLOCK(acqseq_lock); | 1456 | |
1457 | do { | ||
1458 | res = atomic_inc_return(&acqseq); | ||
1459 | } while (!res); | ||
1463 | 1460 | ||
1464 | spin_lock_bh(&acqseq_lock); | ||
1465 | res = (++acqseq ? : ++acqseq); | ||
1466 | spin_unlock_bh(&acqseq_lock); | ||
1467 | return res; | 1461 | return res; |
1468 | } | 1462 | } |
1469 | EXPORT_SYMBOL(xfrm_get_acqseq); | 1463 | EXPORT_SYMBOL(xfrm_get_acqseq); |