diff options
Diffstat (limited to 'net/xfrm/xfrm_output.c')
-rw-r--r-- | net/xfrm/xfrm_output.c | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/net/xfrm/xfrm_output.c b/net/xfrm/xfrm_output.c index 3f964db908a7..dc50f1e71f76 100644 --- a/net/xfrm/xfrm_output.c +++ b/net/xfrm/xfrm_output.c | |||
@@ -27,10 +27,14 @@ static int xfrm_state_check_space(struct xfrm_state *x, struct sk_buff *skb) | |||
27 | - skb_headroom(skb); | 27 | - skb_headroom(skb); |
28 | int ntail = dst->dev->needed_tailroom - skb_tailroom(skb); | 28 | int ntail = dst->dev->needed_tailroom - skb_tailroom(skb); |
29 | 29 | ||
30 | if (nhead > 0 || ntail > 0) | 30 | if (nhead <= 0) { |
31 | return pskb_expand_head(skb, nhead, ntail, GFP_ATOMIC); | 31 | if (ntail <= 0) |
32 | 32 | return 0; | |
33 | return 0; | 33 | nhead = 0; |
34 | } else if (ntail < 0) | ||
35 | ntail = 0; | ||
36 | |||
37 | return pskb_expand_head(skb, nhead, ntail, GFP_ATOMIC); | ||
34 | } | 38 | } |
35 | 39 | ||
36 | static int xfrm_output_one(struct sk_buff *skb, int err) | 40 | static int xfrm_output_one(struct sk_buff *skb, int err) |
@@ -112,16 +116,13 @@ error_nolock: | |||
112 | int xfrm_output_resume(struct sk_buff *skb, int err) | 116 | int xfrm_output_resume(struct sk_buff *skb, int err) |
113 | { | 117 | { |
114 | while (likely((err = xfrm_output_one(skb, err)) == 0)) { | 118 | while (likely((err = xfrm_output_one(skb, err)) == 0)) { |
115 | struct xfrm_state *x; | ||
116 | |||
117 | nf_reset(skb); | 119 | nf_reset(skb); |
118 | 120 | ||
119 | err = skb->dst->ops->local_out(skb); | 121 | err = skb->dst->ops->local_out(skb); |
120 | if (unlikely(err != 1)) | 122 | if (unlikely(err != 1)) |
121 | goto out; | 123 | goto out; |
122 | 124 | ||
123 | x = skb->dst->xfrm; | 125 | if (!skb->dst->xfrm) |
124 | if (!x) | ||
125 | return dst_output(skb); | 126 | return dst_output(skb); |
126 | 127 | ||
127 | err = nf_hook(skb->dst->ops->family, | 128 | err = nf_hook(skb->dst->ops->family, |