net: Add extack to upper device linking
Add extack arg to netdev_upper_dev_link and netdev_master_upper_dev_link Signed-off-by: David Ahern <dsahern@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
33eaf2a6eb
Коммит
42ab19ee90
|
@ -1217,14 +1217,15 @@ static enum netdev_lag_tx_type bond_lag_tx_type(struct bonding *bond)
|
|||
}
|
||||
}
|
||||
|
||||
static int bond_master_upper_dev_link(struct bonding *bond, struct slave *slave)
|
||||
static int bond_master_upper_dev_link(struct bonding *bond, struct slave *slave,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
struct netdev_lag_upper_info lag_upper_info;
|
||||
int err;
|
||||
|
||||
lag_upper_info.tx_type = bond_lag_tx_type(bond);
|
||||
err = netdev_master_upper_dev_link(slave->dev, bond->dev, slave,
|
||||
&lag_upper_info);
|
||||
&lag_upper_info, extack);
|
||||
if (err)
|
||||
return err;
|
||||
rtmsg_ifinfo(RTM_NEWLINK, slave->dev, IFF_SLAVE, GFP_KERNEL);
|
||||
|
@ -1710,7 +1711,7 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev,
|
|||
goto err_detach;
|
||||
}
|
||||
|
||||
res = bond_master_upper_dev_link(bond, new_slave);
|
||||
res = bond_master_upper_dev_link(bond, new_slave, extack);
|
||||
if (res) {
|
||||
netdev_dbg(bond_dev, "Error %d calling bond_master_upper_dev_link\n", res);
|
||||
goto err_unregister;
|
||||
|
|
|
@ -178,7 +178,7 @@ static int rmnet_newlink(struct net *src_net, struct net_device *dev,
|
|||
if (err)
|
||||
goto err1;
|
||||
|
||||
err = netdev_master_upper_dev_link(dev, real_dev, NULL, NULL);
|
||||
err = netdev_master_upper_dev_link(dev, real_dev, NULL, NULL, extack);
|
||||
if (err)
|
||||
goto err2;
|
||||
|
||||
|
|
|
@ -1748,7 +1748,7 @@ static int netvsc_vf_join(struct net_device *vf_netdev,
|
|||
goto rx_handler_failed;
|
||||
}
|
||||
|
||||
ret = netdev_upper_dev_link(vf_netdev, ndev);
|
||||
ret = netdev_upper_dev_link(vf_netdev, ndev, NULL);
|
||||
if (ret != 0) {
|
||||
netdev_err(vf_netdev,
|
||||
"can not set master device %s (err = %d)\n",
|
||||
|
|
|
@ -584,7 +584,7 @@ int ipvlan_link_new(struct net *src_net, struct net_device *dev,
|
|||
if (err < 0)
|
||||
goto remove_ida;
|
||||
|
||||
err = netdev_upper_dev_link(phy_dev, dev);
|
||||
err = netdev_upper_dev_link(phy_dev, dev, extack);
|
||||
if (err) {
|
||||
goto unregister_netdev;
|
||||
}
|
||||
|
|
|
@ -3244,7 +3244,7 @@ static int macsec_newlink(struct net *net, struct net_device *dev,
|
|||
&macsec_netdev_addr_lock_key,
|
||||
macsec_get_nest_level(dev));
|
||||
|
||||
err = netdev_upper_dev_link(real_dev, dev);
|
||||
err = netdev_upper_dev_link(real_dev, dev, extack);
|
||||
if (err < 0)
|
||||
goto unregister;
|
||||
|
||||
|
|
|
@ -1344,7 +1344,8 @@ static int macvlan_changelink_sources(struct macvlan_dev *vlan, u32 mode,
|
|||
}
|
||||
|
||||
int macvlan_common_newlink(struct net *src_net, struct net_device *dev,
|
||||
struct nlattr *tb[], struct nlattr *data[])
|
||||
struct nlattr *tb[], struct nlattr *data[],
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
struct macvlan_dev *vlan = netdev_priv(dev);
|
||||
struct macvlan_port *port;
|
||||
|
@ -1433,7 +1434,7 @@ int macvlan_common_newlink(struct net *src_net, struct net_device *dev,
|
|||
goto destroy_macvlan_port;
|
||||
|
||||
dev->priv_flags |= IFF_MACVLAN;
|
||||
err = netdev_upper_dev_link(lowerdev, dev);
|
||||
err = netdev_upper_dev_link(lowerdev, dev, extack);
|
||||
if (err)
|
||||
goto unregister_netdev;
|
||||
|
||||
|
@ -1456,7 +1457,7 @@ static int macvlan_newlink(struct net *src_net, struct net_device *dev,
|
|||
struct nlattr *tb[], struct nlattr *data[],
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
return macvlan_common_newlink(src_net, dev, tb, data);
|
||||
return macvlan_common_newlink(src_net, dev, tb, data, extack);
|
||||
}
|
||||
|
||||
void macvlan_dellink(struct net_device *dev, struct list_head *head)
|
||||
|
|
|
@ -105,7 +105,7 @@ static int macvtap_newlink(struct net *src_net, struct net_device *dev,
|
|||
/* Don't put anything that may fail after macvlan_common_newlink
|
||||
* because we can't undo what it does.
|
||||
*/
|
||||
err = macvlan_common_newlink(src_net, dev, tb, data);
|
||||
err = macvlan_common_newlink(src_net, dev, tb, data, extack);
|
||||
if (err) {
|
||||
netdev_rx_handler_unregister(dev);
|
||||
return err;
|
||||
|
|
|
@ -1112,7 +1112,7 @@ static int team_upper_dev_link(struct team *team, struct team_port *port)
|
|||
|
||||
lag_upper_info.tx_type = team->mode->lag_tx_type;
|
||||
err = netdev_master_upper_dev_link(port->dev, team->dev, NULL,
|
||||
&lag_upper_info);
|
||||
&lag_upper_info, NULL);
|
||||
if (err)
|
||||
return err;
|
||||
port->dev->priv_flags |= IFF_TEAM_PORT;
|
||||
|
|
|
@ -221,7 +221,7 @@ static int qmimux_register_device(struct net_device *real_dev, u8 mux_id)
|
|||
/* Account for reference in struct qmimux_priv_priv */
|
||||
dev_hold(real_dev);
|
||||
|
||||
err = netdev_upper_dev_link(real_dev, new_dev);
|
||||
err = netdev_upper_dev_link(real_dev, new_dev, NULL);
|
||||
if (err)
|
||||
goto out_unregister_netdev;
|
||||
|
||||
|
|
|
@ -764,7 +764,8 @@ static void cycle_netdev(struct net_device *dev)
|
|||
}
|
||||
}
|
||||
|
||||
static int do_vrf_add_slave(struct net_device *dev, struct net_device *port_dev)
|
||||
static int do_vrf_add_slave(struct net_device *dev, struct net_device *port_dev,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
int ret;
|
||||
|
||||
|
@ -775,7 +776,7 @@ static int do_vrf_add_slave(struct net_device *dev, struct net_device *port_dev)
|
|||
return -EOPNOTSUPP;
|
||||
|
||||
port_dev->priv_flags |= IFF_L3MDEV_SLAVE;
|
||||
ret = netdev_master_upper_dev_link(port_dev, dev, NULL, NULL);
|
||||
ret = netdev_master_upper_dev_link(port_dev, dev, NULL, NULL, extack);
|
||||
if (ret < 0)
|
||||
goto err;
|
||||
|
||||
|
@ -794,7 +795,7 @@ static int vrf_add_slave(struct net_device *dev, struct net_device *port_dev,
|
|||
if (netif_is_l3_master(port_dev) || netif_is_l3_slave(port_dev))
|
||||
return -EINVAL;
|
||||
|
||||
return do_vrf_add_slave(dev, port_dev);
|
||||
return do_vrf_add_slave(dev, port_dev, extack);
|
||||
}
|
||||
|
||||
/* inverse of do_vrf_add_slave */
|
||||
|
|
|
@ -72,7 +72,8 @@ static inline void macvlan_count_rx(const struct macvlan_dev *vlan,
|
|||
extern void macvlan_common_setup(struct net_device *dev);
|
||||
|
||||
extern int macvlan_common_newlink(struct net *src_net, struct net_device *dev,
|
||||
struct nlattr *tb[], struct nlattr *data[]);
|
||||
struct nlattr *tb[], struct nlattr *data[],
|
||||
struct netlink_ext_ack *extack);
|
||||
|
||||
extern void macvlan_count_rx(const struct macvlan_dev *vlan,
|
||||
unsigned int len, bool success,
|
||||
|
|
|
@ -3919,10 +3919,12 @@ void *netdev_adjacent_get_private(struct list_head *adj_list);
|
|||
void *netdev_lower_get_first_private_rcu(struct net_device *dev);
|
||||
struct net_device *netdev_master_upper_dev_get(struct net_device *dev);
|
||||
struct net_device *netdev_master_upper_dev_get_rcu(struct net_device *dev);
|
||||
int netdev_upper_dev_link(struct net_device *dev, struct net_device *upper_dev);
|
||||
int netdev_upper_dev_link(struct net_device *dev, struct net_device *upper_dev,
|
||||
struct netlink_ext_ack *extack);
|
||||
int netdev_master_upper_dev_link(struct net_device *dev,
|
||||
struct net_device *upper_dev,
|
||||
void *upper_priv, void *upper_info);
|
||||
void *upper_priv, void *upper_info,
|
||||
struct netlink_ext_ack *extack);
|
||||
void netdev_upper_dev_unlink(struct net_device *dev,
|
||||
struct net_device *upper_dev);
|
||||
void netdev_adjacent_rename_links(struct net_device *dev, char *oldname);
|
||||
|
|
|
@ -138,7 +138,7 @@ int vlan_check_real_dev(struct net_device *real_dev,
|
|||
return 0;
|
||||
}
|
||||
|
||||
int register_vlan_dev(struct net_device *dev)
|
||||
int register_vlan_dev(struct net_device *dev, struct netlink_ext_ack *extack)
|
||||
{
|
||||
struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
|
||||
struct net_device *real_dev = vlan->real_dev;
|
||||
|
@ -174,7 +174,7 @@ int register_vlan_dev(struct net_device *dev)
|
|||
if (err < 0)
|
||||
goto out_uninit_mvrp;
|
||||
|
||||
err = netdev_upper_dev_link(real_dev, dev);
|
||||
err = netdev_upper_dev_link(real_dev, dev, extack);
|
||||
if (err)
|
||||
goto out_unregister_netdev;
|
||||
|
||||
|
@ -270,7 +270,7 @@ static int register_vlan_device(struct net_device *real_dev, u16 vlan_id)
|
|||
vlan->flags = VLAN_FLAG_REORDER_HDR;
|
||||
|
||||
new_dev->rtnl_link_ops = &vlan_link_ops;
|
||||
err = register_vlan_dev(new_dev);
|
||||
err = register_vlan_dev(new_dev, NULL);
|
||||
if (err < 0)
|
||||
goto out_free_newdev;
|
||||
|
||||
|
|
|
@ -107,7 +107,7 @@ void vlan_dev_get_realdev_name(const struct net_device *dev, char *result);
|
|||
int vlan_check_real_dev(struct net_device *real_dev,
|
||||
__be16 protocol, u16 vlan_id);
|
||||
void vlan_setup(struct net_device *dev);
|
||||
int register_vlan_dev(struct net_device *dev);
|
||||
int register_vlan_dev(struct net_device *dev, struct netlink_ext_ack *extack);
|
||||
void unregister_vlan_dev(struct net_device *dev, struct list_head *head);
|
||||
bool vlan_dev_inherit_address(struct net_device *dev,
|
||||
struct net_device *real_dev);
|
||||
|
|
|
@ -160,7 +160,7 @@ static int vlan_newlink(struct net *src_net, struct net_device *dev,
|
|||
if (err < 0)
|
||||
return err;
|
||||
|
||||
return register_vlan_dev(dev);
|
||||
return register_vlan_dev(dev, extack);
|
||||
}
|
||||
|
||||
static inline size_t vlan_qos_map_size(unsigned int n)
|
||||
|
|
|
@ -738,7 +738,7 @@ int batadv_hardif_enable_interface(struct batadv_hard_iface *hard_iface,
|
|||
bat_priv = netdev_priv(hard_iface->soft_iface);
|
||||
|
||||
ret = netdev_master_upper_dev_link(hard_iface->net_dev,
|
||||
soft_iface, NULL, NULL);
|
||||
soft_iface, NULL, NULL, NULL);
|
||||
if (ret)
|
||||
goto err_dev;
|
||||
|
||||
|
|
|
@ -540,7 +540,7 @@ int br_add_if(struct net_bridge *br, struct net_device *dev)
|
|||
|
||||
dev->priv_flags |= IFF_BRIDGE_PORT;
|
||||
|
||||
err = netdev_master_upper_dev_link(dev, br->dev, NULL, NULL);
|
||||
err = netdev_master_upper_dev_link(dev, br->dev, NULL, NULL, NULL);
|
||||
if (err)
|
||||
goto err5;
|
||||
|
||||
|
|
|
@ -6277,11 +6277,13 @@ static void __netdev_adjacent_dev_unlink_neighbour(struct net_device *dev,
|
|||
|
||||
static int __netdev_upper_dev_link(struct net_device *dev,
|
||||
struct net_device *upper_dev, bool master,
|
||||
void *upper_priv, void *upper_info)
|
||||
void *upper_priv, void *upper_info,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
struct netdev_notifier_changeupper_info changeupper_info = {
|
||||
.info = {
|
||||
.dev = dev,
|
||||
.extack = extack,
|
||||
},
|
||||
.upper_dev = upper_dev,
|
||||
.master = master,
|
||||
|
@ -6341,9 +6343,11 @@ rollback:
|
|||
* returns zero.
|
||||
*/
|
||||
int netdev_upper_dev_link(struct net_device *dev,
|
||||
struct net_device *upper_dev)
|
||||
struct net_device *upper_dev,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
return __netdev_upper_dev_link(dev, upper_dev, false, NULL, NULL);
|
||||
return __netdev_upper_dev_link(dev, upper_dev, false,
|
||||
NULL, NULL, extack);
|
||||
}
|
||||
EXPORT_SYMBOL(netdev_upper_dev_link);
|
||||
|
||||
|
@ -6362,10 +6366,11 @@ EXPORT_SYMBOL(netdev_upper_dev_link);
|
|||
*/
|
||||
int netdev_master_upper_dev_link(struct net_device *dev,
|
||||
struct net_device *upper_dev,
|
||||
void *upper_priv, void *upper_info)
|
||||
void *upper_priv, void *upper_info,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
return __netdev_upper_dev_link(dev, upper_dev, true,
|
||||
upper_priv, upper_info);
|
||||
upper_priv, upper_info, extack);
|
||||
}
|
||||
EXPORT_SYMBOL(netdev_master_upper_dev_link);
|
||||
|
||||
|
|
|
@ -108,7 +108,8 @@ struct vport *ovs_netdev_link(struct vport *vport, const char *name)
|
|||
|
||||
rtnl_lock();
|
||||
err = netdev_master_upper_dev_link(vport->dev,
|
||||
get_dpdev(vport->dp), NULL, NULL);
|
||||
get_dpdev(vport->dp),
|
||||
NULL, NULL, NULL);
|
||||
if (err)
|
||||
goto error_unlock;
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче