| From: Takashi Iwai <tiwai@suse.de> |
| Date: Wed, 4 Feb 2015 14:38:55 +0100 |
| Subject: xen-netfront: Use static attribute groups for sysfs entries |
| |
| commit 27b917e54bed7156c2b0249969ace34a5f585626 upstream. |
| |
| 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> |
| [bwh: Backported to 3.16: adjust context] |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| drivers/net/xen-netfront.c | 62 ++++++++++---------------------------- |
| 1 file changed, 16 insertions(+), 46 deletions(-) |
| |
| --- a/drivers/net/xen-netfront.c |
| +++ b/drivers/net/xen-netfront.c |
| @@ -228,11 +228,7 @@ static grant_ref_t xennet_get_rx_ref(str |
| } |
| |
| #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) |
| @@ -1399,20 +1395,15 @@ static int netfront_probe(struct xenbus_ |
| |
| 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: |
| @@ -2278,39 +2269,20 @@ static ssize_t show_rxbuf_cur(struct dev |
| return sprintf(buf, "0\n"); |
| } |
| |
| -static struct device_attribute xennet_attrs[] = { |
| - __ATTR(rxbuf_min, S_IRUGO|S_IWUSR, show_rxbuf_min, store_rxbuf_min), |
| - __ATTR(rxbuf_max, S_IRUGO|S_IWUSR, show_rxbuf_max, store_rxbuf_max), |
| - __ATTR(rxbuf_cur, S_IRUGO, show_rxbuf_cur, NULL), |
| +static DEVICE_ATTR(rxbuf_min, S_IRUGO|S_IWUSR, show_rxbuf_min, store_rxbuf_min); |
| +static DEVICE_ATTR(rxbuf_max, S_IRUGO|S_IWUSR, show_rxbuf_max, store_rxbuf_max); |
| +static DEVICE_ATTR(rxbuf_cur, S_IRUGO, show_rxbuf_cur, NULL); |
| + |
| +static struct attribute *xennet_dev_attrs[] = { |
| + &dev_attr_rxbuf_min.attr, |
| + &dev_attr_rxbuf_max.attr, |
| + &dev_attr_rxbuf_cur.attr, |
| + 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 const struct attribute_group xennet_dev_group = { |
| + .attrs = xennet_dev_attrs |
| +}; |
| #endif /* CONFIG_SYSFS */ |
| |
| static const struct xenbus_device_id netfront_ids[] = { |
| @@ -2328,8 +2300,6 @@ static int xennet_remove(struct xenbus_d |
| |
| xennet_disconnect_backend(info); |
| |
| - xennet_sysfs_delif(info->netdev); |
| - |
| unregister_netdev(info->netdev); |
| |
| if (num_queues) { |