void __net_exit fib4_notifier_exit(struct net *net);
 
 void fib_info_notify_update(struct net *net, struct nl_info *info);
-void fib_notify(struct net *net, struct notifier_block *nb);
+int fib_notify(struct net *net, struct notifier_block *nb);
 
 struct fib_table {
        struct hlist_node       tb_hlist;
 
 {
        struct fib_rules_ops *ops;
        struct fib_rule *rule;
+       int err = 0;
 
        ops = lookup_rules_ops(net, family);
        if (!ops)
                return -EAFNOSUPPORT;
-       list_for_each_entry_rcu(rule, &ops->rules_list, list)
-               call_fib_rule_notifier(nb, FIB_EVENT_RULE_ADD, rule, family);
+       list_for_each_entry_rcu(rule, &ops->rules_list, list) {
+               err = call_fib_rule_notifier(nb, FIB_EVENT_RULE_ADD,
+                                            rule, family);
+               if (err)
+                       break;
+       }
        rules_ops_put(ops);
 
-       return 0;
+       return err;
 }
 EXPORT_SYMBOL_GPL(fib_rules_dump);
 
 
        if (err)
                return err;
 
-       fib_notify(net, nb);
-
-       return 0;
+       return fib_notify(net, nb);
 }
 
 static const struct fib_notifier_ops fib4_notifier_ops_template = {
 
        }
 }
 
-static void fib_leaf_notify(struct key_vector *l, struct fib_table *tb,
-                           struct notifier_block *nb)
+static int fib_leaf_notify(struct key_vector *l, struct fib_table *tb,
+                          struct notifier_block *nb)
 {
        struct fib_alias *fa;
+       int err;
 
        hlist_for_each_entry_rcu(fa, &l->leaf, fa_list) {
                struct fib_info *fi = fa->fa_info;
                if (tb->tb_id != fa->tb_id)
                        continue;
 
-               call_fib_entry_notifier(nb, FIB_EVENT_ENTRY_ADD, l->key,
-                                       KEYLENGTH - fa->fa_slen, fa);
+               err = call_fib_entry_notifier(nb, FIB_EVENT_ENTRY_ADD, l->key,
+                                             KEYLENGTH - fa->fa_slen, fa);
+               if (err)
+                       return err;
        }
+       return 0;
 }
 
-static void 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 trie *t = (struct trie *)tb->tb_data;
        struct key_vector *l, *tp = t->kv;
        t_key key = 0;
+       int err;
 
        while ((l = leaf_walk_rcu(&tp, key)) != NULL) {
-               fib_leaf_notify(l, tb, nb);
+               err = fib_leaf_notify(l, tb, nb);
+               if (err)
+                       return err;
 
                key = l->key + 1;
                /* stop in case of wrap around */
                if (key < l->key)
                        break;
        }
+       return 0;
 }
 
-void fib_notify(struct net *net, struct notifier_block *nb)
+int fib_notify(struct net *net, struct notifier_block *nb)
 {
        unsigned int h;
+       int err;
 
        for (h = 0; h < FIB_TABLE_HASHSZ; h++) {
                struct hlist_head *head = &net->ipv4.fib_table_hash[h];
                struct fib_table *tb;
 
-               hlist_for_each_entry_rcu(tb, head, tb_hlist)
-                       fib_table_notify(tb, nb);
+               hlist_for_each_entry_rcu(tb, head, tb_hlist) {
+                       err = fib_table_notify(tb, nb);
+                       if (err)
+                               return err;
+               }
        }
+       return 0;
 }
 
 static void __trie_free_rcu(struct rcu_head *head)
 
                        if (!v->dev)
                                continue;
 
-                       mr_call_vif_notifier(nb, family,
-                                            FIB_EVENT_VIF_ADD,
-                                            v, vifi, mrt->id);
+                       err = mr_call_vif_notifier(nb, family,
+                                                  FIB_EVENT_VIF_ADD,
+                                                  v, vifi, mrt->id);
+                       if (err)
+                               break;
                }
                read_unlock(mrt_lock);
 
+               if (err)
+                       return err;
+
                /* Notify on table MFC entries */
-               list_for_each_entry_rcu(mfc, &mrt->mfc_cache_list, list)
-                       mr_call_mfc_notifier(nb, family,
-                                            FIB_EVENT_ENTRY_ADD,
-                                            mfc, mrt->id);
+               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);
+                       if (err)
+                               return err;
+               }
        }
 
        return 0;
 
        struct notifier_block *nb;
 };
 
-static void fib6_rt_dump(struct fib6_info *rt, struct fib6_dump_arg *arg)
+static int fib6_rt_dump(struct fib6_info *rt, struct fib6_dump_arg *arg)
 {
        if (rt == arg->net->ipv6.fib6_null_entry)
-               return;
-       call_fib6_entry_notifier(arg->nb, FIB_EVENT_ENTRY_ADD, rt);
+               return 0;
+       return call_fib6_entry_notifier(arg->nb, FIB_EVENT_ENTRY_ADD, rt);
 }
 
 static int fib6_node_dump(struct fib6_walker *w)
 {
        struct fib6_info *rt;
+       int err = 0;
 
-       for_each_fib6_walker_rt(w)
-               fib6_rt_dump(rt, w->args);
+       for_each_fib6_walker_rt(w) {
+               err = fib6_rt_dump(rt, w->args);
+               if (err)
+                       break;
+       }
        w->leaf = NULL;
-       return 0;
+       return err;
 }
 
-static void fib6_table_dump(struct net *net, struct fib6_table *tb,
-                           struct fib6_walker *w)
+static int fib6_table_dump(struct net *net, struct fib6_table *tb,
+                          struct fib6_walker *w)
 {
+       int err;
+
        w->root = &tb->tb6_root;
        spin_lock_bh(&tb->tb6_lock);
-       fib6_walk(net, w);
+       err = fib6_walk(net, w);
        spin_unlock_bh(&tb->tb6_lock);
+       return err;
 }
 
 /* Called with rcu_read_lock() */
        struct fib6_dump_arg arg;
        struct fib6_walker *w;
        unsigned int h;
+       int err = 0;
 
        w = kzalloc(sizeof(*w), GFP_ATOMIC);
        if (!w)
                struct hlist_head *head = &net->ipv6.fib_table_hash[h];
                struct fib6_table *tb;
 
-               hlist_for_each_entry_rcu(tb, head, tb6_hlist)
-                       fib6_table_dump(net, tb, w);
+               hlist_for_each_entry_rcu(tb, head, tb6_hlist) {
+                       err = fib6_table_dump(net, tb, w);
+                       if (err < 0)
+                               goto out;
+               }
        }
 
+out:
        kfree(w);
 
-       return 0;
+       return err;
 }
 
 static int fib6_dump_node(struct fib6_walker *w)