]> Pileus Git - ~andy/linux/blobdiff - net/core/dev.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/steve/gfs2-3.0-nmw
[~andy/linux] / net / core / dev.c
index d70e4a3a49f2f86f41dd9410845147963c5d011b..0ebaea16632fc348f6a48789831b737c7c51b707 100644 (file)
@@ -1632,6 +1632,8 @@ static inline int deliver_skb(struct sk_buff *skb,
                              struct packet_type *pt_prev,
                              struct net_device *orig_dev)
 {
+       if (unlikely(skb_orphan_frags(skb, GFP_ATOMIC)))
+               return -ENOMEM;
        atomic_inc(&skb->users);
        return pt_prev->func(skb, skb->dev, pt_prev, orig_dev);
 }
@@ -3171,8 +3173,6 @@ static int __netif_receive_skb(struct sk_buff *skb)
        if (netpoll_receive_skb(skb))
                return NET_RX_DROP;
 
-       if (!skb->skb_iif)
-               skb->skb_iif = skb->dev->ifindex;
        orig_dev = skb->dev;
 
        skb_reset_network_header(skb);
@@ -3184,6 +3184,7 @@ static int __netif_receive_skb(struct sk_buff *skb)
        rcu_read_lock();
 
 another_round:
+       skb->skb_iif = skb->dev->ifindex;
 
        __this_cpu_inc(softnet_data.processed);
 
@@ -3262,7 +3263,10 @@ ncls:
        }
 
        if (pt_prev) {
-               ret = pt_prev->func(skb, skb->dev, pt_prev, orig_dev);
+               if (unlikely(skb_orphan_frags(skb, GFP_ATOMIC)))
+                       ret = -ENOMEM;
+               else
+                       ret = pt_prev->func(skb, skb->dev, pt_prev, orig_dev);
        } else {
                atomic_long_inc(&skb->dev->rx_dropped);
                kfree_skb(skb);