xen-netfront: Use static attribute groups for sysfs entries
authorTakashi Iwai <tiwai@suse.de>
Wed, 4 Feb 2015 13:38:55 +0000 (14:38 +0100)
committerDavid S. Miller <davem@davemloft.net>
Thu, 5 Feb 2015 08:31:12 +0000 (00:31 -0800)
Instead of manual calls of device_create_file() and
device_remove_files(), assign the static attribute groups to netdev
groups array.  This simplifies the code and avoids the possible
races.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
Acked-by: David Vrabel <david.vrabel@citrix.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/xen-netfront.c

index 7cfa6c027c0c2a6247243db2ffce474c70d6f8ac..e9b960f0ff32c8af2ff404a138780ff751bf4572 100644 (file)
@@ -219,11 +219,7 @@ static grant_ref_t xennet_get_rx_ref(struct netfront_queue *queue,
 }
 
 #ifdef CONFIG_SYSFS
-static int xennet_sysfs_addif(struct net_device *netdev);
-static void xennet_sysfs_delif(struct net_device *netdev);
-#else /* !CONFIG_SYSFS */
-#define xennet_sysfs_addif(dev) (0)
-#define xennet_sysfs_delif(dev) do { } while (0)
+static const struct attribute_group xennet_dev_group;
 #endif
 
 static bool xennet_can_sg(struct net_device *dev)
@@ -1317,20 +1313,15 @@ static int netfront_probe(struct xenbus_device *dev,
 
        info = netdev_priv(netdev);
        dev_set_drvdata(&dev->dev, info);
-
+#ifdef CONFIG_SYSFS
+       info->netdev->sysfs_groups[0] = &xennet_dev_group;
+#endif
        err = register_netdev(info->netdev);
        if (err) {
                pr_warn("%s: register_netdev err=%d\n", __func__, err);
                goto fail;
        }
 
-       err = xennet_sysfs_addif(info->netdev);
-       if (err) {
-               unregister_netdev(info->netdev);
-               pr_warn("%s: add sysfs failed err=%d\n", __func__, err);
-               goto fail;
-       }
-
        return 0;
 
  fail:
@@ -2094,39 +2085,20 @@ static ssize_t store_rxbuf(struct device *dev,
        return len;
 }
 
-static struct device_attribute xennet_attrs[] = {
-       __ATTR(rxbuf_min, S_IRUGO|S_IWUSR, show_rxbuf, store_rxbuf),
-       __ATTR(rxbuf_max, S_IRUGO|S_IWUSR, show_rxbuf, store_rxbuf),
-       __ATTR(rxbuf_cur, S_IRUGO, show_rxbuf, NULL),
-};
+static DEVICE_ATTR(rxbuf_min, S_IRUGO|S_IWUSR, show_rxbuf, store_rxbuf);
+static DEVICE_ATTR(rxbuf_max, S_IRUGO|S_IWUSR, show_rxbuf, store_rxbuf);
+static DEVICE_ATTR(rxbuf_cur, S_IRUGO, show_rxbuf, NULL);
 
-static int xennet_sysfs_addif(struct net_device *netdev)
-{
-       int i;
-       int err;
-
-       for (i = 0; i < ARRAY_SIZE(xennet_attrs); i++) {
-               err = device_create_file(&netdev->dev,
-                                          &xennet_attrs[i]);
-               if (err)
-                       goto fail;
-       }
-       return 0;
-
- fail:
-       while (--i >= 0)
-               device_remove_file(&netdev->dev, &xennet_attrs[i]);
-       return err;
-}
-
-static void xennet_sysfs_delif(struct net_device *netdev)
-{
-       int i;
-
-       for (i = 0; i < ARRAY_SIZE(xennet_attrs); i++)
-               device_remove_file(&netdev->dev, &xennet_attrs[i]);
-}
+static struct attribute *xennet_dev_attrs[] = {
+       &dev_attr_rxbuf_min.attr,
+       &dev_attr_rxbuf_max.attr,
+       &dev_attr_rxbuf_cur.attr,
+       NULL
+};
 
+static const struct attribute_group xennet_dev_group = {
+       .attrs = xennet_dev_attrs
+};
 #endif /* CONFIG_SYSFS */
 
 static int xennet_remove(struct xenbus_device *dev)
@@ -2140,8 +2112,6 @@ static int xennet_remove(struct xenbus_device *dev)
 
        xennet_disconnect_backend(info);
 
-       xennet_sysfs_delif(info->netdev);
-
        unregister_netdev(info->netdev);
 
        for (i = 0; i < num_queues; ++i) {