net: Plumb extack error reporting to enslavements
Subsystems (14)
v2 cover net: Plumb extack error reporting to enslavements
Another round of extending extack error reporting, this time for enslavements through ndo_add_slave and notifiers.
v2
- changed how the messages are added to bonding driver per Jiri's request
- fixed spectrum message for LAG overflow per Ido's comment
David Ahern (7):
net: Add extack to netdev_notifier_info
net: Add extack to ndo_add_slave
net: Add extack to upper device linking
net: vrf: Add extack messages for enslave errors
net: bonding: Add extack messages for some enslave failures
net: bridge: Pass extack to down to netdev_master_upper_dev_link
mlxsw: spectrum: Add extack messages for enslave failures
drivers/net/bonding/bond_main.c | 19 +++-- drivers/net/bonding/bond_options.c | 2 +- drivers/net/ethernet/mellanox/mlxsw/spectrum.c | 47 ++++++++--- drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c | 2 +- drivers/net/hyperv/netvsc_drv.c | 2 +- drivers/net/ipvlan/ipvlan_main.c | 2 +- drivers/net/macsec.c | 2 +- drivers/net/macvlan.c | 7 +- drivers/net/macvtap.c | 2 +- drivers/net/team/team.c | 5 +- drivers/net/usb/qmi_wwan.c | 2 +- drivers/net/vrf.c | 23 ++++-- include/linux/if_macvlan.h | 3 +- include/linux/netdevice.h | 19 ++++- include/net/bonding.h | 3 +- net/8021q/vlan.c | 6 +- net/8021q/vlan.h | 2 +- net/8021q/vlan_netlink.c | 2 +- net/batman-adv/hard-interface.c | 2 +- net/batman-adv/soft-interface.c | 3 +- net/bridge/br_device.c | 5 +- net/bridge/br_if.c | 15 +++- net/bridge/br_ioctl.c | 2 +- net/bridge/br_private.h | 3 +- net/core/dev.c | 96 +++++++++++++--------- net/core/rtnetlink.c | 10 ++- net/openvswitch/vport-netdev.c | 3 +- 27 files changed, 192 insertions(+), 97 deletions(-)
Signature · 1 line
2.1.4
PATCH v2 1/7 net: Add extack to netdev_notifier_info
Add netlink_ext_ack to netdev_notifier_info to allow notifier handlers to return errors to userspace.
Clean up the initialization in dev.c such that extack is easily added in subsequent patches where relevant. Specifically, remove the init call in call_netdevice_notifiers_info and have callers initalize on stack when info is declared.
--- include/linux/netdevice.h | 10 +++++- net/core/dev.c | 79 ++++++++++++++++++++++++++++------------------- 2 files changed, 56 insertions(+), 33 deletions(-)
include/linux/netdevice.h +9 -1
@@ -2309,7 +2309,8 @@ int register_netdevice_notifier(struct notifier_block *nb);int unregister_netdevice_notifier (struct notifier_block *nb);struct netdev_notifier_info { -struct net_device *dev; +struct net_device *dev; +struct netlink_ext_ack *extack; };struct netdev_notifier_change_info {
@@ -2334,6 +2335,7 @@ static inline void netdev_notifier_info_init(struct netdev_notifier_info *info, struct net_device *dev) { info->dev = dev; + info->extack =NULL ; } static inline struct net_device *
@@ -2342,6 +2344,12 @@ netdev_notifier_info_to_dev(const struct netdev_notifier_info *info)return info->dev; } +static inline struct netlink_ext_ack * +netdev_notifier_info_to_extack (const struct netdev_notifier_info *info) +{ +return info->extack; +} +int call_netdevice_notifiers (unsigned long val,struct net_device *dev);
net/core/dev.c +47 -32
172 lines not on this page · raw message
Signature · 1 line
2.1.4
PATCH v2 2/7 net: Add extack to ndo_add_slave
In reply to David AhernPass extack to do_set_master and down to ndo_add_slave
--- drivers/net/bonding/bond_main.c | 5 +++-- drivers/net/bonding/bond_options.c | 2 +- drivers/net/team/team.c | 3 ++- drivers/net/vrf.c | 3 ++- include/linux/netdevice.h | 3 ++- include/net/bonding.h | 3 ++- net/batman-adv/soft-interface.c | 3 ++- net/bridge/br_device.c | 3 ++- net/core/rtnetlink.c | 10 ++++++---- 9 files changed, 22 insertions(+), 13 deletions(-)
drivers/net/bonding/bond_main.c +3 -2
@@ -1328,7 +1328,8 @@ void bond_lower_state_changed(struct slave *slave) }/* enslave device <slave> to bond device <master> */ -int bond_enslave (struct net_device *bond_dev,struct net_device *slave_dev) +int bond_enslave (struct net_device *bond_dev,struct net_device *slave_dev, +struct netlink_ext_ack *extack) {struct bonding *bond =netdev_priv (bond_dev);const struct net_device_ops *slave_ops = slave_dev->netdev_ops;
@@ -3492,7 +3493,7 @@ static int bond_do_ioctl(struct net_device *bond_dev, struct ifreq *ifr, int cmdswitch (cmd) {case BOND_ENSLAVE_OLD :case SIOCBONDENSLAVE : - res =bond_enslave (bond_dev, slave_dev); + res =bond_enslave (bond_dev, slave_dev,NULL );break ;case BOND_RELEASE_OLD :case SIOCBONDRELEASE :
drivers/net/bonding/bond_options.c +1 -1
@@ -1383,7 +1383,7 @@ static int bond_option_slaves_set(struct bonding *bond,switch (command[0 ]) {case '+' :netdev_dbg (bond->dev,"Adding slave %s\n" , dev->name); - ret =bond_enslave (bond->dev, dev); + ret =bond_enslave (bond->dev, dev,NULL );break ;case '-' :
drivers/net/team/team.c +2 -1
@@ -1914,7 +1914,8 @@ static int team_netpoll_setup(struct net_device *dev, }#endif -static int team_add_slave (struct net_device *dev,struct net_device *port_dev) +static int team_add_slave (struct net_device *dev,struct net_device *port_dev, +struct netlink_ext_ack *extack) {struct team *team =netdev_priv (dev);int err;
drivers/net/vrf.c +2 -1
@@ -788,7 +788,8 @@ static int do_vrf_add_slave(struct net_device *dev, struct net_device *port_dev)return ret; } -static int vrf_add_slave (struct net_device *dev,struct net_device *port_dev) +static int vrf_add_slave (struct net_device *dev,struct net_device *port_dev, +struct netlink_ext_ack *extack) {if (netif_is_l3_master (port_dev) ||netif_is_l3_slave (port_dev))return -EINVAL ;
include/linux/netdevice.h +2 -1
@@ -1246,7 +1246,8 @@ struct net_device_ops { u32 flow_id);#endif int (*ndo_add_slave)(struct net_device *dev, -struct net_device *slave_dev); +struct net_device *slave_dev, +struct netlink_ext_ack *extack);int (*ndo_del_slave)(struct net_device *dev,struct net_device *slave_dev); netdev_features_t (*ndo_fix_features)(struct net_device *dev,
include/net/bonding.h +2 -1
@@ -596,7 +596,8 @@ void bond_destroy_sysfs(struct bond_net *net);void bond_prepare_sysfs_group (struct bonding *bond);int bond_sysfs_slave_add (struct slave *slave);void bond_sysfs_slave_del (struct slave *slave); -int bond_enslave (struct net_device *bond_dev,struct net_device *slave_dev); +int bond_enslave (struct net_device *bond_dev,struct net_device *slave_dev, +struct netlink_ext_ack *extack);int bond_release (struct net_device *bond_dev,struct net_device *slave_dev);u32 bond_xmit_hash (struct bonding *bond,struct sk_buff *skb);int bond_set_carrier (struct bonding *bond);
net/batman-adv/soft-interface.c +2 -1
@@ -867,7 +867,8 @@ static int batadv_softif_init_late(struct net_device *dev)* Return: 0 if successful or error otherwise. */ static int batadv_softif_slave_add (struct net_device *dev, -struct net_device *slave_dev) +struct net_device *slave_dev, +struct netlink_ext_ack *extack) {struct batadv_hard_iface *hard_iface;struct net *net =dev_net (dev);
net/bridge/br_device.c +2 -1
@@ -320,7 +320,8 @@ void br_netpoll_disable(struct net_bridge_port *p)#endif -static int br_add_slave (struct net_device *dev,struct net_device *slave_dev) +static int br_add_slave (struct net_device *dev,struct net_device *slave_dev, +struct netlink_ext_ack *extack) {struct net_bridge *br =netdev_priv (dev);
net/core/rtnetlink.c +6 -4
@@ -1952,7 +1952,8 @@ static int do_setvfinfo(struct net_device *dev, struct nlattr **tb)return err; } -static int do_set_master (struct net_device *dev,int ifindex) +static int do_set_master (struct net_device *dev,int ifindex, +struct netlink_ext_ack *extack) {struct net_device *upper_dev =netdev_master_upper_dev_get (dev);const struct net_device_ops *ops;
@@ -1977,7 +1978,7 @@ static int do_set_master(struct net_device *dev, int ifindex)return -EINVAL ; ops = upper_dev->netdev_ops;if (ops->ndo_add_slave) { - err = ops->ndo_add_slave (upper_dev, dev); + err = ops->ndo_add_slave (upper_dev, dev, extack);if (err)return err; }else {
@@ -2110,7 +2111,7 @@ static int do_setlink(const struct sk_buff *skb, }if (tb[IFLA_MASTER ]) { - err =do_set_master (dev,nla_get_u32 (tb[IFLA_MASTER ])); + err =do_set_master (dev,nla_get_u32 (tb[IFLA_MASTER ]), extack);if (err) goto errout; status |=DO_SETLINK_MODIFIED ;
@@ -2748,7 +2749,8 @@ static int rtnl_newlink(struct sk_buff *skb, struct nlmsghdr *nlh, goto out_unregister; }if (tb[IFLA_MASTER ]) { - err =do_set_master (dev,nla_get_u32 (tb[IFLA_MASTER ])); + err =do_set_master (dev,nla_get_u32 (tb[IFLA_MASTER ]), + extack);if (err) goto out_unregister; }
Signature · 1 line
2.1.4
PATCH v2 3/7 net: Add extack to upper device linking
In reply to David AhernAdd extack arg to netdev_upper_dev_link and netdev_master_upper_dev_link
--- drivers/net/bonding/bond_main.c | 7 ++++--- drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c | 2 +- drivers/net/hyperv/netvsc_drv.c | 2 +- drivers/net/ipvlan/ipvlan_main.c | 2 +- drivers/net/macsec.c | 2 +- drivers/net/macvlan.c | 7 ++++--- drivers/net/macvtap.c | 2 +- drivers/net/team/team.c | 2 +- drivers/net/usb/qmi_wwan.c | 2 +- drivers/net/vrf.c | 7 ++++--- include/linux/if_macvlan.h | 3 ++- include/linux/netdevice.h | 6 ++++-- net/8021q/vlan.c | 6 +++--- net/8021q/vlan.h | 2 +- net/8021q/vlan_netlink.c | 2 +- net/batman-adv/hard-interface.c | 2 +- net/bridge/br_if.c | 2 +- net/core/dev.c | 15 ++++++++++----- net/openvswitch/vport-netdev.c | 3 ++- 19 files changed, 44 insertions(+), 32 deletions(-)
drivers/net/bonding/bond_main.c +4 -3
@@ -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;
drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c +1 -1
@@ -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;
drivers/net/hyperv/netvsc_drv.c +1 -1
@@ -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",
drivers/net/ipvlan/ipvlan_main.c +1 -1
@@ -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; }
drivers/net/macsec.c +1 -1
@@ -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;
drivers/net/macvlan.c +4 -3
@@ -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)
drivers/net/macvtap.c +1 -1
@@ -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;
drivers/net/team/team.c +1 -1
@@ -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 ;
drivers/net/usb/qmi_wwan.c +1 -1
@@ -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;
drivers/net/vrf.c +4 -3
@@ -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 */
include/linux/if_macvlan.h +2 -1
@@ -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,
include/linux/netdevice.h +4 -2
@@ -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);
net/8021q/vlan.c +3 -3
@@ -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;
net/8021q/vlan.h +1 -1
@@ -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);
net/8021q/vlan_netlink.c +1 -1
@@ -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)
net/batman-adv/hard-interface.c +1 -1
@@ -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;
net/bridge/br_if.c +1 -1
@@ -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;
net/core/dev.c +10 -5
@@ -6276,11 +6276,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,
@@ -6340,9 +6342,11 @@ static int __netdev_upper_dev_link(struct net_device *dev,* 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);
@@ -6361,10 +6365,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);
net/openvswitch/vport-netdev.c +2 -1
@@ -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;
Signature · 1 line
2.1.4
PATCH v2 4/7 net: vrf: Add extack messages for enslave errors
In reply to David Ahern--- drivers/net/vrf.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-)
drivers/net/vrf.c +11 -2
@@ -772,8 +772,11 @@ static int do_vrf_add_slave(struct net_device *dev, struct net_device *port_dev,/* do not allow loopback device to be enslaved to a VRF. * The vrf device acts as the loopback for the vrf. */ -if (port_dev ==dev_net (dev)->loopback_dev) +if (port_dev ==dev_net (dev)->loopback_dev) { +NL_SET_ERR_MSG (extack, +"Can not enslave loopback device to a VRF" );return -EOPNOTSUPP ; + } port_dev->priv_flags |=IFF_L3MDEV_SLAVE ; ret =netdev_master_upper_dev_link (port_dev, dev,NULL ,NULL , extack);
@@ -792,7 +795,13 @@ static int do_vrf_add_slave(struct net_device *dev, struct net_device *port_dev,static int vrf_add_slave (struct net_device *dev,struct net_device *port_dev,struct netlink_ext_ack *extack) { -if (netif_is_l3_master (port_dev) ||netif_is_l3_slave (port_dev)) +if (netif_is_l3_master (port_dev)) { +NL_SET_ERR_MSG (extack, +"Can not enslave an L3 master device to a VRF" ); +return -EINVAL ; + } + +if (netif_is_l3_slave (port_dev))return -EINVAL ;return do_vrf_add_slave (dev, port_dev, extack);
Signature · 1 line
2.1.4
PATCH v2 5/7 net: bonding: Add extack messages for some enslave failures
In reply to David AhernA number of bond_enslave errors are logged using the netdev_err API. Return those messages to userspace via the extack facility.
--- drivers/net/bonding/bond_main.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/net/bonding/bond_main.c +7 -0
@@ -1348,12 +1348,14 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev,/* already in-use? */ if (netdev_is_rx_handler_busy (slave_dev)) { +NL_SET_ERR_MSG (extack,"Device is in use and cannot be enslaved" );netdev_err (bond_dev,"Error: Device is in use and cannot be enslaved\n" );return -EBUSY ; }if (bond_dev == slave_dev) { +NL_SET_ERR_MSG (extack,"Cannot enslave bond to itself." );netdev_err (bond_dev,"cannot enslave bond to itself.\n" );return -EPERM ; }
@@ -1364,6 +1366,7 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev,netdev_dbg (bond_dev,"%s is NETIF_F_VLAN_CHALLENGED\n" , slave_dev->name);if (vlan_uses_dev (bond_dev)) { +NL_SET_ERR_MSG (extack,"Can not enslave VLAN challenged device to VLAN enabled bond" );netdev_err (bond_dev,"Error: cannot enslave VLAN challenged slave %s on VLAN enabled bond %s\n" , slave_dev->name, bond_dev->name);return -EPERM ;
@@ -1383,6 +1386,7 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev,* enslaving it; the old ifenslave will not. */ if (slave_dev->flags &IFF_UP ) { +NL_SET_ERR_MSG (extack,"Device can not be enslaved while up" );netdev_err (bond_dev,"%s is up - this may be due to an out of date ifenslave\n" , slave_dev->name);return -EPERM ;
@@ -1423,6 +1427,7 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev, bond_dev); } }else if (bond_dev->type != slave_dev->type) { +NL_SET_ERR_MSG (extack,"Device type is different from other slaves" );netdev_err (bond_dev,"%s ether type (%d) is different from other slaves (%d), can not enslave it\n" , slave_dev->name, slave_dev->type, bond_dev->type);return -EINVAL ;
@@ -1430,6 +1435,7 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev,if (slave_dev->type ==ARPHRD_INFINIBAND &&BOND_MODE (bond) !=BOND_MODE_ACTIVEBACKUP ) { +NL_SET_ERR_MSG (extack,"Only active-backup mode is supported for infiniband slaves" );netdev_warn (bond_dev,"Type (%d) supports only active-backup mode\n" , slave_dev->type); res = -EOPNOTSUPP ;
@@ -1445,6 +1451,7 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev, bond->params.fail_over_mac =BOND_FOM_ACTIVE ;netdev_warn (bond_dev,"Setting fail_over_mac to active for active-backup mode\n" ); }else { +NL_SET_ERR_MSG (extack,"Slave device does not support setting the MAC address, but fail_over_mac is not set to active" );netdev_err (bond_dev,"The slave device specified does not support setting the MAC address, but fail_over_mac is not set to active\n" ); res = -EOPNOTSUPP ; goto err_undo_flags;
Signature · 1 line
2.1.4
PATCH v2 6/7 net: bridge: Pass extack to down to netdev_master_upper_dev_link
In reply to David AhernPass extack arg to br_add_if. Add messages for a couple of failures and pass arg to netdev_master_upper_dev_link.
--- net/bridge/br_device.c | 2 +- net/bridge/br_if.c | 15 +++++++++++---- net/bridge/br_ioctl.c | 2 +- net/bridge/br_private.h | 3 ++- 4 files changed, 15 insertions(+), 7 deletions(-)
net/bridge/br_device.c +1 -1
@@ -326,7 +326,7 @@ static int br_add_slave(struct net_device *dev, struct net_device *slave_dev, {struct net_bridge *br =netdev_priv (dev); -return br_add_if (br, slave_dev); +return br_add_if (br, slave_dev, extack); }static int br_del_slave (struct net_device *dev,struct net_device *slave_dev)
net/bridge/br_if.c +11 -4
@@ -480,7 +480,8 @@ netdev_features_t br_features_recompute(struct net_bridge *br, }/* called with RTNL */ -int br_add_if (struct net_bridge *br,struct net_device *dev) +int br_add_if (struct net_bridge *br,struct net_device *dev, +struct netlink_ext_ack *extack) {struct net_bridge_port *p;int err =0 ;
@@ -500,16 +501,22 @@ int br_add_if(struct net_bridge *br, struct net_device *dev)return -EINVAL ;/* No bridging of bridges */ -if (dev->netdev_ops->ndo_start_xmit == br_dev_xmit) +if (dev->netdev_ops->ndo_start_xmit == br_dev_xmit) { +NL_SET_ERR_MSG (extack, +"Can not enslave a bridge to a bridge" );return -ELOOP ; + }/* Device is already being bridged */ if (br_port_exists (dev))return -EBUSY ;/* No bridging devices that dislike that (e.g. wireless) */ -if (dev->priv_flags &IFF_DONT_BRIDGE ) +if (dev->priv_flags &IFF_DONT_BRIDGE ) { +NL_SET_ERR_MSG (extack, +"Device does not allow enslaving to a bridge" );return -EOPNOTSUPP ; + } p =new_nbp (br, dev);if (IS_ERR (p))
@@ -540,7 +547,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 ,NULL ); + err =netdev_master_upper_dev_link (dev, br->dev,NULL ,NULL , extack);if (err) goto err5;
net/bridge/br_ioctl.c +1 -1
@@ -98,7 +98,7 @@ static int add_del_if(struct net_bridge *br, int ifindex, int isadd)return -EINVAL ;if (isadd) - ret =br_add_if (br, dev); + ret =br_add_if (br, dev,NULL );else ret =br_del_if (br, dev);
net/bridge/br_private.h +2 -1
@@ -566,7 +566,8 @@ void br_flood(struct net_bridge *br, struct sk_buff *skb,void br_port_carrier_check (struct net_bridge_port *p);int br_add_bridge (struct net *net,const char *name);int br_del_bridge (struct net *net,const char *name); -int br_add_if (struct net_bridge *br,struct net_device *dev); +int br_add_if (struct net_bridge *br,struct net_device *dev, +struct netlink_ext_ack *extack);int br_del_if (struct net_bridge *br,struct net_device *dev);int br_min_mtu (const struct net_bridge *br); netdev_features_t br_features_recompute(struct net_bridge *br,
Signature · 1 line
2.1.4
PATCH v2 7/7 mlxsw: spectrum: Add extack messages for enslave failures
In reply to David Ahernmlxsw fails device enslavement for a number of reasons. Use the extack facility to return an error message to the user stating why the enslave is failing.
Messages are prefixed with "spectrum" so users know it is a constraint imposed by the hardware driver. For example:
$ ip li add br0.11 link br0 type vlan id 11
$ ip li set swp11 master br0
Error: spectrum: Enslaving a port to a device that already has an upper device is not supported.--- drivers/net/ethernet/mellanox/mlxsw/spectrum.c | 47 ++++++++++++++++++++------ 1 file changed, 37 insertions(+), 10 deletions(-)
drivers/net/ethernet/mellanox/mlxsw/spectrum.c +37 -10
@@ -4019,14 +4019,21 @@ static int mlxsw_sp_lag_index_get(struct mlxsw_sp *mlxsw_sp,static bool mlxsw_sp_master_lag_check (struct mlxsw_sp *mlxsw_sp,struct net_device *lag_dev, -struct netdev_lag_upper_info *lag_upper_info) +struct netdev_lag_upper_info *lag_upper_info, +struct netlink_ext_ack *extack) {u16 lag_id; -if (mlxsw_sp_lag_index_get (mlxsw_sp, lag_dev, &lag_id) !=0 ) +if (mlxsw_sp_lag_index_get (mlxsw_sp, lag_dev, &lag_id) !=0 ) { +NL_SET_ERR_MSG (extack, +"spectrum: Exceeded number of supported LAG devices" );return false; -if (lag_upper_info->tx_type !=NETDEV_LAG_TX_TYPE_HASH ) + } +if (lag_upper_info->tx_type !=NETDEV_LAG_TX_TYPE_HASH ) { +NL_SET_ERR_MSG (extack, +"spectrum: LAG device using unsupported Tx type" );return false; + }return true; }
@@ -4231,6 +4238,7 @@ static int mlxsw_sp_netdevice_port_upper_event(struct net_device *lower_dev, {struct netdev_notifier_changeupper_info *info;struct mlxsw_sp_port *mlxsw_sp_port; +struct netlink_ext_ack *extack;struct net_device *upper_dev;struct mlxsw_sp *mlxsw_sp;int err =0 ;
@@ -4238,6 +4246,7 @@ static int mlxsw_sp_netdevice_port_upper_event(struct net_device *lower_dev, mlxsw_sp_port =netdev_priv (dev); mlxsw_sp = mlxsw_sp_port->mlxsw_sp; info = ptr; + extack =netdev_notifier_info_to_extack (&info->info);switch (event) {case NETDEV_PRECHANGEUPPER :
@@ -4245,25 +4254,43 @@ static int mlxsw_sp_netdevice_port_upper_event(struct net_device *lower_dev,if (!is_vlan_dev (upper_dev) && !netif_is_lag_master (upper_dev) && !netif_is_bridge_master (upper_dev) && - !netif_is_ovs_master (upper_dev)) + !netif_is_ovs_master (upper_dev)) { +NL_SET_ERR_MSG (extack, +"spectrum: Unknown upper device type" );return -EINVAL ; + }if (!info->linking)break ; -if (netdev_has_any_upper_dev (upper_dev)) +if (netdev_has_any_upper_dev (upper_dev)) { +NL_SET_ERR_MSG (extack, +"spectrum: Enslaving a port to a device that already has an upper device is not supported" );return -EINVAL ; + }if (netif_is_lag_master (upper_dev) && !mlxsw_sp_master_lag_check (mlxsw_sp, upper_dev, - info->upper_info)) + info->upper_info, extack))return -EINVAL ; -if (netif_is_lag_master (upper_dev) &&vlan_uses_dev (dev)) +if (netif_is_lag_master (upper_dev) &&vlan_uses_dev (dev)) { +NL_SET_ERR_MSG (extack, +"spectrum: Master device is a LAG master and this device has a VLAN" );return -EINVAL ; + }if (netif_is_lag_port (dev) &&is_vlan_dev (upper_dev) && - !netif_is_lag_master (vlan_dev_real_dev (upper_dev))) + !netif_is_lag_master (vlan_dev_real_dev (upper_dev))) { +NL_SET_ERR_MSG (extack, +"spectrum: Can not put a VLAN on a LAG port" );return -EINVAL ; -if (netif_is_ovs_master (upper_dev) &&vlan_uses_dev (dev)) + } +if (netif_is_ovs_master (upper_dev) &&vlan_uses_dev (dev)) { +NL_SET_ERR_MSG (extack, +"spectrum: Master device is an OVS master and this device has a VLAN" );return -EINVAL ; -if (netif_is_ovs_port (dev) &&is_vlan_dev (upper_dev)) + } +if (netif_is_ovs_port (dev) &&is_vlan_dev (upper_dev)) { +NL_SET_ERR_MSG (extack, +"spectrum: Can not put a VLAN on an OVS port" );return -EINVAL ; + }break ;case NETDEV_CHANGEUPPER : upper_dev = info->upper_dev;
Signature · 1 line
2.1.4
David Miller
maintainerFrom: David Ahern <[email protected]>
Date: Wed, 4 Oct 2017 17:48:44 -0700
Quoted 6 lines
Another round of extending extack error reporting, this time for enslavements through
ndo_add_slaveand notifiers.v2
- changed how the messages are added to bonding driver per Jiri's request
- fixed spectrum message for LAG overflow per Ido's comment
Series applied, thanks David.