diff options
Diffstat (limited to 'net/ipv6/fib6_rules.c')
-rw-r--r-- | net/ipv6/fib6_rules.c | 24 |
1 files changed, 8 insertions, 16 deletions
diff --git a/net/ipv6/fib6_rules.c b/net/ipv6/fib6_rules.c index 00a7a5e4ac97..b7aa7c64cc4a 100644 --- a/net/ipv6/fib6_rules.c +++ b/net/ipv6/fib6_rules.c | |||
@@ -264,44 +264,36 @@ static struct fib_rules_ops fib6_rules_ops_template = { | |||
264 | 264 | ||
265 | static int fib6_rules_net_init(struct net *net) | 265 | static int fib6_rules_net_init(struct net *net) |
266 | { | 266 | { |
267 | struct fib_rules_ops *ops; | ||
267 | int err = -ENOMEM; | 268 | int err = -ENOMEM; |
268 | 269 | ||
269 | net->ipv6.fib6_rules_ops = kmemdup(&fib6_rules_ops_template, | 270 | ops = fib_rules_register(&fib6_rules_ops_template, net); |
270 | sizeof(*net->ipv6.fib6_rules_ops), | 271 | if (IS_ERR(ops)) |
271 | GFP_KERNEL); | 272 | return PTR_ERR(ops); |
272 | if (!net->ipv6.fib6_rules_ops) | 273 | net->ipv6.fib6_rules_ops = ops; |
273 | goto out; | ||
274 | 274 | ||
275 | net->ipv6.fib6_rules_ops->fro_net = net; | ||
276 | INIT_LIST_HEAD(&net->ipv6.fib6_rules_ops->rules_list); | ||
277 | 275 | ||
278 | err = fib_default_rule_add(net->ipv6.fib6_rules_ops, 0, | 276 | err = fib_default_rule_add(net->ipv6.fib6_rules_ops, 0, |
279 | RT6_TABLE_LOCAL, FIB_RULE_PERMANENT); | 277 | RT6_TABLE_LOCAL, 0); |
280 | if (err) | 278 | if (err) |
281 | goto out_fib6_rules_ops; | 279 | goto out_fib6_rules_ops; |
282 | 280 | ||
283 | err = fib_default_rule_add(net->ipv6.fib6_rules_ops, | 281 | err = fib_default_rule_add(net->ipv6.fib6_rules_ops, |
284 | 0x7FFE, RT6_TABLE_MAIN, 0); | 282 | 0x7FFE, RT6_TABLE_MAIN, 0); |
285 | if (err) | 283 | if (err) |
286 | goto out_fib6_default_rule_add; | 284 | goto out_fib6_rules_ops; |
287 | 285 | ||
288 | err = fib_rules_register(net->ipv6.fib6_rules_ops); | ||
289 | if (err) | ||
290 | goto out_fib6_default_rule_add; | ||
291 | out: | 286 | out: |
292 | return err; | 287 | return err; |
293 | 288 | ||
294 | out_fib6_default_rule_add: | ||
295 | fib_rules_cleanup_ops(net->ipv6.fib6_rules_ops); | ||
296 | out_fib6_rules_ops: | 289 | out_fib6_rules_ops: |
297 | kfree(net->ipv6.fib6_rules_ops); | 290 | fib_rules_unregister(ops); |
298 | goto out; | 291 | goto out; |
299 | } | 292 | } |
300 | 293 | ||
301 | static void fib6_rules_net_exit(struct net *net) | 294 | static void fib6_rules_net_exit(struct net *net) |
302 | { | 295 | { |
303 | fib_rules_unregister(net->ipv6.fib6_rules_ops); | 296 | fib_rules_unregister(net->ipv6.fib6_rules_ops); |
304 | kfree(net->ipv6.fib6_rules_ops); | ||
305 | } | 297 | } |
306 | 298 | ||
307 | static struct pernet_operations fib6_rules_net_ops = { | 299 | static struct pernet_operations fib6_rules_net_ops = { |