diff options
Diffstat (limited to 'net/xfrm/xfrm_ipcomp.c')
| -rw-r--r-- | net/xfrm/xfrm_ipcomp.c | 11 | 
1 files changed, 7 insertions, 4 deletions
diff --git a/net/xfrm/xfrm_ipcomp.c b/net/xfrm/xfrm_ipcomp.c index fc91ad7ee26..f781b9ab8a5 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)  	while ((scratch += len, dlen -= len) > 0) {  		skb_frag_t *frag; +		struct page *page;  		err = -EMSGSIZE;  		if (WARN_ON(skb_shinfo(skb)->nr_frags >= MAX_SKB_FRAGS))  			goto out;  		frag = skb_shinfo(skb)->frags + skb_shinfo(skb)->nr_frags; -		frag->page = alloc_page(GFP_ATOMIC); +		page = alloc_page(GFP_ATOMIC);  		err = -ENOMEM; -		if (!frag->page) +		if (!page)  			goto out; +		__skb_frag_set_page(frag, page); +  		len = PAGE_SIZE;  		if (dlen < len)  			len = dlen; -		memcpy(page_address(frag->page), scratch, len); -  		frag->page_offset = 0;  		frag->size = len; +		memcpy(skb_frag_address(frag), scratch, len); +  		skb->truesize += len;  		skb->data_len += len;  		skb->len += len;  |