netiucv: cleanup attribute usage
authorfrank.blaschka@de.ibm.com <frank.blaschka@de.ibm.com>
Tue, 24 Jul 2012 22:34:28 +0000 (22:34 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 25 Jul 2012 22:24:13 +0000 (15:24 -0700)
Let the driver core handle device attribute creation and removal. This
will simplify the code and eliminates races between attribute
availability and userspace notification via uevents.

Signed-off-by: Sebastian Ott <sebott@linux.vnet.ibm.com>
Signed-off-by: Frank Blaschka <frank.blaschka@de.ibm.com>
Acked-by: Ursula Braun <ursula.braun@de.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/s390/net/netiucv.c

index 8160591913f95bd7555ac70129bbd06ef9ea0b60..4ffa66c87ea509ebd914938364fb16eb205fde7b 100644 (file)
@@ -1854,26 +1854,11 @@ static struct attribute_group netiucv_stat_attr_group = {
        .attrs = netiucv_stat_attrs,
 };
 
-static int netiucv_add_files(struct device *dev)
-{
-       int ret;
-
-       IUCV_DBF_TEXT(trace, 3, __func__);
-       ret = sysfs_create_group(&dev->kobj, &netiucv_attr_group);
-       if (ret)
-               return ret;
-       ret = sysfs_create_group(&dev->kobj, &netiucv_stat_attr_group);
-       if (ret)
-               sysfs_remove_group(&dev->kobj, &netiucv_attr_group);
-       return ret;
-}
-
-static void netiucv_remove_files(struct device *dev)
-{
-       IUCV_DBF_TEXT(trace, 3, __func__);
-       sysfs_remove_group(&dev->kobj, &netiucv_stat_attr_group);
-       sysfs_remove_group(&dev->kobj, &netiucv_attr_group);
-}
+static const struct attribute_group *netiucv_attr_groups[] = {
+       &netiucv_stat_attr_group,
+       &netiucv_attr_group,
+       NULL,
+};
 
 static int netiucv_register_device(struct net_device *ndev)
 {
@@ -1887,6 +1872,7 @@ static int netiucv_register_device(struct net_device *ndev)
                dev_set_name(dev, "net%s", ndev->name);
                dev->bus = &iucv_bus;
                dev->parent = iucv_root;
+               dev->groups = netiucv_attr_groups;
                /*
                 * The release function could be called after the
                 * module has been unloaded. It's _only_ task is to
@@ -1904,22 +1890,14 @@ static int netiucv_register_device(struct net_device *ndev)
                put_device(dev);
                return ret;
        }
-       ret = netiucv_add_files(dev);
-       if (ret)
-               goto out_unreg;
        priv->dev = dev;
        dev_set_drvdata(dev, priv);
        return 0;
-
-out_unreg:
-       device_unregister(dev);
-       return ret;
 }
 
 static void netiucv_unregister_device(struct device *dev)
 {
        IUCV_DBF_TEXT(trace, 3, __func__);
-       netiucv_remove_files(dev);
        device_unregister(dev);
 }