Change to allow register_netdevice() to be called with a blank name.
If name is blank, it is not put in name hash list, and doesn't
show up in /sys or /proc

Compile tested only...

---
 net/core/dev.c |   56 +++++++++++++++++++++++++++++++++-----------------------
 1 files changed, 33 insertions(+), 23 deletions(-)

diff --git a/net/core/dev.c b/net/core/dev.c
index e660cb5..91f64e7 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -737,7 +737,7 @@ int dev_change_name(struct net_device *d
        if (dev->flags & IFF_UP)
                return -EBUSY;
 
-       if (!dev_valid_name(newname))
+       if (hlist_unhashed(&dev->name_hlist) || !dev_valid_name(newname))
                return -EINVAL;
 
        if (strchr(newname, '%')) {
@@ -2108,6 +2108,10 @@ void dev_seq_stop(struct seq_file *seq, 
 
 static void dev_seq_printf_stats(struct seq_file *seq, struct net_device *dev)
 {
+       /* hidden device */
+       if (hlist_unhashed(&dev->name_hlist))
+               return;
+
        if (dev->get_stats) {
                struct net_device_stats *stats = dev->get_stats(dev);
 
@@ -2868,10 +2872,6 @@ static inline void net_set_todo(struct n
  *
  *     Callers must hold the rtnl semaphore. You may want
  *     register_netdev() instead of this.
- *
- *     BUGS:
- *     The locking appears insufficient to guarantee two parallel registers
- *     will not get the same name.
  */
 
 int register_netdevice(struct net_device *dev)
@@ -2907,7 +2907,7 @@ #endif
                }
        }
  
-       if (!dev_valid_name(dev->name)) {
+       if (dev->name[0] && !dev_valid_name(dev->name)) {
                ret = -EINVAL;
                goto out;
        }
@@ -2917,15 +2917,18 @@ #endif
                dev->iflink = dev->ifindex;
 
        /* Check for existence of name */
-       head = dev_name_hash(dev->name);
-       hlist_for_each(p, head) {
-               struct net_device *d
-                       = hlist_entry(p, struct net_device, name_hlist);
-               if (!strncmp(d->name, dev->name, IFNAMSIZ)) {
-                       ret = -EEXIST;
-                       goto out;
+       if (dev->name[0]) {
+               head = dev_name_hash(dev->name);
+               hlist_for_each(p, head) {
+                       struct net_device *d
+                               = hlist_entry(p, struct net_device, name_hlist);
+                       if (!strncmp(d->name, dev->name, IFNAMSIZ)) {
+                               ret = -EEXIST;
+                               goto out;
+                       }
                }
-       }
+       } else
+               head = NULL;
 
        /* Fix illegal SG+CSUM combinations. */
        if ((dev->features & NETIF_F_SG) &&
@@ -2945,14 +2948,14 @@ #endif
        if (dev->features & NETIF_F_UFO) {
                if (!(dev->features & NETIF_F_HW_CSUM)) {
                        printk(KERN_ERR "%s: Dropping NETIF_F_UFO since no "
-                                       "NETIF_F_HW_CSUM feature.\n",
-                                                       dev->name);
+                              "NETIF_F_HW_CSUM feature.\n",
+                              dev->name);
                        dev->features &= ~NETIF_F_UFO;
                }
                if (!(dev->features & NETIF_F_SG)) {
                        printk(KERN_ERR "%s: Dropping NETIF_F_UFO since no "
-                                       "NETIF_F_SG feature.\n",
-                                       dev->name);
+                              "NETIF_F_SG feature.\n",
+                              dev->name);
                        dev->features &= ~NETIF_F_UFO;
                }
        }
@@ -2965,8 +2968,7 @@ #endif
        if (!dev->rebuild_header)
                dev->rebuild_header = default_rebuild_header;
 
-       ret = netdev_register_sysfs(dev);
-       if (ret)
+       if (head && (ret = netdev_register_sysfs(dev)))
                goto out;
        dev->reg_state = NETREG_REGISTERED;
 
@@ -2982,7 +2984,12 @@ #endif
        write_lock_bh(&dev_base_lock);
        *dev_tail = dev;
        dev_tail = &dev->next;
-       hlist_add_head(&dev->name_hlist, head);
+
+       if (head) 
+               hlist_add_head(&dev->name_hlist, head);
+       else
+               INIT_HLIST_NODE(&dev->name_hlist);
+               
        hlist_add_head(&dev->index_hlist, dev_index_hash(dev->ifindex));
        dev_hold(dev);
        write_unlock_bh(&dev_base_lock);
@@ -3013,8 +3020,10 @@ int register_netdev(struct net_device *d
 {
        int err;
 
-       rtnl_lock();
+       if (!dev->name[0])
+               return -EINVAL;
 
+       rtnl_lock();
        /*
         * If the name is a format string the caller wants us to do a
         * name allocation.
@@ -3271,7 +3280,8 @@ int unregister_netdevice(struct net_devi
        for (dp = &dev_base; (d = *dp) != NULL; dp = &d->next) {
                if (d == dev) {
                        write_lock_bh(&dev_base_lock);
-                       hlist_del(&dev->name_hlist);
+                       if (!hlist_unhashed(&dev->name_hlist))
+                               hlist_del(&dev->name_hlist);
                        hlist_del(&dev->index_hlist);
                        if (dev_tail == &dev->next)
                                dev_tail = dp;
-- 
1.4.1

-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to