diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2007-11-13 21:39:38 -0800 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-01-28 14:53:44 -0800 |
commit | a2deb6d26f16ed7bf787dbd6a58c5d7be47d8db3 (patch) | |
tree | a8c1ef4007cd8d419aa8d8a218092b00dcd64757 /net/ipv6/xfrm6_mode_ro.c | |
parent | e40b3286158565909692e5914ea4a11bdbcc68c8 (diff) |
[IPSEC]: Move x->outer_mode->output out of locked section
RO mode is the only one that requires a locked output function. So
it's easier to move the lock into that function rather than requiring
everyone else to run under the lock.
In particular, this allows us to move the size check into the output
function without causing a potential dead-lock should the ICMP error
somehow hit the same SA on transmission.
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv6/xfrm6_mode_ro.c')
-rw-r--r-- | net/ipv6/xfrm6_mode_ro.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/net/ipv6/xfrm6_mode_ro.c b/net/ipv6/xfrm6_mode_ro.c index a7bc8c62317a..4a01cb3c370b 100644 --- a/net/ipv6/xfrm6_mode_ro.c +++ b/net/ipv6/xfrm6_mode_ro.c @@ -28,6 +28,7 @@ #include <linux/kernel.h> #include <linux/module.h> #include <linux/skbuff.h> +#include <linux/spinlock.h> #include <linux/stringify.h> #include <linux/time.h> #include <net/ipv6.h> @@ -53,7 +54,9 @@ static int xfrm6_ro_output(struct xfrm_state *x, struct sk_buff *skb) __skb_pull(skb, hdr_len); memmove(ipv6_hdr(skb), iph, hdr_len); + spin_lock_bh(&x->lock); x->lastused = get_seconds(); + spin_unlock_bh(&x->lock); return 0; } |