|
@@ -1565,6 +1565,17 @@ static DEVICE_ATTR(tun_flags, 0444, tun_show_flags, NULL);
|
|
static DEVICE_ATTR(owner, 0444, tun_show_owner, NULL);
|
|
static DEVICE_ATTR(owner, 0444, tun_show_owner, NULL);
|
|
static DEVICE_ATTR(group, 0444, tun_show_group, NULL);
|
|
static DEVICE_ATTR(group, 0444, tun_show_group, NULL);
|
|
|
|
|
|
|
|
+static struct attribute *tun_dev_attrs[] = {
|
|
|
|
+ &dev_attr_tun_flags.attr,
|
|
|
|
+ &dev_attr_owner.attr,
|
|
|
|
+ &dev_attr_group.attr,
|
|
|
|
+ NULL
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static const struct attribute_group tun_attr_group = {
|
|
|
|
+ .attrs = tun_dev_attrs
|
|
|
|
+};
|
|
|
|
+
|
|
static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr)
|
|
static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr)
|
|
{
|
|
{
|
|
struct tun_struct *tun;
|
|
struct tun_struct *tun;
|
|
@@ -1645,6 +1656,7 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr)
|
|
dev_net_set(dev, net);
|
|
dev_net_set(dev, net);
|
|
dev->rtnl_link_ops = &tun_link_ops;
|
|
dev->rtnl_link_ops = &tun_link_ops;
|
|
dev->ifindex = tfile->ifindex;
|
|
dev->ifindex = tfile->ifindex;
|
|
|
|
+ dev->sysfs_groups[0] = &tun_attr_group;
|
|
|
|
|
|
tun = netdev_priv(dev);
|
|
tun = netdev_priv(dev);
|
|
tun->dev = dev;
|
|
tun->dev = dev;
|
|
@@ -1680,11 +1692,6 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr)
|
|
err = register_netdevice(tun->dev);
|
|
err = register_netdevice(tun->dev);
|
|
if (err < 0)
|
|
if (err < 0)
|
|
goto err_detach;
|
|
goto err_detach;
|
|
-
|
|
|
|
- if (device_create_file(&tun->dev->dev, &dev_attr_tun_flags) ||
|
|
|
|
- device_create_file(&tun->dev->dev, &dev_attr_owner) ||
|
|
|
|
- device_create_file(&tun->dev->dev, &dev_attr_group))
|
|
|
|
- pr_err("Failed to create tun sysfs files\n");
|
|
|
|
}
|
|
}
|
|
|
|
|
|
netif_carrier_on(tun->dev);
|
|
netif_carrier_on(tun->dev);
|