|
@@ -1178,7 +1178,7 @@ int skb_copy_ubufs(struct sk_buff *skb, gfp_t gfp_mask)
|
|
|
u32 d_off;
|
|
|
|
|
|
if (!num_frags)
|
|
|
- return 0;
|
|
|
+ goto release;
|
|
|
|
|
|
if (skb_shared(skb) || skb_unclone(skb, gfp_mask))
|
|
|
return -EINVAL;
|
|
@@ -1238,6 +1238,7 @@ int skb_copy_ubufs(struct sk_buff *skb, gfp_t gfp_mask)
|
|
|
__skb_fill_page_desc(skb, new_frags - 1, head, 0, d_off);
|
|
|
skb_shinfo(skb)->nr_frags = new_frags;
|
|
|
|
|
|
+release:
|
|
|
skb_zcopy_clear(skb, false);
|
|
|
return 0;
|
|
|
}
|
|
@@ -3654,8 +3655,6 @@ normal:
|
|
|
|
|
|
skb_shinfo(nskb)->tx_flags |= skb_shinfo(head_skb)->tx_flags &
|
|
|
SKBTX_SHARED_FRAG;
|
|
|
- if (skb_zerocopy_clone(nskb, head_skb, GFP_ATOMIC))
|
|
|
- goto err;
|
|
|
|
|
|
while (pos < offset + len) {
|
|
|
if (i >= nfrags) {
|
|
@@ -3681,6 +3680,8 @@ normal:
|
|
|
|
|
|
if (unlikely(skb_orphan_frags(frag_skb, GFP_ATOMIC)))
|
|
|
goto err;
|
|
|
+ if (skb_zerocopy_clone(nskb, frag_skb, GFP_ATOMIC))
|
|
|
+ goto err;
|
|
|
|
|
|
*nskb_frag = *frag;
|
|
|
__skb_frag_ref(nskb_frag);
|