diff options
Diffstat (limited to 'net/xfrm/xfrm_ipcomp.c')
-rw-r--r-- | net/xfrm/xfrm_ipcomp.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/net/xfrm/xfrm_ipcomp.c b/net/xfrm/xfrm_ipcomp.c index fc91ad7ee26e..e5246fbe36c4 100644 --- a/net/xfrm/xfrm_ipcomp.c +++ b/net/xfrm/xfrm_ipcomp.c | |||
@@ -70,26 +70,29 @@ static int ipcomp_decompress(struct xfrm_state *x, struct sk_buff *skb) | |||
70 | 70 | ||
71 | while ((scratch += len, dlen -= len) > 0) { | 71 | while ((scratch += len, dlen -= len) > 0) { |
72 | skb_frag_t *frag; | 72 | skb_frag_t *frag; |
73 | struct page *page; | ||
73 | 74 | ||
74 | err = -EMSGSIZE; | 75 | err = -EMSGSIZE; |
75 | if (WARN_ON(skb_shinfo(skb)->nr_frags >= MAX_SKB_FRAGS)) | 76 | if (WARN_ON(skb_shinfo(skb)->nr_frags >= MAX_SKB_FRAGS)) |
76 | goto out; | 77 | goto out; |
77 | 78 | ||
78 | frag = skb_shinfo(skb)->frags + skb_shinfo(skb)->nr_frags; | 79 | frag = skb_shinfo(skb)->frags + skb_shinfo(skb)->nr_frags; |
79 | frag->page = alloc_page(GFP_ATOMIC); | 80 | page = alloc_page(GFP_ATOMIC); |
80 | 81 | ||
81 | err = -ENOMEM; | 82 | err = -ENOMEM; |
82 | if (!frag->page) | 83 | if (!page) |
83 | goto out; | 84 | goto out; |
84 | 85 | ||
86 | __skb_frag_set_page(frag, page); | ||
87 | |||
85 | len = PAGE_SIZE; | 88 | len = PAGE_SIZE; |
86 | if (dlen < len) | 89 | if (dlen < len) |
87 | len = dlen; | 90 | len = dlen; |
88 | 91 | ||
89 | memcpy(page_address(frag->page), scratch, len); | ||
90 | |||
91 | frag->page_offset = 0; | 92 | frag->page_offset = 0; |
92 | frag->size = len; | 93 | skb_frag_size_set(frag, len); |
94 | memcpy(skb_frag_address(frag), scratch, len); | ||
95 | |||
93 | skb->truesize += len; | 96 | skb->truesize += len; |
94 | skb->data_len += len; | 97 | skb->data_len += len; |
95 | skb->len += len; | 98 | skb->len += len; |