net: bridge: don't print in br_switchdev_set_port_flag
authorVladimir Oltean <vladimir.oltean@nxp.com>
Fri, 12 Feb 2021 15:15:53 +0000 (17:15 +0200)
committerDavid S. Miller <davem@davemloft.net>
Sat, 13 Feb 2021 01:08:04 +0000 (17:08 -0800)
For the netlink interface, propagate errors through extack rather than
simply printing them to the console. For the sysfs interface, we still
print to the console, but at least that's one layer higher than in
switchdev, which also allows us to silently ignore the offloading of
flags if that is ever needed in the future.

Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Acked-by: Nikolay Aleksandrov <nikolay@nvidia.com>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/bridge/br_netlink.c
net/bridge/br_private.h
net/bridge/br_switchdev.c
net/bridge/br_sysfs_if.c

index bf469f824944d35652d8a1b2decb02ed76dddb91..7b513c5d347fb4016a2511e7392f931f3711b5d7 100644 (file)
@@ -866,7 +866,8 @@ static void br_set_port_flag(struct net_bridge_port *p, struct nlattr *tb[],
 }
 
 /* Process bridge protocol info on port */
-static int br_setport(struct net_bridge_port *p, struct nlattr *tb[])
+static int br_setport(struct net_bridge_port *p, struct nlattr *tb[],
+                     struct netlink_ext_ack *extack)
 {
        unsigned long old_flags, changed_mask;
        bool br_vlan_tunnel_old;
@@ -894,7 +895,7 @@ static int br_setport(struct net_bridge_port *p, struct nlattr *tb[])
 
        changed_mask = old_flags ^ p->flags;
 
-       err = br_switchdev_set_port_flag(p, p->flags, changed_mask);
+       err = br_switchdev_set_port_flag(p, p->flags, changed_mask, extack);
        if (err) {
                p->flags = old_flags;
                return err;
@@ -1007,7 +1008,7 @@ int br_setlink(struct net_device *dev, struct nlmsghdr *nlh, u16 flags,
                                return err;
 
                        spin_lock_bh(&p->br->lock);
-                       err = br_setport(p, tb);
+                       err = br_setport(p, tb, extack);
                        spin_unlock_bh(&p->br->lock);
                } else {
                        /* Binary compatibility with old RSTP */
@@ -1102,7 +1103,7 @@ static int br_port_slave_changelink(struct net_device *brdev,
                return 0;
 
        spin_lock_bh(&br->lock);
-       ret = br_setport(br_port_get_rtnl(dev), data);
+       ret = br_setport(br_port_get_rtnl(dev), data, extack);
        spin_unlock_bh(&br->lock);
 
        return ret;
index d242ba668e47352e7db7781288dcec6444a8b1e8..a1639d41188b882d1a4737615fa81763ad3196cf 100644 (file)
@@ -1575,7 +1575,8 @@ bool nbp_switchdev_allowed_egress(const struct net_bridge_port *p,
                                  const struct sk_buff *skb);
 int br_switchdev_set_port_flag(struct net_bridge_port *p,
                               unsigned long flags,
-                              unsigned long mask);
+                              unsigned long mask,
+                              struct netlink_ext_ack *extack);
 void br_switchdev_fdb_notify(const struct net_bridge_fdb_entry *fdb,
                             int type);
 int br_switchdev_port_vlan_add(struct net_device *dev, u16 vid, u16 flags,
@@ -1605,7 +1606,8 @@ static inline bool nbp_switchdev_allowed_egress(const struct net_bridge_port *p,
 
 static inline int br_switchdev_set_port_flag(struct net_bridge_port *p,
                                             unsigned long flags,
-                                            unsigned long mask)
+                                            unsigned long mask,
+                                            struct netlink_ext_ack *extack)
 {
        return 0;
 }
index 6a9db6aa5c0435721a11d2e226ad9a056ef0043a..bb21dd35ae85ee4953ea3ef075abc1b587af6f30 100644 (file)
@@ -60,7 +60,8 @@ bool nbp_switchdev_allowed_egress(const struct net_bridge_port *p,
 
 int br_switchdev_set_port_flag(struct net_bridge_port *p,
                               unsigned long flags,
-                              unsigned long mask)
+                              unsigned long mask,
+                              struct netlink_ext_ack *extack)
 {
        struct switchdev_attr attr = {
                .orig_dev = p->dev,
@@ -79,14 +80,15 @@ int br_switchdev_set_port_flag(struct net_bridge_port *p,
 
        /* We run from atomic context here */
        err = call_switchdev_notifiers(SWITCHDEV_PORT_ATTR_SET, p->dev,
-                                      &info.info, NULL);
+                                      &info.info, extack);
        err = notifier_to_errno(err);
        if (err == -EOPNOTSUPP)
                return 0;
 
        if (err) {
-               br_warn(p->br, "bridge flag offload is not supported %u(%s)\n",
-                       (unsigned int)p->port_no, p->dev->name);
+               if (extack && !extack->_msg)
+                       NL_SET_ERR_MSG_MOD(extack,
+                                          "bridge flag offload is not supported");
                return -EOPNOTSUPP;
        }
 
@@ -96,8 +98,7 @@ int br_switchdev_set_port_flag(struct net_bridge_port *p,
 
        err = switchdev_port_attr_set(p->dev, &attr);
        if (err) {
-               br_warn(p->br, "error setting offload flag on port %u(%s)\n",
-                       (unsigned int)p->port_no, p->dev->name);
+               NL_SET_ERR_MSG_MOD(extack, "error setting offload flag on port");
                return err;
        }
 
index 5aea9427ffe1b2f645f8e37eb28ae698a41e212b..72e92376eef1591e22b640ce3b6b5497e33db8fd 100644 (file)
@@ -59,6 +59,7 @@ static BRPORT_ATTR(_name, 0644,                                       \
 static int store_flag(struct net_bridge_port *p, unsigned long v,
                      unsigned long mask)
 {
+       struct netlink_ext_ack extack = {0};
        unsigned long flags = p->flags;
        int err;
 
@@ -68,9 +69,11 @@ static int store_flag(struct net_bridge_port *p, unsigned long v,
                flags &= ~mask;
 
        if (flags != p->flags) {
-               err = br_switchdev_set_port_flag(p, flags, mask);
-               if (err)
+               err = br_switchdev_set_port_flag(p, flags, mask, &extack);
+               if (err) {
+                       netdev_err(p->dev, "%s\n", extack._msg);
                        return err;
+               }
 
                p->flags = flags;
                br_port_flags_change(p, mask);