Merge branch 'thermal-framework' into linux-linaro-lsk
[firefly-linux-kernel-4.4.55.git] / net / core / skbuff.c
index 66f722b5052a3a6647872730d6b34bc4be5f9dab..6148716884ae85e6919ec6e8e93885f1fb8c2e9c 100644 (file)
@@ -2810,7 +2810,6 @@ struct sk_buff *skb_segment(struct sk_buff *skb, netdev_features_t features)
                tail = nskb;
 
                __copy_skb_header(nskb, skb);
-               nskb->mac_len = skb->mac_len;
 
                /* nskb and skb might have different headroom */
                if (nskb->ip_summed == CHECKSUM_PARTIAL)
@@ -2820,6 +2819,7 @@ struct sk_buff *skb_segment(struct sk_buff *skb, netdev_features_t features)
                skb_set_network_header(nskb, skb->mac_len);
                nskb->transport_header = (nskb->network_header +
                                          skb_network_header_len(skb));
+               skb_reset_mac_len(nskb);
 
                skb_copy_from_linear_data_offset(skb, -tnl_hlen,
                                                 nskb->data - tnl_hlen,
@@ -2844,6 +2844,8 @@ struct sk_buff *skb_segment(struct sk_buff *skb, netdev_features_t features)
                skb_shinfo(nskb)->tx_flags = skb_shinfo(skb)->tx_flags & SKBTX_SHARED_FRAG;
 
                while (pos < offset + len && i < nfrags) {
+                       if (unlikely(skb_orphan_frags(skb, GFP_ATOMIC)))
+                               goto err;
                        *frag = skb_shinfo(skb)->frags[i];
                        __skb_frag_ref(frag);
                        size = skb_frag_size(frag);