diff options
| -rw-r--r-- | net/core/net_namespace.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/net/core/net_namespace.c b/net/core/net_namespace.c index 4026a4cff93c..bd8c4712ea24 100644 --- a/net/core/net_namespace.c +++ b/net/core/net_namespace.c | |||
| @@ -413,8 +413,11 @@ again: | |||
| 413 | } | 413 | } |
| 414 | } | 414 | } |
| 415 | error = __register_pernet_operations(list, ops); | 415 | error = __register_pernet_operations(list, ops); |
| 416 | if (error && ops->id) | 416 | if (error) { |
| 417 | ida_remove(&net_generic_ids, *ops->id); | 417 | rcu_barrier(); |
| 418 | if (ops->id) | ||
| 419 | ida_remove(&net_generic_ids, *ops->id); | ||
| 420 | } | ||
| 418 | 421 | ||
| 419 | return error; | 422 | return error; |
| 420 | } | 423 | } |
| @@ -423,6 +426,7 @@ static void unregister_pernet_operations(struct pernet_operations *ops) | |||
| 423 | { | 426 | { |
| 424 | 427 | ||
| 425 | __unregister_pernet_operations(ops); | 428 | __unregister_pernet_operations(ops); |
| 429 | rcu_barrier(); | ||
| 426 | if (ops->id) | 430 | if (ops->id) |
| 427 | ida_remove(&net_generic_ids, *ops->id); | 431 | ida_remove(&net_generic_ids, *ops->id); |
| 428 | } | 432 | } |
