aboutsummaryrefslogtreecommitdiffstats
path: root/net/xfrm/xfrm_output.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/xfrm/xfrm_output.c')
-rw-r--r--net/xfrm/xfrm_output.c17
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
36static int xfrm_output_one(struct sk_buff *skb, int err) 40static int xfrm_output_one(struct sk_buff *skb, int err)
@@ -112,16 +116,13 @@ error_nolock:
112int xfrm_output_resume(struct sk_buff *skb, int err) 116int 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,