diff options
author | Eric W. Biederman <ebiederm@xmission.com> | 2009-12-03 15:22:55 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-12-03 15:22:55 -0500 |
commit | e9c5158ac26affd5d8ce006521bdfb7148090e18 (patch) | |
tree | a8d43fb446a1908175923f4109c977dcb84e4f91 /net/ipv4 | |
parent | 3a765edadb28cc736d185f67d1ba6bedcc85f4b9 (diff) |
net: Allow fib_rule_unregister to batch
Refactor the code so fib_rules_register always takes a template instead
of the actual fib_rules_ops structure that will be used. This is
required for network namespace support so 2 out of the 3 callers already
do this, it allows the error handling to be made common, and it allows
fib_rules_unregister to free the template for hte caller.
Modify fib_rules_unregister to use call_rcu instead of syncrhonize_rcu
to allw multiple namespaces to be cleaned up in the same rcu grace
period.
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4')
-rw-r--r-- | net/ipv4/fib_rules.c | 12 |
1 files changed, 3 insertions, 9 deletions
diff --git a/net/ipv4/fib_rules.c b/net/ipv4/fib_rules.c index 1239ed23cab6..ca2d07b1c706 100644 --- a/net/ipv4/fib_rules.c +++ b/net/ipv4/fib_rules.c | |||
@@ -301,13 +301,9 @@ int __net_init fib4_rules_init(struct net *net) | |||
301 | int err; | 301 | int err; |
302 | struct fib_rules_ops *ops; | 302 | struct fib_rules_ops *ops; |
303 | 303 | ||
304 | ops = kmemdup(&fib4_rules_ops_template, sizeof(*ops), GFP_KERNEL); | 304 | ops = fib_rules_register(&fib4_rules_ops_template, net); |
305 | if (ops == NULL) | 305 | if (IS_ERR(ops)) |
306 | return -ENOMEM; | 306 | return PTR_ERR(ops); |
307 | INIT_LIST_HEAD(&ops->rules_list); | ||
308 | ops->fro_net = net; | ||
309 | |||
310 | fib_rules_register(ops); | ||
311 | 307 | ||
312 | err = fib_default_rules_init(ops); | 308 | err = fib_default_rules_init(ops); |
313 | if (err < 0) | 309 | if (err < 0) |
@@ -318,12 +314,10 @@ int __net_init fib4_rules_init(struct net *net) | |||
318 | fail: | 314 | fail: |
319 | /* also cleans all rules already added */ | 315 | /* also cleans all rules already added */ |
320 | fib_rules_unregister(ops); | 316 | fib_rules_unregister(ops); |
321 | kfree(ops); | ||
322 | return err; | 317 | return err; |
323 | } | 318 | } |
324 | 319 | ||
325 | void __net_exit fib4_rules_exit(struct net *net) | 320 | void __net_exit fib4_rules_exit(struct net *net) |
326 | { | 321 | { |
327 | fib_rules_unregister(net->ipv4.rules_ops); | 322 | fib_rules_unregister(net->ipv4.rules_ops); |
328 | kfree(net->ipv4.rules_ops); | ||
329 | } | 323 | } |