Merge tag 'master-2014-07-31' of git://git.kernel.org/pub/scm/linux/kernel/git/linvil...
[cascardo/linux.git] / net / core / dev.c
index 7990984..b370230 100644 (file)
@@ -1085,6 +1085,7 @@ static int dev_get_valid_name(struct net *net,
  */
 int dev_change_name(struct net_device *dev, const char *newname)
 {
+       unsigned char old_assign_type;
        char oldname[IFNAMSIZ];
        int err = 0;
        int ret;
@@ -1112,10 +1113,17 @@ int dev_change_name(struct net_device *dev, const char *newname)
                return err;
        }
 
+       if (oldname[0] && !strchr(oldname, '%'))
+               netdev_info(dev, "renamed from %s\n", oldname);
+
+       old_assign_type = dev->name_assign_type;
+       dev->name_assign_type = NET_NAME_RENAMED;
+
 rollback:
        ret = device_rename(&dev->dev, dev->name);
        if (ret) {
                memcpy(dev->name, oldname, IFNAMSIZ);
+               dev->name_assign_type = old_assign_type;
                write_seqcount_end(&devnet_rename_seq);
                return ret;
        }
@@ -1144,6 +1152,8 @@ rollback:
                        write_seqcount_begin(&devnet_rename_seq);
                        memcpy(dev->name, oldname, IFNAMSIZ);
                        memcpy(oldname, newname, IFNAMSIZ);
+                       dev->name_assign_type = old_assign_type;
+                       old_assign_type = NET_NAME_RENAMED;
                        goto rollback;
                } else {
                        pr_err("%s: name change rollback failed: %d\n",
@@ -2316,7 +2326,7 @@ __be16 skb_network_protocol(struct sk_buff *skb, int *depth)
         */
        if (type == htons(ETH_P_8021Q) || type == htons(ETH_P_8021AD)) {
                if (vlan_depth) {
-                       if (unlikely(WARN_ON(vlan_depth < VLAN_HLEN)))
+                       if (WARN_ON(vlan_depth < VLAN_HLEN))
                                return 0;
                        vlan_depth -= VLAN_HLEN;
                } else {
@@ -2414,8 +2424,8 @@ struct sk_buff *__skb_gso_segment(struct sk_buff *skb,
 
                skb_warn_bad_offload(skb);
 
-               if (skb_header_cloned(skb) &&
-                   (err = pskb_expand_head(skb, 0, 0, GFP_ATOMIC)))
+               err = skb_cow_head(skb, 0);
+               if (err < 0)
                        return ERR_PTR(err);
        }
 
@@ -2745,8 +2755,8 @@ static inline int __dev_xmit_skb(struct sk_buff *skb, struct Qdisc *q,
        /*
         * Heuristic to force contended enqueues to serialize on a
         * separate lock before trying to get qdisc main lock.
-        * This permits __QDISC_STATE_RUNNING owner to get the lock more often
-        * and dequeue packets faster.
+        * This permits __QDISC___STATE_RUNNING owner to get the lock more
+        * often and dequeue packets faster.
         */
        contended = qdisc_is_running(q);
        if (unlikely(contended))
@@ -4096,6 +4106,8 @@ static void napi_reuse_skb(struct napi_struct *napi, struct sk_buff *skb)
        skb->vlan_tci = 0;
        skb->dev = napi->dev;
        skb->skb_iif = 0;
+       skb->encapsulation = 0;
+       skb_shinfo(skb)->gso_type = 0;
        skb->truesize = SKB_TRUESIZE(skb_end_offset(skb));
 
        napi->skb = skb;
@@ -5438,13 +5450,9 @@ int __dev_change_flags(struct net_device *dev, unsigned int flags)
         */
 
        ret = 0;
-       if ((old_flags ^ flags) & IFF_UP) {     /* Bit is different  ? */
+       if ((old_flags ^ flags) & IFF_UP)
                ret = ((old_flags & IFF_UP) ? __dev_close : __dev_open)(dev);
 
-               if (!ret)
-                       dev_set_rx_mode(dev);
-       }
-
        if ((flags ^ dev->gflags) & IFF_PROMISC) {
                int inc = (flags & IFF_PROMISC) ? 1 : -1;
                unsigned int old_flags = dev->flags;
@@ -6444,17 +6452,19 @@ void netdev_freemem(struct net_device *dev)
 
 /**
  *     alloc_netdev_mqs - allocate network device
- *     @sizeof_priv:   size of private data to allocate space for
- *     @name:          device name format string
- *     @setup:         callback to initialize device
- *     @txqs:          the number of TX subqueues to allocate
- *     @rxqs:          the number of RX subqueues to allocate
+ *     @sizeof_priv:           size of private data to allocate space for
+ *     @name:                  device name format string
+ *     @name_assign_type:      origin of device name
+ *     @setup:                 callback to initialize device
+ *     @txqs:                  the number of TX subqueues to allocate
+ *     @rxqs:                  the number of RX subqueues to allocate
  *
  *     Allocates a struct net_device with private data area for driver use
  *     and performs basic initialization.  Also allocates subqueue structs
  *     for each queue on the device.
  */
 struct net_device *alloc_netdev_mqs(int sizeof_priv, const char *name,
+               unsigned char name_assign_type,
                void (*setup)(struct net_device *),
                unsigned int txqs, unsigned int rxqs)
 {
@@ -6533,6 +6543,7 @@ struct net_device *alloc_netdev_mqs(int sizeof_priv, const char *name,
 #endif
 
        strcpy(dev->name, name);
+       dev->name_assign_type = name_assign_type;
        dev->group = INIT_NETDEV_GROUP;
        if (!dev->ethtool_ops)
                dev->ethtool_ops = &default_ethtool_ops;
@@ -6944,12 +6955,14 @@ static int __netdev_printk(const char *level, const struct net_device *dev,
        if (dev && dev->dev.parent) {
                r = dev_printk_emit(level[1] - '0',
                                    dev->dev.parent,
-                                   "%s %s %s: %pV",
+                                   "%s %s %s%s: %pV",
                                    dev_driver_string(dev->dev.parent),
                                    dev_name(dev->dev.parent),
-                                   netdev_name(dev), vaf);
+                                   netdev_name(dev), netdev_reg_state(dev),
+                                   vaf);
        } else if (dev) {
-               r = printk("%s%s: %pV", level, netdev_name(dev), vaf);
+               r = printk("%s%s%s: %pV", level, netdev_name(dev),
+                          netdev_reg_state(dev), vaf);
        } else {
                r = printk("%s(NULL net_device): %pV", level, vaf);
        }
@@ -7101,7 +7114,7 @@ static void __net_exit default_device_exit_batch(struct list_head *net_list)
        rtnl_lock_unregistering(net_list);
        list_for_each_entry(net, net_list, exit_list) {
                for_each_netdev_reverse(net, dev) {
-                       if (dev->rtnl_link_ops)
+                       if (dev->rtnl_link_ops && dev->rtnl_link_ops->dellink)
                                dev->rtnl_link_ops->dellink(dev, &dev_kill_list);
                        else
                                unregister_netdevice_queue(dev, &dev_kill_list);