+ netdev-create-attribute_groups-with-class_device_add.patch added to -mm tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



The patch titled

     netdev: create attribute_groups with class_device_add

has been added to the -mm tree.  Its filename is

     netdev-create-attribute_groups-with-class_device_add.patch

See http://www.zip.com.au/~akpm/linux/patches/stuff/added-to-mm.txt to find
out what to do about this


From: Stephen Hemminger <shemminger@xxxxxxxx>

Atomically create attributes when class device is added.  This avoids the
race between registering class_device (which generates hotplug event), and
the creation of attribute groups.

Signed-off-by: Stephen Hemminger <shemminger@xxxxxxxx>
Signed-off-by: Andrew Morton <akpm@xxxxxxxx>
---

 include/linux/netdevice.h |    2 +
 net/core/dev.c            |    2 -
 net/core/net-sysfs.c      |   49 ++++++++----------------------------
 3 files changed, 15 insertions(+), 38 deletions(-)

diff -puN include/linux/netdevice.h~netdev-create-attribute_groups-with-class_device_add include/linux/netdevice.h
--- devel/include/linux/netdevice.h~netdev-create-attribute_groups-with-class_device_add	2006-04-22 00:45:52.000000000 -0700
+++ devel-akpm/include/linux/netdevice.h	2006-04-22 00:45:52.000000000 -0700
@@ -506,6 +506,8 @@ struct net_device
 
 	/* class/net/name entry */
 	struct class_device	class_dev;
+	/* space for optional statistics and wireless sysfs groups */
+	struct attribute_group  *sysfs_groups[3];
 };
 
 #define	NETDEV_ALIGN		32
diff -puN net/core/dev.c~netdev-create-attribute_groups-with-class_device_add net/core/dev.c
--- devel/net/core/dev.c~netdev-create-attribute_groups-with-class_device_add	2006-04-22 00:45:52.000000000 -0700
+++ devel-akpm/net/core/dev.c	2006-04-22 00:45:52.000000000 -0700
@@ -3043,11 +3043,11 @@ void netdev_run_todo(void)
 
 		switch(dev->reg_state) {
 		case NETREG_REGISTERING:
-			dev->reg_state = NETREG_REGISTERED;
 			err = netdev_register_sysfs(dev);
 			if (err)
 				printk(KERN_ERR "%s: failed sysfs registration (%d)\n",
 				       dev->name, err);
+			dev->reg_state = NETREG_REGISTERED;
 			break;
 
 		case NETREG_UNREGISTERING:
diff -puN net/core/net-sysfs.c~netdev-create-attribute_groups-with-class_device_add net/core/net-sysfs.c
--- devel/net/core/net-sysfs.c~netdev-create-attribute_groups-with-class_device_add	2006-04-22 00:45:52.000000000 -0700
+++ devel-akpm/net/core/net-sysfs.c	2006-04-22 00:45:52.000000000 -0700
@@ -29,7 +29,7 @@ static const char fmt_ulong[] = "%lu\n";
 
 static inline int dev_isalive(const struct net_device *dev) 
 {
-	return dev->reg_state == NETREG_REGISTERED;
+	return dev->reg_state <= NETREG_REGISTERED;
 }
 
 /* use same locking rules as GIF* ioctl's */
@@ -445,58 +445,33 @@ static struct class net_class = {
 
 void netdev_unregister_sysfs(struct net_device * net)
 {
-	struct class_device * class_dev = &(net->class_dev);
-
-	if (net->get_stats)
-		sysfs_remove_group(&class_dev->kobj, &netstat_group);
-
-#ifdef WIRELESS_EXT
-	if (net->get_wireless_stats || (net->wireless_handlers &&
-			net->wireless_handlers->get_wireless_stats))
-		sysfs_remove_group(&class_dev->kobj, &wireless_group);
-#endif
-	class_device_del(class_dev);
-
+	class_device_del(&(net->class_dev));
 }
 
 /* Create sysfs entries for network device. */
 int netdev_register_sysfs(struct net_device *net)
 {
 	struct class_device *class_dev = &(net->class_dev);
-	int ret;
+	struct attribute_group **groups = net->sysfs_groups;
 
+	class_device_initialize(class_dev);
 	class_dev->class = &net_class;
 	class_dev->class_data = net;
+	class_dev->groups = groups;
 
+	BUILD_BUG_ON(BUS_ID_SIZE < IFNAMSIZ);
 	strlcpy(class_dev->class_id, net->name, BUS_ID_SIZE);
-	if ((ret = class_device_register(class_dev)))
-		goto out;
 
-	if (net->get_stats &&
-	    (ret = sysfs_create_group(&class_dev->kobj, &netstat_group)))
-		goto out_unreg; 
+	if (net->get_stats)
+		*groups++ = &netstat_group;
 
 #ifdef WIRELESS_EXT
-	if (net->get_wireless_stats || (net->wireless_handlers &&
-			net->wireless_handlers->get_wireless_stats)) {
-		ret = sysfs_create_group(&class_dev->kobj, &wireless_group);
-		if (ret)
-			goto out_cleanup;
-	}
-	return 0;
-out_cleanup:
-	if (net->get_stats)
-		sysfs_remove_group(&class_dev->kobj, &netstat_group);
-#else
-	return 0;
+	if (net->get_wireless_stats
+	    || (net->wireless_handlers && net->wireless_handlers->get_wireless_stats))
+		*groups++ = &wireless_group;
 #endif
 
-out_unreg:
-	printk(KERN_WARNING "%s: sysfs attribute registration failed %d\n",
-	       net->name, ret);
-	class_device_unregister(class_dev);
-out:
-	return ret;
+	return class_device_add(class_dev);
 }
 
 int netdev_sysfs_init(void)
_

Patches currently in -mm which might be from shemminger@xxxxxxxx are

class-device-add-attribute_group-creation.patch
netdev-create-attribute_groups-with-class_device_add.patch

-
To unsubscribe from this list: send the line "unsubscribe mm-commits" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Kernel Newbies FAQ]     [Kernel Archive]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [Bugtraq]     [Photo]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]

  Powered by Linux