summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/net/fib_rules.h1
-rw-r--r--include/net/ip6_fib.h2
-rw-r--r--net/core/fib_rules.c5
-rw-r--r--net/ipv6/fib6_rules.c19
4 files changed, 21 insertions, 6 deletions
diff --git a/include/net/fib_rules.h b/include/net/fib_rules.h
index 41a301e3864..2364db1a47e 100644
--- a/include/net/fib_rules.h
+++ b/include/net/fib_rules.h
@@ -103,6 +103,7 @@ static inline u32 frh_get_table(struct fib_rule_hdr *frh, struct nlattr **nla)
extern int fib_rules_register(struct fib_rules_ops *);
extern int fib_rules_unregister(struct fib_rules_ops *);
+extern void fib_rules_cleanup_ops(struct fib_rules_ops *);
extern int fib_rules_lookup(struct fib_rules_ops *,
struct flowi *, int flags,
diff --git a/include/net/ip6_fib.h b/include/net/ip6_fib.h
index 5d39ce92afc..eaa31586879 100644
--- a/include/net/ip6_fib.h
+++ b/include/net/ip6_fib.h
@@ -226,7 +226,7 @@ extern void fib6_gc_cleanup(void);
extern int fib6_init(void);
-extern void fib6_rules_init(void);
+extern int fib6_rules_init(void);
extern void fib6_rules_cleanup(void);
#endif
diff --git a/net/core/fib_rules.c b/net/core/fib_rules.c
index 0af0538343d..fcbf41c0a5d 100644
--- a/net/core/fib_rules.c
+++ b/net/core/fib_rules.c
@@ -102,7 +102,7 @@ errout:
EXPORT_SYMBOL_GPL(fib_rules_register);
-static void cleanup_ops(struct fib_rules_ops *ops)
+void fib_rules_cleanup_ops(struct fib_rules_ops *ops)
{
struct fib_rule *rule, *tmp;
@@ -111,6 +111,7 @@ static void cleanup_ops(struct fib_rules_ops *ops)
fib_rule_put(rule);
}
}
+EXPORT_SYMBOL_GPL(fib_rules_cleanup_ops);
int fib_rules_unregister(struct fib_rules_ops *ops)
{
@@ -121,7 +122,7 @@ int fib_rules_unregister(struct fib_rules_ops *ops)
list_for_each_entry(o, &rules_ops, list) {
if (o == ops) {
list_del_rcu(&o->list);
- cleanup_ops(ops);
+ fib_rules_cleanup_ops(ops);
goto out;
}
}
diff --git a/net/ipv6/fib6_rules.c b/net/ipv6/fib6_rules.c
index 428c6b0e26d..9ce2e0a6748 100644
--- a/net/ipv6/fib6_rules.c
+++ b/net/ipv6/fib6_rules.c
@@ -265,10 +265,23 @@ static int __init fib6_default_rules_init(void)
return 0;
}
-void __init fib6_rules_init(void)
+int __init fib6_rules_init(void)
{
- BUG_ON(fib6_default_rules_init());
- fib_rules_register(&fib6_rules_ops);
+ int ret;
+
+ ret = fib6_default_rules_init();
+ if (ret)
+ goto out;
+
+ ret = fib_rules_register(&fib6_rules_ops);
+ if (ret)
+ goto out_default_rules_init;
+out:
+ return ret;
+
+out_default_rules_init:
+ fib_rules_cleanup_ops(&fib6_rules_ops);
+ goto out;
}
void fib6_rules_cleanup(void)