net: fib_notifier: propagate extack down to the notifier block callback
authorJiri Pirko <jiri@mellanox.com>
Thu, 3 Oct 2019 09:49:30 +0000 (11:49 +0200)
committerDavid S. Miller <davem@davemloft.net>
Fri, 4 Oct 2019 18:10:56 +0000 (11:10 -0700)
Since errors are propagated all the way up to the caller, propagate
possible extack of the caller all the way down to the notifier block
callback.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
20 files changed:
drivers/net/ethernet/mellanox/mlx5/core/lag_mp.c
drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
drivers/net/ethernet/rocker/rocker_main.c
drivers/net/netdevsim/fib.c
include/linux/mroute_base.h
include/net/fib_notifier.h
include/net/fib_rules.h
include/net/ip6_fib.h
include/net/ip_fib.h
net/core/fib_notifier.c
net/core/fib_rules.c
net/ipv4/fib_notifier.c
net/ipv4/fib_rules.c
net/ipv4/fib_trie.c
net/ipv4/ipmr.c
net/ipv4/ipmr_base.c
net/ipv6/fib6_notifier.c
net/ipv6/fib6_rules.c
net/ipv6/ip6_fib.c
net/ipv6/ip6mr.c

index fe0cc969cf946fd1aa2673a4ed057a7c41d62482..13e2944b12744d9e85c709f3e1d7cb97069e8c55 100644 (file)
@@ -309,7 +309,7 @@ int mlx5_lag_mp_init(struct mlx5_lag *ldev)
 
        mp->fib_nb.notifier_call = mlx5_lag_fib_event;
        err = register_fib_notifier(&init_net, &mp->fib_nb,
-                                   mlx5_lag_fib_event_flush);
+                                   mlx5_lag_fib_event_flush, NULL);
        if (err)
                mp->fib_nb.notifier_call = NULL;
 
index 1eeff1d23b13ea87e9d733ac5d4096b0c0f2076b..445e2daa54ac20d70892c37e260546425e48364c 100644 (file)
@@ -8135,7 +8135,7 @@ int mlxsw_sp_router_init(struct mlxsw_sp *mlxsw_sp)
 
        mlxsw_sp->router->fib_nb.notifier_call = mlxsw_sp_router_fib_event;
        err = register_fib_notifier(&init_net, &mlxsw_sp->router->fib_nb,
-                                   mlxsw_sp_router_fib_dump_flush);
+                                   mlxsw_sp_router_fib_dump_flush, NULL);
        if (err)
                goto err_register_fib_notifier;
 
index e54f6341a7856ee099e93d007ed36fc861b114c6..bc4f951315da8515edf45f3a79ab3252be584405 100644 (file)
@@ -2991,7 +2991,7 @@ static int rocker_probe(struct pci_dev *pdev, const struct pci_device_id *id)
         * the device, so no need to pass a callback.
         */
        rocker->fib_nb.notifier_call = rocker_router_fib_event;
-       err = register_fib_notifier(&init_net, &rocker->fib_nb, NULL);
+       err = register_fib_notifier(&init_net, &rocker->fib_nb, NULL, NULL);
        if (err)
                goto err_register_fib_notifier;
 
index 01ee9cc546052755fb05b453b58413dfb2bd2972..d2aeac0f4c2c6680baac8f1dcc45453316e5e1c1 100644 (file)
@@ -256,7 +256,7 @@ struct nsim_fib_data *nsim_fib_create(struct devlink *devlink)
 
        data->fib_nb.notifier_call = nsim_fib_event_nb;
        err = register_fib_notifier(&init_net, &data->fib_nb,
-                                   nsim_fib_dump_inconsistent);
+                                   nsim_fib_dump_inconsistent, NULL);
        if (err) {
                pr_err("Failed to register fib notifier\n");
                goto err_out;
index 0931631bbc13599e5e076ac375bbc718e8fb99f9..8071148f29a6ec6a95df7e74bbfdeab5b5f6a644 100644 (file)
@@ -50,11 +50,13 @@ static inline int mr_call_vif_notifier(struct notifier_block *nb,
                                       unsigned short family,
                                       enum fib_event_type event_type,
                                       struct vif_device *vif,
-                                      unsigned short vif_index, u32 tb_id)
+                                      unsigned short vif_index, u32 tb_id,
+                                      struct netlink_ext_ack *extack)
 {
        struct vif_entry_notifier_info info = {
                .info = {
                        .family = family,
+                       .extack = extack,
                },
                .dev = vif->dev,
                .vif_index = vif_index,
@@ -172,11 +174,13 @@ struct mfc_entry_notifier_info {
 static inline int mr_call_mfc_notifier(struct notifier_block *nb,
                                       unsigned short family,
                                       enum fib_event_type event_type,
-                                      struct mr_mfc *mfc, u32 tb_id)
+                                      struct mr_mfc *mfc, u32 tb_id,
+                                      struct netlink_ext_ack *extack)
 {
        struct mfc_entry_notifier_info info = {
                .info = {
                        .family = family,
+                       .extack = extack,
                },
                .mfc = mfc,
                .tb_id = tb_id
@@ -295,10 +299,11 @@ int mr_rtm_dumproute(struct sk_buff *skb, struct netlink_callback *cb,
 
 int mr_dump(struct net *net, struct notifier_block *nb, unsigned short family,
            int (*rules_dump)(struct net *net,
-                             struct notifier_block *nb),
+                             struct notifier_block *nb,
+                             struct netlink_ext_ack *extack),
            struct mr_table *(*mr_iter)(struct net *net,
                                        struct mr_table *mrt),
-           rwlock_t *mrt_lock);
+           rwlock_t *mrt_lock, struct netlink_ext_ack *extack);
 #else
 static inline void vif_device_init(struct vif_device *v,
                                   struct net_device *dev,
@@ -349,10 +354,11 @@ mr_rtm_dumproute(struct sk_buff *skb, struct netlink_callback *cb,
 static inline int mr_dump(struct net *net, struct notifier_block *nb,
                          unsigned short family,
                          int (*rules_dump)(struct net *net,
-                                           struct notifier_block *nb),
+                                           struct notifier_block *nb,
+                                           struct netlink_ext_ack *extack),
                          struct mr_table *(*mr_iter)(struct net *net,
                                                      struct mr_table *mrt),
-                         rwlock_t *mrt_lock)
+                         rwlock_t *mrt_lock, struct netlink_ext_ack *extack)
 {
        return -EINVAL;
 }
index 23353f67b2b009707ab937479e962f577da7f814..6d59221ff05ad605dea6bf0e5f3d6b9d24237537 100644 (file)
@@ -29,7 +29,8 @@ struct fib_notifier_ops {
        int family;
        struct list_head list;
        unsigned int (*fib_seq_read)(struct net *net);
-       int (*fib_dump)(struct net *net, struct notifier_block *nb);
+       int (*fib_dump)(struct net *net, struct notifier_block *nb,
+                       struct netlink_ext_ack *extack);
        struct module *owner;
        struct rcu_head rcu;
 };
@@ -40,7 +41,8 @@ int call_fib_notifier(struct notifier_block *nb,
 int call_fib_notifiers(struct net *net, enum fib_event_type event_type,
                       struct fib_notifier_info *info);
 int register_fib_notifier(struct net *net, struct notifier_block *nb,
-                         void (*cb)(struct notifier_block *nb));
+                         void (*cb)(struct notifier_block *nb),
+                         struct netlink_ext_ack *extack);
 int unregister_fib_notifier(struct net *net, struct notifier_block *nb);
 struct fib_notifier_ops *
 fib_notifier_ops_register(const struct fib_notifier_ops *tmpl, struct net *net);
index 20dcadd8eed9474dd131560e60d961db11d34127..54e227e6b06a78902941ea20be01da76ac7ae08b 100644 (file)
@@ -194,7 +194,8 @@ int fib_rules_lookup(struct fib_rules_ops *, struct flowi *, int flags,
 int fib_default_rule_add(struct fib_rules_ops *, u32 pref, u32 table,
                         u32 flags);
 bool fib_rule_matchall(const struct fib_rule *rule);
-int fib_rules_dump(struct net *net, struct notifier_block *nb, int family);
+int fib_rules_dump(struct net *net, struct notifier_block *nb, int family,
+                  struct netlink_ext_ack *extack);
 unsigned int fib_rules_seq_read(struct net *net, int family);
 
 int fib_nl_newrule(struct sk_buff *skb, struct nlmsghdr *nlh,
index 14e9fca0e3268253470683675d686361cf4bae1a..5d1615463138c464a58d516cf2565af058456fe0 100644 (file)
@@ -488,7 +488,8 @@ int __net_init fib6_notifier_init(struct net *net);
 void __net_exit fib6_notifier_exit(struct net *net);
 
 unsigned int fib6_tables_seq_read(struct net *net);
-int fib6_tables_dump(struct net *net, struct notifier_block *nb);
+int fib6_tables_dump(struct net *net, struct notifier_block *nb,
+                    struct netlink_ext_ack *extack);
 
 void fib6_update_sernum(struct net *net, struct fib6_info *rt);
 void fib6_update_sernum_upto_root(struct net *net, struct fib6_info *rt);
@@ -504,7 +505,8 @@ static inline bool fib6_metric_locked(struct fib6_info *f6i, int metric)
 int fib6_rules_init(void);
 void fib6_rules_cleanup(void);
 bool fib6_rule_default(const struct fib_rule *rule);
-int fib6_rules_dump(struct net *net, struct notifier_block *nb);
+int fib6_rules_dump(struct net *net, struct notifier_block *nb,
+                   struct netlink_ext_ack *extack);
 unsigned int fib6_rules_seq_read(struct net *net);
 
 static inline bool fib6_rules_early_flow_dissect(struct net *net,
@@ -537,7 +539,8 @@ static inline bool fib6_rule_default(const struct fib_rule *rule)
 {
        return true;
 }
-static inline int fib6_rules_dump(struct net *net, struct notifier_block *nb)
+static inline int fib6_rules_dump(struct net *net, struct notifier_block *nb,
+                                 struct netlink_ext_ack *extack)
 {
        return 0;
 }
index 05c1fd9c5e23d03a7a579ae62c3706334d0cf6bf..52b2406a5dfcd13598c3336df3f2e98284e2e5c2 100644 (file)
@@ -229,7 +229,8 @@ int __net_init fib4_notifier_init(struct net *net);
 void __net_exit fib4_notifier_exit(struct net *net);
 
 void fib_info_notify_update(struct net *net, struct nl_info *info);
-int fib_notify(struct net *net, struct notifier_block *nb);
+int fib_notify(struct net *net, struct notifier_block *nb,
+              struct netlink_ext_ack *extack);
 
 struct fib_table {
        struct hlist_node       tb_hlist;
@@ -315,7 +316,8 @@ static inline bool fib4_rule_default(const struct fib_rule *rule)
        return true;
 }
 
-static inline int fib4_rules_dump(struct net *net, struct notifier_block *nb)
+static inline int fib4_rules_dump(struct net *net, struct notifier_block *nb,
+                                 struct netlink_ext_ack *extack)
 {
        return 0;
 }
@@ -377,7 +379,8 @@ out:
 }
 
 bool fib4_rule_default(const struct fib_rule *rule);
-int fib4_rules_dump(struct net *net, struct notifier_block *nb);
+int fib4_rules_dump(struct net *net, struct notifier_block *nb,
+                   struct netlink_ext_ack *extack);
 unsigned int fib4_rules_seq_read(struct net *net);
 
 static inline bool fib4_rules_early_flow_dissect(struct net *net,
index fbd029425638d866c4415b1321fcd84dc7f8fb3c..fc96259807b62fd2b41c47f385d7db23a7e38186 100644 (file)
@@ -57,7 +57,8 @@ static unsigned int fib_seq_sum(struct net *net)
        return fib_seq;
 }
 
-static int fib_net_dump(struct net *net, struct notifier_block *nb)
+static int fib_net_dump(struct net *net, struct notifier_block *nb,
+                       struct netlink_ext_ack *extack)
 {
        struct fib_notifier_net *fn_net = net_generic(net, fib_notifier_net_id);
        struct fib_notifier_ops *ops;
@@ -67,7 +68,7 @@ static int fib_net_dump(struct net *net, struct notifier_block *nb)
        list_for_each_entry_rcu(ops, &fn_net->fib_notifier_ops, list) {
                if (!try_module_get(ops->owner))
                        continue;
-               err = ops->fib_dump(net, nb);
+               err = ops->fib_dump(net, nb, extack);
                module_put(ops->owner);
                if (err)
                        goto unlock;
@@ -96,7 +97,8 @@ static bool fib_dump_is_consistent(struct net *net, struct notifier_block *nb,
 
 #define FIB_DUMP_MAX_RETRIES 5
 int register_fib_notifier(struct net *net, struct notifier_block *nb,
-                         void (*cb)(struct notifier_block *nb))
+                         void (*cb)(struct notifier_block *nb),
+                         struct netlink_ext_ack *extack)
 {
        int retries = 0;
        int err;
@@ -104,7 +106,7 @@ int register_fib_notifier(struct net *net, struct notifier_block *nb,
        do {
                unsigned int fib_seq = fib_seq_sum(net);
 
-               err = fib_net_dump(net, nb);
+               err = fib_net_dump(net, nb, extack);
                if (err)
                        return err;
 
index 592d8aef90e348a2760c7c1c75c5fc81f5ef940b..3e7e15278c46847e9d6d25ad960d015fbaa8b6fa 100644 (file)
@@ -323,10 +323,12 @@ EXPORT_SYMBOL_GPL(fib_rules_lookup);
 
 static int call_fib_rule_notifier(struct notifier_block *nb,
                                  enum fib_event_type event_type,
-                                 struct fib_rule *rule, int family)
+                                 struct fib_rule *rule, int family,
+                                 struct netlink_ext_ack *extack)
 {
        struct fib_rule_notifier_info info = {
                .info.family = family,
+               .info.extack = extack,
                .rule = rule,
        };
 
@@ -350,7 +352,8 @@ static int call_fib_rule_notifiers(struct net *net,
 }
 
 /* Called with rcu_read_lock() */
-int fib_rules_dump(struct net *net, struct notifier_block *nb, int family)
+int fib_rules_dump(struct net *net, struct notifier_block *nb, int family,
+                  struct netlink_ext_ack *extack)
 {
        struct fib_rules_ops *ops;
        struct fib_rule *rule;
@@ -361,7 +364,7 @@ int fib_rules_dump(struct net *net, struct notifier_block *nb, int family)
                return -EAFNOSUPPORT;
        list_for_each_entry_rcu(rule, &ops->rules_list, list) {
                err = call_fib_rule_notifier(nb, FIB_EVENT_RULE_ADD,
-                                            rule, family);
+                                            rule, family, extack);
                if (err)
                        break;
        }
index 0c57f68a93404784e4e22b4102408f8630963990..0c28bd469a6810007ef66c6c224c6314aed56a6c 100644 (file)
@@ -34,15 +34,16 @@ static unsigned int fib4_seq_read(struct net *net)
        return net->ipv4.fib_seq + fib4_rules_seq_read(net);
 }
 
-static int fib4_dump(struct net *net, struct notifier_block *nb)
+static int fib4_dump(struct net *net, struct notifier_block *nb,
+                    struct netlink_ext_ack *extack)
 {
        int err;
 
-       err = fib4_rules_dump(net, nb);
+       err = fib4_rules_dump(net, nb, extack);
        if (err)
                return err;
 
-       return fib_notify(net, nb);
+       return fib_notify(net, nb, extack);
 }
 
 static const struct fib_notifier_ops fib4_notifier_ops_template = {
index b43a7ba5c6a42310546836f7bc11d2fa15234d75..f99e3bac5cab20951d150b30efc438a7c1e4d404 100644 (file)
@@ -65,9 +65,10 @@ bool fib4_rule_default(const struct fib_rule *rule)
 }
 EXPORT_SYMBOL_GPL(fib4_rule_default);
 
-int fib4_rules_dump(struct net *net, struct notifier_block *nb)
+int fib4_rules_dump(struct net *net, struct notifier_block *nb,
+                   struct netlink_ext_ack *extack)
 {
-       return fib_rules_dump(net, nb, AF_INET);
+       return fib_rules_dump(net, nb, AF_INET, extack);
 }
 
 unsigned int fib4_rules_seq_read(struct net *net)
index 568e59423773368271d48bddac40f669906feea8..b9df9c09b84e5e6af9d6fcd1386ea669ba14a560 100644 (file)
 
 static int call_fib_entry_notifier(struct notifier_block *nb,
                                   enum fib_event_type event_type, u32 dst,
-                                  int dst_len, struct fib_alias *fa)
+                                  int dst_len, struct fib_alias *fa,
+                                  struct netlink_ext_ack *extack)
 {
        struct fib_entry_notifier_info info = {
+               .info.extack = extack,
                .dst = dst,
                .dst_len = dst_len,
                .fi = fa->fa_info,
@@ -2016,7 +2018,8 @@ void fib_info_notify_update(struct net *net, struct nl_info *info)
 }
 
 static int fib_leaf_notify(struct key_vector *l, struct fib_table *tb,
-                          struct notifier_block *nb)
+                          struct notifier_block *nb,
+                          struct netlink_ext_ack *extack)
 {
        struct fib_alias *fa;
        int err;
@@ -2034,14 +2037,16 @@ static int fib_leaf_notify(struct key_vector *l, struct fib_table *tb,
                        continue;
 
                err = call_fib_entry_notifier(nb, FIB_EVENT_ENTRY_ADD, l->key,
-                                             KEYLENGTH - fa->fa_slen, fa);
+                                             KEYLENGTH - fa->fa_slen,
+                                             fa, extack);
                if (err)
                        return err;
        }
        return 0;
 }
 
-static int fib_table_notify(struct fib_table *tb, struct notifier_block *nb)
+static int fib_table_notify(struct fib_table *tb, struct notifier_block *nb,
+                           struct netlink_ext_ack *extack)
 {
        struct trie *t = (struct trie *)tb->tb_data;
        struct key_vector *l, *tp = t->kv;
@@ -2049,7 +2054,7 @@ static int fib_table_notify(struct fib_table *tb, struct notifier_block *nb)
        int err;
 
        while ((l = leaf_walk_rcu(&tp, key)) != NULL) {
-               err = fib_leaf_notify(l, tb, nb);
+               err = fib_leaf_notify(l, tb, nb, extack);
                if (err)
                        return err;
 
@@ -2061,7 +2066,8 @@ static int fib_table_notify(struct fib_table *tb, struct notifier_block *nb)
        return 0;
 }
 
-int fib_notify(struct net *net, struct notifier_block *nb)
+int fib_notify(struct net *net, struct notifier_block *nb,
+              struct netlink_ext_ack *extack)
 {
        unsigned int h;
        int err;
@@ -2071,7 +2077,7 @@ int fib_notify(struct net *net, struct notifier_block *nb)
                struct fib_table *tb;
 
                hlist_for_each_entry_rcu(tb, head, tb_hlist) {
-                       err = fib_table_notify(tb, nb);
+                       err = fib_table_notify(tb, nb, extack);
                        if (err)
                                return err;
                }
index 313470f6bb148326b4afbc00d265b6a1e40d93bd..051f365b64d2bdae81a1762e81b01f89acfd788b 100644 (file)
@@ -278,9 +278,10 @@ static void __net_exit ipmr_rules_exit(struct net *net)
        rtnl_unlock();
 }
 
-static int ipmr_rules_dump(struct net *net, struct notifier_block *nb)
+static int ipmr_rules_dump(struct net *net, struct notifier_block *nb,
+                          struct netlink_ext_ack *extack)
 {
-       return fib_rules_dump(net, nb, RTNL_FAMILY_IPMR);
+       return fib_rules_dump(net, nb, RTNL_FAMILY_IPMR, extack);
 }
 
 static unsigned int ipmr_rules_seq_read(struct net *net)
@@ -336,7 +337,8 @@ static void __net_exit ipmr_rules_exit(struct net *net)
        rtnl_unlock();
 }
 
-static int ipmr_rules_dump(struct net *net, struct notifier_block *nb)
+static int ipmr_rules_dump(struct net *net, struct notifier_block *nb,
+                          struct netlink_ext_ack *extack)
 {
        return 0;
 }
@@ -3040,10 +3042,11 @@ static unsigned int ipmr_seq_read(struct net *net)
        return net->ipv4.ipmr_seq + ipmr_rules_seq_read(net);
 }
 
-static int ipmr_dump(struct net *net, struct notifier_block *nb)
+static int ipmr_dump(struct net *net, struct notifier_block *nb,
+                    struct netlink_ext_ack *extack)
 {
        return mr_dump(net, nb, RTNL_FAMILY_IPMR, ipmr_rules_dump,
-                      ipmr_mr_table_iter, &mrt_lock);
+                      ipmr_mr_table_iter, &mrt_lock, extack);
 }
 
 static const struct fib_notifier_ops ipmr_notifier_ops_template = {
index c4e23c2a0d5c654f44134d5e4417df4199b89d86..aa8738a91210a563a2bd7ee1fe17f3bcde1936de 100644 (file)
@@ -386,15 +386,17 @@ EXPORT_SYMBOL(mr_rtm_dumproute);
 
 int mr_dump(struct net *net, struct notifier_block *nb, unsigned short family,
            int (*rules_dump)(struct net *net,
-                             struct notifier_block *nb),
+                             struct notifier_block *nb,
+                             struct netlink_ext_ack *extack),
            struct mr_table *(*mr_iter)(struct net *net,
                                        struct mr_table *mrt),
-           rwlock_t *mrt_lock)
+           rwlock_t *mrt_lock,
+           struct netlink_ext_ack *extack)
 {
        struct mr_table *mrt;
        int err;
 
-       err = rules_dump(net, nb);
+       err = rules_dump(net, nb, extack);
        if (err)
                return err;
 
@@ -411,7 +413,7 @@ int mr_dump(struct net *net, struct notifier_block *nb, unsigned short family,
 
                        err = mr_call_vif_notifier(nb, family,
                                                   FIB_EVENT_VIF_ADD,
-                                                  v, vifi, mrt->id);
+                                                  v, vifi, mrt->id, extack);
                        if (err)
                                break;
                }
@@ -424,7 +426,7 @@ int mr_dump(struct net *net, struct notifier_block *nb, unsigned short family,
                list_for_each_entry_rcu(mfc, &mrt->mfc_cache_list, list) {
                        err = mr_call_mfc_notifier(nb, family,
                                                   FIB_EVENT_ENTRY_ADD,
-                                                  mfc, mrt->id);
+                                                  mfc, mrt->id, extack);
                        if (err)
                                return err;
                }
index 4fe79296999a1be17c42ae2313644f1520eb35a9..f87ae33e1d01f4e8d55f2af435bd8eff72bd9ea6 100644 (file)
@@ -27,15 +27,16 @@ static unsigned int fib6_seq_read(struct net *net)
        return fib6_tables_seq_read(net) + fib6_rules_seq_read(net);
 }
 
-static int fib6_dump(struct net *net, struct notifier_block *nb)
+static int fib6_dump(struct net *net, struct notifier_block *nb,
+                    struct netlink_ext_ack *extack)
 {
        int err;
 
-       err = fib6_rules_dump(net, nb);
+       err = fib6_rules_dump(net, nb, extack);
        if (err)
                return err;
 
-       return fib6_tables_dump(net, nb);
+       return fib6_tables_dump(net, nb, extack);
 }
 
 static const struct fib_notifier_ops fib6_notifier_ops_template = {
index f9e8fe3ff0c5b07f8e21ed76aa46a8da24181ff1..fafe556d21e0e4d82a165faa6b89cf47e8aa483c 100644 (file)
@@ -47,9 +47,10 @@ bool fib6_rule_default(const struct fib_rule *rule)
 }
 EXPORT_SYMBOL_GPL(fib6_rule_default);
 
-int fib6_rules_dump(struct net *net, struct notifier_block *nb)
+int fib6_rules_dump(struct net *net, struct notifier_block *nb,
+                   struct netlink_ext_ack *extack)
 {
-       return fib_rules_dump(net, nb, AF_INET6);
+       return fib_rules_dump(net, nb, AF_INET6, extack);
 }
 
 unsigned int fib6_rules_seq_read(struct net *net)
index 76124a9093959bb1fb7b4a53f1555512fd66e765..f66bc2af4e9d5c6814b9d65a8f40613c48b96032 100644 (file)
@@ -359,9 +359,11 @@ unsigned int fib6_tables_seq_read(struct net *net)
 
 static int call_fib6_entry_notifier(struct notifier_block *nb,
                                    enum fib_event_type event_type,
-                                   struct fib6_info *rt)
+                                   struct fib6_info *rt,
+                                   struct netlink_ext_ack *extack)
 {
        struct fib6_entry_notifier_info info = {
+               .info.extack = extack,
                .rt = rt,
        };
 
@@ -401,13 +403,15 @@ int call_fib6_multipath_entry_notifiers(struct net *net,
 struct fib6_dump_arg {
        struct net *net;
        struct notifier_block *nb;
+       struct netlink_ext_ack *extack;
 };
 
 static int fib6_rt_dump(struct fib6_info *rt, struct fib6_dump_arg *arg)
 {
        if (rt == arg->net->ipv6.fib6_null_entry)
                return 0;
-       return call_fib6_entry_notifier(arg->nb, FIB_EVENT_ENTRY_ADD, rt);
+       return call_fib6_entry_notifier(arg->nb, FIB_EVENT_ENTRY_ADD,
+                                       rt, arg->extack);
 }
 
 static int fib6_node_dump(struct fib6_walker *w)
@@ -437,7 +441,8 @@ static int fib6_table_dump(struct net *net, struct fib6_table *tb,
 }
 
 /* Called with rcu_read_lock() */
-int fib6_tables_dump(struct net *net, struct notifier_block *nb)
+int fib6_tables_dump(struct net *net, struct notifier_block *nb,
+                    struct netlink_ext_ack *extack)
 {
        struct fib6_dump_arg arg;
        struct fib6_walker *w;
@@ -451,6 +456,7 @@ int fib6_tables_dump(struct net *net, struct notifier_block *nb)
        w->func = fib6_node_dump;
        arg.net = net;
        arg.nb = nb;
+       arg.extack = extack;
        w->args = &arg;
 
        for (h = 0; h < FIB6_TABLE_HASHSZ; h++) {
index 857a89ad4d6c5fc973c6ad9f63acadea11623095..bfa49ff705311987910a111ee92b3bce33ffa696 100644 (file)
@@ -265,9 +265,10 @@ static void __net_exit ip6mr_rules_exit(struct net *net)
        rtnl_unlock();
 }
 
-static int ip6mr_rules_dump(struct net *net, struct notifier_block *nb)
+static int ip6mr_rules_dump(struct net *net, struct notifier_block *nb,
+                           struct netlink_ext_ack *extack)
 {
-       return fib_rules_dump(net, nb, RTNL_FAMILY_IP6MR);
+       return fib_rules_dump(net, nb, RTNL_FAMILY_IP6MR, extack);
 }
 
 static unsigned int ip6mr_rules_seq_read(struct net *net)
@@ -324,7 +325,8 @@ static void __net_exit ip6mr_rules_exit(struct net *net)
        rtnl_unlock();
 }
 
-static int ip6mr_rules_dump(struct net *net, struct notifier_block *nb)
+static int ip6mr_rules_dump(struct net *net, struct notifier_block *nb,
+                           struct netlink_ext_ack *extack)
 {
        return 0;
 }
@@ -1256,10 +1258,11 @@ static unsigned int ip6mr_seq_read(struct net *net)
        return net->ipv6.ipmr_seq + ip6mr_rules_seq_read(net);
 }
 
-static int ip6mr_dump(struct net *net, struct notifier_block *nb)
+static int ip6mr_dump(struct net *net, struct notifier_block *nb,
+                     struct netlink_ext_ack *extack)
 {
        return mr_dump(net, nb, RTNL_FAMILY_IP6MR, ip6mr_rules_dump,
-                      ip6mr_mr_table_iter, &mrt_lock);
+                      ip6mr_mr_table_iter, &mrt_lock, extack);
 }
 
 static struct notifier_block ip6_mr_notifier = {