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 | } |