OSDN Git Service

net: switchdev: Add extack to struct switchdev_notifier_info
authorPetr Machata <petrm@mellanox.com>
Wed, 12 Dec 2018 17:02:54 +0000 (17:02 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 13 Dec 2018 00:34:22 +0000 (16:34 -0800)
In order to pass extack to the drivers that need it, add an extack field
to struct switchdev_notifier_info, and an extack argument to the
function call_switchdev_blocking_notifiers(). Also add a helper function
switchdev_notifier_info_to_extack().

Signed-off-by: Petr Machata <petrm@mellanox.com>
Acked-by: Jiri Pirko <jiri@mellanox.com>
Acked-by: Ivan Vecera <ivecera@redhat.com>
Reviewed-by: Ido Schimmel <idosch@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/vxlan.c
include/net/switchdev.h
net/switchdev/switchdev.c

index b56ef68..49d4b58 100644 (file)
@@ -364,6 +364,7 @@ static void vxlan_fdb_switchdev_notifier_info(const struct vxlan_dev *vxlan,
                            struct switchdev_notifier_vxlan_fdb_info *fdb_info)
 {
        fdb_info->info.dev = vxlan->dev;
+       fdb_info->info.extack = NULL;
        fdb_info->remote_ip = rd->remote_ip;
        fdb_info->remote_port = rd->remote_port;
        fdb_info->remote_vni = rd->remote_vni;
index 6901630..4facfa6 100644 (file)
@@ -149,6 +149,7 @@ enum switchdev_notifier_type {
 
 struct switchdev_notifier_info {
        struct net_device *dev;
+       struct netlink_ext_ack *extack;
 };
 
 struct switchdev_notifier_fdb_info {
@@ -172,6 +173,12 @@ switchdev_notifier_info_to_dev(const struct switchdev_notifier_info *info)
        return info->dev;
 }
 
+static inline struct netlink_ext_ack *
+switchdev_notifier_info_to_extack(const struct switchdev_notifier_info *info)
+{
+       return info->extack;
+}
+
 #ifdef CONFIG_NET_SWITCHDEV
 
 void switchdev_deferred_process(void);
@@ -193,7 +200,8 @@ int call_switchdev_notifiers(unsigned long val, struct net_device *dev,
 int register_switchdev_blocking_notifier(struct notifier_block *nb);
 int unregister_switchdev_blocking_notifier(struct notifier_block *nb);
 int call_switchdev_blocking_notifiers(unsigned long val, struct net_device *dev,
-                                     struct switchdev_notifier_info *info);
+                                     struct switchdev_notifier_info *info,
+                                     struct netlink_ext_ack *extack);
 
 void switchdev_port_fwd_mark_set(struct net_device *dev,
                                 struct net_device *group_dev,
@@ -278,7 +286,8 @@ unregister_switchdev_blocking_notifier(struct notifier_block *nb)
 static inline int
 call_switchdev_blocking_notifiers(unsigned long val,
                                  struct net_device *dev,
-                                 struct switchdev_notifier_info *info)
+                                 struct switchdev_notifier_info *info,
+                                 struct netlink_ext_ack *extack)
 {
        return NOTIFY_DONE;
 }
index cb20669..aa84acf 100644 (file)
@@ -368,7 +368,7 @@ static int switchdev_port_obj_notify(enum switchdev_notifier_type nt,
                .handled = false,
        };
 
-       rc = call_switchdev_blocking_notifiers(nt, dev, &obj_info.info);
+       rc = call_switchdev_blocking_notifiers(nt, dev, &obj_info.info, extack);
        err = notifier_to_errno(rc);
        if (err) {
                WARN_ON(!obj_info.handled);
@@ -559,6 +559,7 @@ int call_switchdev_notifiers(unsigned long val, struct net_device *dev,
                             struct switchdev_notifier_info *info)
 {
        info->dev = dev;
+       info->extack = NULL;
        return atomic_notifier_call_chain(&switchdev_notif_chain, val, info);
 }
 EXPORT_SYMBOL_GPL(call_switchdev_notifiers);
@@ -580,9 +581,11 @@ int unregister_switchdev_blocking_notifier(struct notifier_block *nb)
 EXPORT_SYMBOL_GPL(unregister_switchdev_blocking_notifier);
 
 int call_switchdev_blocking_notifiers(unsigned long val, struct net_device *dev,
-                                     struct switchdev_notifier_info *info)
+                                     struct switchdev_notifier_info *info,
+                                     struct netlink_ext_ack *extack)
 {
        info->dev = dev;
+       info->extack = extack;
        return blocking_notifier_call_chain(&switchdev_blocking_notif_chain,
                                            val, info);
 }