aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Lezcano <dlezcano@fr.ibm.com>2007-12-07 03:42:52 -0500
committerDavid S. Miller <davem@davemloft.net>2008-01-28 17:56:46 -0500
commit9eb87f3f7e0686a256c5bb4f886dede0171245f2 (patch)
tree64ca735755b0c5a70eec1cfda0a3ebef5a31c419
parent0013cabab30ec55830ce63d34c0bdd887eb87644 (diff)
[IPV6]: Make fib6_rules_init to return an error code.
When the fib_rules initialization finished, no return code is provided so there is no way to know, for the caller, if the initialization has been successful or has failed. This patch fix that. Signed-off-by: Daniel Lezcano <dlezcano@fr.ibm.com> Acked-by: Benjamin Thery <benjamin.thery@bull.net> Signed-off-by: David S. Miller <davem@davemloft.net>
-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 41a301e38643..2364db1a47e6 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)
103 103
104extern int fib_rules_register(struct fib_rules_ops *); 104extern int fib_rules_register(struct fib_rules_ops *);
105extern int fib_rules_unregister(struct fib_rules_ops *); 105extern int fib_rules_unregister(struct fib_rules_ops *);
106extern void fib_rules_cleanup_ops(struct fib_rules_ops *);
106 107
107extern int fib_rules_lookup(struct fib_rules_ops *, 108extern int fib_rules_lookup(struct fib_rules_ops *,
108 struct flowi *, int flags, 109 struct flowi *, int flags,
diff --git a/include/net/ip6_fib.h b/include/net/ip6_fib.h
index 5d39ce92afcf..eaa315868792 100644
--- a/include/net/ip6_fib.h
+++ b/include/net/ip6_fib.h
@@ -226,7 +226,7 @@ extern void fib6_gc_cleanup(void);
226 226
227extern int fib6_init(void); 227extern int fib6_init(void);
228 228
229extern void fib6_rules_init(void); 229extern int fib6_rules_init(void);
230extern void fib6_rules_cleanup(void); 230extern void fib6_rules_cleanup(void);
231 231
232#endif 232#endif
diff --git a/net/core/fib_rules.c b/net/core/fib_rules.c
index 0af0538343da..fcbf41c0a5d4 100644
--- a/net/core/fib_rules.c
+++ b/net/core/fib_rules.c
@@ -102,7 +102,7 @@ errout:
102 102
103EXPORT_SYMBOL_GPL(fib_rules_register); 103EXPORT_SYMBOL_GPL(fib_rules_register);
104 104
105static void cleanup_ops(struct fib_rules_ops *ops) 105void fib_rules_cleanup_ops(struct fib_rules_ops *ops)
106{ 106{
107 struct fib_rule *rule, *tmp; 107 struct fib_rule *rule, *tmp;
108 108
@@ -111,6 +111,7 @@ static void cleanup_ops(struct fib_rules_ops *ops)
111 fib_rule_put(rule); 111 fib_rule_put(rule);
112 } 112 }
113} 113}
114EXPORT_SYMBOL_GPL(fib_rules_cleanup_ops);
114 115
115int fib_rules_unregister(struct fib_rules_ops *ops) 116int fib_rules_unregister(struct fib_rules_ops *ops)
116{ 117{
@@ -121,7 +122,7 @@ int fib_rules_unregister(struct fib_rules_ops *ops)
121 list_for_each_entry(o, &rules_ops, list) { 122 list_for_each_entry(o, &rules_ops, list) {
122 if (o == ops) { 123 if (o == ops) {
123 list_del_rcu(&o->list); 124 list_del_rcu(&o->list);
124 cleanup_ops(ops); 125 fib_rules_cleanup_ops(ops);
125 goto out; 126 goto out;
126 } 127 }
127 } 128 }
diff --git a/net/ipv6/fib6_rules.c b/net/ipv6/fib6_rules.c
index 428c6b0e26d8..9ce2e0a6748a 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)
265 return 0; 265 return 0;
266} 266}
267 267
268void __init fib6_rules_init(void) 268int __init fib6_rules_init(void)
269{ 269{
270 BUG_ON(fib6_default_rules_init()); 270 int ret;
271 fib_rules_register(&fib6_rules_ops); 271
272 ret = fib6_default_rules_init();
273 if (ret)
274 goto out;
275
276 ret = fib_rules_register(&fib6_rules_ops);
277 if (ret)
278 goto out_default_rules_init;
279out:
280 return ret;
281
282out_default_rules_init:
283 fib_rules_cleanup_ops(&fib6_rules_ops);
284 goto out;
272} 285}
273 286
274void fib6_rules_cleanup(void) 287void fib6_rules_cleanup(void)