summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPetr Machata <petrm@mellanox.com>2018-12-06 12:05:42 -0500
committerDavid S. Miller <davem@davemloft.net>2018-12-06 16:26:07 -0500
commit567c5e13be5cc74d24f5eb54cf353c2e2277189b (patch)
treecefe2e937441614164f9a471a921c94801fe8c60
parentcf7686a01266de84b3b825acc05026d4e55454e1 (diff)
net: core: dev: Add extack argument to dev_change_flags()
In order to pass extack together with NETDEV_PRE_UP notifications, it's necessary to route the extack to __dev_open() from diverse (possibly indirect) callers. One prominent API through which the notification is invoked is dev_change_flags(). Therefore extend dev_change_flags() with and extra extack argument and update all users. Most of the calls end up just encoding NULL, but several sites (VLAN, ipvlan, VRF, rtnetlink) do have extack available. Since the function declaration line is changed anyway, name the other function arguments to placate checkpatch. Signed-off-by: Petr Machata <petrm@mellanox.com> Acked-by: Jiri Pirko <jiri@mellanox.com> Reviewed-by: Ido Schimmel <idosch@mellanox.com> Reviewed-by: David Ahern <dsahern@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/infiniband/ulp/ipoib/ipoib_main.c6
-rw-r--r--drivers/net/hyperv/netvsc_drv.c2
-rw-r--r--drivers/net/ipvlan/ipvlan_main.c12
-rw-r--r--drivers/net/vrf.c4
-rw-r--r--include/linux/netdevice.h3
-rw-r--r--net/8021q/vlan.c4
-rw-r--r--net/core/dev.c4
-rw-r--r--net/core/dev_ioctl.c2
-rw-r--r--net/core/net-sysfs.c2
-rw-r--r--net/core/rtnetlink.c3
-rw-r--r--net/ipv4/devinet.c2
-rw-r--r--net/ipv4/ipconfig.c6
-rw-r--r--net/openvswitch/vport-geneve.c2
-rw-r--r--net/openvswitch/vport-gre.c2
-rw-r--r--net/openvswitch/vport-vxlan.c2
15 files changed, 33 insertions, 23 deletions
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c
index 8710214594d8..6214d8c0d546 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_main.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c
@@ -167,7 +167,7 @@ int ipoib_open(struct net_device *dev)
167 if (flags & IFF_UP) 167 if (flags & IFF_UP)
168 continue; 168 continue;
169 169
170 dev_change_flags(cpriv->dev, flags | IFF_UP); 170 dev_change_flags(cpriv->dev, flags | IFF_UP, NULL);
171 } 171 }
172 up_read(&priv->vlan_rwsem); 172 up_read(&priv->vlan_rwsem);
173 } 173 }
@@ -207,7 +207,7 @@ static int ipoib_stop(struct net_device *dev)
207 if (!(flags & IFF_UP)) 207 if (!(flags & IFF_UP))
208 continue; 208 continue;
209 209
210 dev_change_flags(cpriv->dev, flags & ~IFF_UP); 210 dev_change_flags(cpriv->dev, flags & ~IFF_UP, NULL);
211 } 211 }
212 up_read(&priv->vlan_rwsem); 212 up_read(&priv->vlan_rwsem);
213 } 213 }
@@ -1823,7 +1823,7 @@ static void ipoib_parent_unregister_pre(struct net_device *ndev)
1823 * running ensures the it will not add more work. 1823 * running ensures the it will not add more work.
1824 */ 1824 */
1825 rtnl_lock(); 1825 rtnl_lock();
1826 dev_change_flags(priv->dev, priv->dev->flags & ~IFF_UP); 1826 dev_change_flags(priv->dev, priv->dev->flags & ~IFF_UP, NULL);
1827 rtnl_unlock(); 1827 rtnl_unlock();
1828 1828
1829 /* ipoib_event() cannot be running once this returns */ 1829 /* ipoib_event() cannot be running once this returns */
diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c
index c65620adab52..18b5584d6377 100644
--- a/drivers/net/hyperv/netvsc_drv.c
+++ b/drivers/net/hyperv/netvsc_drv.c
@@ -1993,7 +1993,7 @@ static void __netvsc_vf_setup(struct net_device *ndev,
1993 "unable to change mtu to %u\n", ndev->mtu); 1993 "unable to change mtu to %u\n", ndev->mtu);
1994 1994
1995 /* set multicast etc flags on VF */ 1995 /* set multicast etc flags on VF */
1996 dev_change_flags(vf_netdev, ndev->flags | IFF_SLAVE); 1996 dev_change_flags(vf_netdev, ndev->flags | IFF_SLAVE, NULL);
1997 1997
1998 /* sync address list from ndev to VF */ 1998 /* sync address list from ndev to VF */
1999 netif_addr_lock_bh(ndev); 1999 netif_addr_lock_bh(ndev);
diff --git a/drivers/net/ipvlan/ipvlan_main.c b/drivers/net/ipvlan/ipvlan_main.c
index 14f1cbd3b96f..c3d3e458f541 100644
--- a/drivers/net/ipvlan/ipvlan_main.c
+++ b/drivers/net/ipvlan/ipvlan_main.c
@@ -85,10 +85,12 @@ static int ipvlan_set_port_mode(struct ipvl_port *port, u16 nval,
85 flags = ipvlan->dev->flags; 85 flags = ipvlan->dev->flags;
86 if (nval == IPVLAN_MODE_L3 || nval == IPVLAN_MODE_L3S) { 86 if (nval == IPVLAN_MODE_L3 || nval == IPVLAN_MODE_L3S) {
87 err = dev_change_flags(ipvlan->dev, 87 err = dev_change_flags(ipvlan->dev,
88 flags | IFF_NOARP); 88 flags | IFF_NOARP,
89 extack);
89 } else { 90 } else {
90 err = dev_change_flags(ipvlan->dev, 91 err = dev_change_flags(ipvlan->dev,
91 flags & ~IFF_NOARP); 92 flags & ~IFF_NOARP,
93 extack);
92 } 94 }
93 if (unlikely(err)) 95 if (unlikely(err))
94 goto fail; 96 goto fail;
@@ -117,9 +119,11 @@ fail:
117 flags = ipvlan->dev->flags; 119 flags = ipvlan->dev->flags;
118 if (port->mode == IPVLAN_MODE_L3 || 120 if (port->mode == IPVLAN_MODE_L3 ||
119 port->mode == IPVLAN_MODE_L3S) 121 port->mode == IPVLAN_MODE_L3S)
120 dev_change_flags(ipvlan->dev, flags | IFF_NOARP); 122 dev_change_flags(ipvlan->dev, flags | IFF_NOARP,
123 NULL);
121 else 124 else
122 dev_change_flags(ipvlan->dev, flags & ~IFF_NOARP); 125 dev_change_flags(ipvlan->dev, flags & ~IFF_NOARP,
126 NULL);
123 } 127 }
124 128
125 return err; 129 return err;
diff --git a/drivers/net/vrf.c b/drivers/net/vrf.c
index 1e9f2dc0de07..95909e262ba4 100644
--- a/drivers/net/vrf.c
+++ b/drivers/net/vrf.c
@@ -756,9 +756,9 @@ static void cycle_netdev(struct net_device *dev,
756 if (!netif_running(dev)) 756 if (!netif_running(dev))
757 return; 757 return;
758 758
759 ret = dev_change_flags(dev, flags & ~IFF_UP); 759 ret = dev_change_flags(dev, flags & ~IFF_UP, extack);
760 if (ret >= 0) 760 if (ret >= 0)
761 ret = dev_change_flags(dev, flags); 761 ret = dev_change_flags(dev, flags, extack);
762 762
763 if (ret < 0) { 763 if (ret < 0) {
764 netdev_err(dev, 764 netdev_err(dev,
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index d79be3055f5f..18cf464450ee 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -3612,7 +3612,8 @@ int dev_ifconf(struct net *net, struct ifconf *, int);
3612int dev_ethtool(struct net *net, struct ifreq *); 3612int dev_ethtool(struct net *net, struct ifreq *);
3613unsigned int dev_get_flags(const struct net_device *); 3613unsigned int dev_get_flags(const struct net_device *);
3614int __dev_change_flags(struct net_device *, unsigned int flags); 3614int __dev_change_flags(struct net_device *, unsigned int flags);
3615int dev_change_flags(struct net_device *, unsigned int); 3615int dev_change_flags(struct net_device *dev, unsigned int flags,
3616 struct netlink_ext_ack *extack);
3616void __dev_notify_flags(struct net_device *, unsigned int old_flags, 3617void __dev_notify_flags(struct net_device *, unsigned int old_flags,
3617 unsigned int gchanges); 3618 unsigned int gchanges);
3618int dev_change_name(struct net_device *, const char *); 3619int dev_change_name(struct net_device *, const char *);
diff --git a/net/8021q/vlan.c b/net/8021q/vlan.c
index aef1a977279c..dc4411165e43 100644
--- a/net/8021q/vlan.c
+++ b/net/8021q/vlan.c
@@ -358,6 +358,7 @@ static int __vlan_device_event(struct net_device *dev, unsigned long event)
358static int vlan_device_event(struct notifier_block *unused, unsigned long event, 358static int vlan_device_event(struct notifier_block *unused, unsigned long event,
359 void *ptr) 359 void *ptr)
360{ 360{
361 struct netlink_ext_ack *extack = netdev_notifier_info_to_extack(ptr);
361 struct net_device *dev = netdev_notifier_info_to_dev(ptr); 362 struct net_device *dev = netdev_notifier_info_to_dev(ptr);
362 struct vlan_group *grp; 363 struct vlan_group *grp;
363 struct vlan_info *vlan_info; 364 struct vlan_info *vlan_info;
@@ -460,7 +461,8 @@ static int vlan_device_event(struct notifier_block *unused, unsigned long event,
460 461
461 vlan = vlan_dev_priv(vlandev); 462 vlan = vlan_dev_priv(vlandev);
462 if (!(vlan->flags & VLAN_FLAG_LOOSE_BINDING)) 463 if (!(vlan->flags & VLAN_FLAG_LOOSE_BINDING))
463 dev_change_flags(vlandev, flgs | IFF_UP); 464 dev_change_flags(vlandev, flgs | IFF_UP,
465 extack);
464 netif_stacked_transfer_operstate(dev, vlandev); 466 netif_stacked_transfer_operstate(dev, vlandev);
465 } 467 }
466 break; 468 break;
diff --git a/net/core/dev.c b/net/core/dev.c
index b801c1aafd70..8bba6f98b545 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -7595,11 +7595,13 @@ void __dev_notify_flags(struct net_device *dev, unsigned int old_flags,
7595 * dev_change_flags - change device settings 7595 * dev_change_flags - change device settings
7596 * @dev: device 7596 * @dev: device
7597 * @flags: device state flags 7597 * @flags: device state flags
7598 * @extack: netlink extended ack
7598 * 7599 *
7599 * Change settings on device based state flags. The flags are 7600 * Change settings on device based state flags. The flags are
7600 * in the userspace exported format. 7601 * in the userspace exported format.
7601 */ 7602 */
7602int dev_change_flags(struct net_device *dev, unsigned int flags) 7603int dev_change_flags(struct net_device *dev, unsigned int flags,
7604 struct netlink_ext_ack *extack)
7603{ 7605{
7604 int ret; 7606 int ret;
7605 unsigned int changes, old_flags = dev->flags, old_gflags = dev->gflags; 7607 unsigned int changes, old_flags = dev->flags, old_gflags = dev->gflags;
diff --git a/net/core/dev_ioctl.c b/net/core/dev_ioctl.c
index 90e8aa36881e..da273ec3cc57 100644
--- a/net/core/dev_ioctl.c
+++ b/net/core/dev_ioctl.c
@@ -234,7 +234,7 @@ static int dev_ifsioc(struct net *net, struct ifreq *ifr, unsigned int cmd)
234 234
235 switch (cmd) { 235 switch (cmd) {
236 case SIOCSIFFLAGS: /* Set interface flags */ 236 case SIOCSIFFLAGS: /* Set interface flags */
237 return dev_change_flags(dev, ifr->ifr_flags); 237 return dev_change_flags(dev, ifr->ifr_flags, NULL);
238 238
239 case SIOCSIFMETRIC: /* Set the metric on the interface 239 case SIOCSIFMETRIC: /* Set the metric on the interface
240 (currently unused) */ 240 (currently unused) */
diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c
index bd67c4d0fcfd..ff9fd2bb4ce4 100644
--- a/net/core/net-sysfs.c
+++ b/net/core/net-sysfs.c
@@ -337,7 +337,7 @@ NETDEVICE_SHOW_RW(mtu, fmt_dec);
337 337
338static int change_flags(struct net_device *dev, unsigned long new_flags) 338static int change_flags(struct net_device *dev, unsigned long new_flags)
339{ 339{
340 return dev_change_flags(dev, (unsigned int)new_flags); 340 return dev_change_flags(dev, (unsigned int)new_flags, NULL);
341} 341}
342 342
343static ssize_t flags_store(struct device *dev, struct device_attribute *attr, 343static ssize_t flags_store(struct device *dev, struct device_attribute *attr,
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
index 98876cd1e36c..4c9e4e187600 100644
--- a/net/core/rtnetlink.c
+++ b/net/core/rtnetlink.c
@@ -2489,7 +2489,8 @@ static int do_setlink(const struct sk_buff *skb,
2489 } 2489 }
2490 2490
2491 if (ifm->ifi_flags || ifm->ifi_change) { 2491 if (ifm->ifi_flags || ifm->ifi_change) {
2492 err = dev_change_flags(dev, rtnl_dev_combine_flags(dev, ifm)); 2492 err = dev_change_flags(dev, rtnl_dev_combine_flags(dev, ifm),
2493 extack);
2493 if (err < 0) 2494 if (err < 0)
2494 goto errout; 2495 goto errout;
2495 } 2496 }
diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c
index a34602ae27de..5b9b6d497f71 100644
--- a/net/ipv4/devinet.c
+++ b/net/ipv4/devinet.c
@@ -1100,7 +1100,7 @@ int devinet_ioctl(struct net *net, unsigned int cmd, struct ifreq *ifr)
1100 inet_del_ifa(in_dev, ifap, 1); 1100 inet_del_ifa(in_dev, ifap, 1);
1101 break; 1101 break;
1102 } 1102 }
1103 ret = dev_change_flags(dev, ifr->ifr_flags); 1103 ret = dev_change_flags(dev, ifr->ifr_flags, NULL);
1104 break; 1104 break;
1105 1105
1106 case SIOCSIFADDR: /* Set interface address (and family) */ 1106 case SIOCSIFADDR: /* Set interface address (and family) */
diff --git a/net/ipv4/ipconfig.c b/net/ipv4/ipconfig.c
index 88212615bf4c..55757764c381 100644
--- a/net/ipv4/ipconfig.c
+++ b/net/ipv4/ipconfig.c
@@ -220,7 +220,7 @@ static int __init ic_open_devs(void)
220 for_each_netdev(&init_net, dev) { 220 for_each_netdev(&init_net, dev) {
221 if (!(dev->flags & IFF_LOOPBACK) && !netdev_uses_dsa(dev)) 221 if (!(dev->flags & IFF_LOOPBACK) && !netdev_uses_dsa(dev))
222 continue; 222 continue;
223 if (dev_change_flags(dev, dev->flags | IFF_UP) < 0) 223 if (dev_change_flags(dev, dev->flags | IFF_UP, NULL) < 0)
224 pr_err("IP-Config: Failed to open %s\n", dev->name); 224 pr_err("IP-Config: Failed to open %s\n", dev->name);
225 } 225 }
226 226
@@ -238,7 +238,7 @@ static int __init ic_open_devs(void)
238 if (ic_proto_enabled && !able) 238 if (ic_proto_enabled && !able)
239 continue; 239 continue;
240 oflags = dev->flags; 240 oflags = dev->flags;
241 if (dev_change_flags(dev, oflags | IFF_UP) < 0) { 241 if (dev_change_flags(dev, oflags | IFF_UP, NULL) < 0) {
242 pr_err("IP-Config: Failed to open %s\n", 242 pr_err("IP-Config: Failed to open %s\n",
243 dev->name); 243 dev->name);
244 continue; 244 continue;
@@ -315,7 +315,7 @@ static void __init ic_close_devs(void)
315 dev = d->dev; 315 dev = d->dev;
316 if (d != ic_dev && !netdev_uses_dsa(dev)) { 316 if (d != ic_dev && !netdev_uses_dsa(dev)) {
317 pr_debug("IP-Config: Downing %s\n", dev->name); 317 pr_debug("IP-Config: Downing %s\n", dev->name);
318 dev_change_flags(dev, d->flags); 318 dev_change_flags(dev, d->flags, NULL);
319 } 319 }
320 kfree(d); 320 kfree(d);
321 } 321 }
diff --git a/net/openvswitch/vport-geneve.c b/net/openvswitch/vport-geneve.c
index 5aaf3babfc3f..acb6077b7478 100644
--- a/net/openvswitch/vport-geneve.c
+++ b/net/openvswitch/vport-geneve.c
@@ -93,7 +93,7 @@ static struct vport *geneve_tnl_create(const struct vport_parms *parms)
93 return ERR_CAST(dev); 93 return ERR_CAST(dev);
94 } 94 }
95 95
96 err = dev_change_flags(dev, dev->flags | IFF_UP); 96 err = dev_change_flags(dev, dev->flags | IFF_UP, NULL);
97 if (err < 0) { 97 if (err < 0) {
98 rtnl_delete_link(dev); 98 rtnl_delete_link(dev);
99 rtnl_unlock(); 99 rtnl_unlock();
diff --git a/net/openvswitch/vport-gre.c b/net/openvswitch/vport-gre.c
index 0e72d95b0e8f..c38a62464b85 100644
--- a/net/openvswitch/vport-gre.c
+++ b/net/openvswitch/vport-gre.c
@@ -68,7 +68,7 @@ static struct vport *gre_tnl_create(const struct vport_parms *parms)
68 return ERR_CAST(dev); 68 return ERR_CAST(dev);
69 } 69 }
70 70
71 err = dev_change_flags(dev, dev->flags | IFF_UP); 71 err = dev_change_flags(dev, dev->flags | IFF_UP, NULL);
72 if (err < 0) { 72 if (err < 0) {
73 rtnl_delete_link(dev); 73 rtnl_delete_link(dev);
74 rtnl_unlock(); 74 rtnl_unlock();
diff --git a/net/openvswitch/vport-vxlan.c b/net/openvswitch/vport-vxlan.c
index 7e6301b2ec4d..8f16f11f7ad3 100644
--- a/net/openvswitch/vport-vxlan.c
+++ b/net/openvswitch/vport-vxlan.c
@@ -131,7 +131,7 @@ static struct vport *vxlan_tnl_create(const struct vport_parms *parms)
131 return ERR_CAST(dev); 131 return ERR_CAST(dev);
132 } 132 }
133 133
134 err = dev_change_flags(dev, dev->flags | IFF_UP); 134 err = dev_change_flags(dev, dev->flags | IFF_UP, NULL);
135 if (err < 0) { 135 if (err < 0) {
136 rtnl_delete_link(dev); 136 rtnl_delete_link(dev);
137 rtnl_unlock(); 137 rtnl_unlock();