aboutsummaryrefslogtreecommitdiffstats
path: root/net/core/net_namespace.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/core/net_namespace.c')
-rw-r--r--net/core/net_namespace.c40
1 files changed, 20 insertions, 20 deletions
diff --git a/net/core/net_namespace.c b/net/core/net_namespace.c
index eef17ad29dea..9e8ee4640451 100644
--- a/net/core/net_namespace.c
+++ b/net/core/net_namespace.c
@@ -41,10 +41,10 @@ EXPORT_SYMBOL(init_net);
41 41
42static bool init_net_initialized; 42static bool init_net_initialized;
43/* 43/*
44 * net_sem: protects: pernet_list, net_generic_ids, 44 * pernet_ops_rwsem: protects: pernet_list, net_generic_ids,
45 * init_net_initialized and first_device pointer. 45 * init_net_initialized and first_device pointer.
46 */ 46 */
47DECLARE_RWSEM(net_sem); 47DECLARE_RWSEM(pernet_ops_rwsem);
48 48
49#define MIN_PERNET_OPS_ID \ 49#define MIN_PERNET_OPS_ID \
50 ((sizeof(struct net_generic) + sizeof(void *) - 1) / sizeof(void *)) 50 ((sizeof(struct net_generic) + sizeof(void *) - 1) / sizeof(void *))
@@ -72,7 +72,7 @@ static int net_assign_generic(struct net *net, unsigned int id, void *data)
72 BUG_ON(id < MIN_PERNET_OPS_ID); 72 BUG_ON(id < MIN_PERNET_OPS_ID);
73 73
74 old_ng = rcu_dereference_protected(net->gen, 74 old_ng = rcu_dereference_protected(net->gen,
75 lockdep_is_held(&net_sem)); 75 lockdep_is_held(&pernet_ops_rwsem));
76 if (old_ng->s.len > id) { 76 if (old_ng->s.len > id) {
77 old_ng->ptr[id] = data; 77 old_ng->ptr[id] = data;
78 return 0; 78 return 0;
@@ -289,7 +289,7 @@ struct net *get_net_ns_by_id(struct net *net, int id)
289 */ 289 */
290static __net_init int setup_net(struct net *net, struct user_namespace *user_ns) 290static __net_init int setup_net(struct net *net, struct user_namespace *user_ns)
291{ 291{
292 /* Must be called with net_sem held */ 292 /* Must be called with pernet_ops_rwsem held */
293 const struct pernet_operations *ops, *saved_ops; 293 const struct pernet_operations *ops, *saved_ops;
294 int error = 0; 294 int error = 0;
295 LIST_HEAD(net_exit_list); 295 LIST_HEAD(net_exit_list);
@@ -422,13 +422,13 @@ struct net *copy_net_ns(unsigned long flags,
422 net->ucounts = ucounts; 422 net->ucounts = ucounts;
423 get_user_ns(user_ns); 423 get_user_ns(user_ns);
424 424
425 rv = down_read_killable(&net_sem); 425 rv = down_read_killable(&pernet_ops_rwsem);
426 if (rv < 0) 426 if (rv < 0)
427 goto put_userns; 427 goto put_userns;
428 428
429 rv = setup_net(net, user_ns); 429 rv = setup_net(net, user_ns);
430 430
431 up_read(&net_sem); 431 up_read(&pernet_ops_rwsem);
432 432
433 if (rv < 0) { 433 if (rv < 0) {
434put_userns: 434put_userns:
@@ -480,7 +480,7 @@ static void cleanup_net(struct work_struct *work)
480 /* Atomically snapshot the list of namespaces to cleanup */ 480 /* Atomically snapshot the list of namespaces to cleanup */
481 net_kill_list = llist_del_all(&cleanup_list); 481 net_kill_list = llist_del_all(&cleanup_list);
482 482
483 down_read(&net_sem); 483 down_read(&pernet_ops_rwsem);
484 484
485 /* Don't let anyone else find us. */ 485 /* Don't let anyone else find us. */
486 rtnl_lock(); 486 rtnl_lock();
@@ -519,7 +519,7 @@ static void cleanup_net(struct work_struct *work)
519 list_for_each_entry_reverse(ops, &pernet_list, list) 519 list_for_each_entry_reverse(ops, &pernet_list, list)
520 ops_free_list(ops, &net_exit_list); 520 ops_free_list(ops, &net_exit_list);
521 521
522 up_read(&net_sem); 522 up_read(&pernet_ops_rwsem);
523 523
524 /* Ensure there are no outstanding rcu callbacks using this 524 /* Ensure there are no outstanding rcu callbacks using this
525 * network namespace. 525 * network namespace.
@@ -546,8 +546,8 @@ static void cleanup_net(struct work_struct *work)
546 */ 546 */
547void net_ns_barrier(void) 547void net_ns_barrier(void)
548{ 548{
549 down_write(&net_sem); 549 down_write(&pernet_ops_rwsem);
550 up_write(&net_sem); 550 up_write(&pernet_ops_rwsem);
551} 551}
552EXPORT_SYMBOL(net_ns_barrier); 552EXPORT_SYMBOL(net_ns_barrier);
553 553
@@ -869,12 +869,12 @@ static int __init net_ns_init(void)
869 869
870 rcu_assign_pointer(init_net.gen, ng); 870 rcu_assign_pointer(init_net.gen, ng);
871 871
872 down_write(&net_sem); 872 down_write(&pernet_ops_rwsem);
873 if (setup_net(&init_net, &init_user_ns)) 873 if (setup_net(&init_net, &init_user_ns))
874 panic("Could not setup the initial network namespace"); 874 panic("Could not setup the initial network namespace");
875 875
876 init_net_initialized = true; 876 init_net_initialized = true;
877 up_write(&net_sem); 877 up_write(&pernet_ops_rwsem);
878 878
879 register_pernet_subsys(&net_ns_ops); 879 register_pernet_subsys(&net_ns_ops);
880 880
@@ -1013,9 +1013,9 @@ static void unregister_pernet_operations(struct pernet_operations *ops)
1013int register_pernet_subsys(struct pernet_operations *ops) 1013int register_pernet_subsys(struct pernet_operations *ops)
1014{ 1014{
1015 int error; 1015 int error;
1016 down_write(&net_sem); 1016 down_write(&pernet_ops_rwsem);
1017 error = register_pernet_operations(first_device, ops); 1017 error = register_pernet_operations(first_device, ops);
1018 up_write(&net_sem); 1018 up_write(&pernet_ops_rwsem);
1019 return error; 1019 return error;
1020} 1020}
1021EXPORT_SYMBOL_GPL(register_pernet_subsys); 1021EXPORT_SYMBOL_GPL(register_pernet_subsys);
@@ -1031,9 +1031,9 @@ EXPORT_SYMBOL_GPL(register_pernet_subsys);
1031 */ 1031 */
1032void unregister_pernet_subsys(struct pernet_operations *ops) 1032void unregister_pernet_subsys(struct pernet_operations *ops)
1033{ 1033{
1034 down_write(&net_sem); 1034 down_write(&pernet_ops_rwsem);
1035 unregister_pernet_operations(ops); 1035 unregister_pernet_operations(ops);
1036 up_write(&net_sem); 1036 up_write(&pernet_ops_rwsem);
1037} 1037}
1038EXPORT_SYMBOL_GPL(unregister_pernet_subsys); 1038EXPORT_SYMBOL_GPL(unregister_pernet_subsys);
1039 1039
@@ -1059,11 +1059,11 @@ EXPORT_SYMBOL_GPL(unregister_pernet_subsys);
1059int register_pernet_device(struct pernet_operations *ops) 1059int register_pernet_device(struct pernet_operations *ops)
1060{ 1060{
1061 int error; 1061 int error;
1062 down_write(&net_sem); 1062 down_write(&pernet_ops_rwsem);
1063 error = register_pernet_operations(&pernet_list, ops); 1063 error = register_pernet_operations(&pernet_list, ops);
1064 if (!error && (first_device == &pernet_list)) 1064 if (!error && (first_device == &pernet_list))
1065 first_device = &ops->list; 1065 first_device = &ops->list;
1066 up_write(&net_sem); 1066 up_write(&pernet_ops_rwsem);
1067 return error; 1067 return error;
1068} 1068}
1069EXPORT_SYMBOL_GPL(register_pernet_device); 1069EXPORT_SYMBOL_GPL(register_pernet_device);
@@ -1079,11 +1079,11 @@ EXPORT_SYMBOL_GPL(register_pernet_device);
1079 */ 1079 */
1080void unregister_pernet_device(struct pernet_operations *ops) 1080void unregister_pernet_device(struct pernet_operations *ops)
1081{ 1081{
1082 down_write(&net_sem); 1082 down_write(&pernet_ops_rwsem);
1083 if (&ops->list == first_device) 1083 if (&ops->list == first_device)
1084 first_device = first_device->next; 1084 first_device = first_device->next;
1085 unregister_pernet_operations(ops); 1085 unregister_pernet_operations(ops);
1086 up_write(&net_sem); 1086 up_write(&pernet_ops_rwsem);
1087} 1087}
1088EXPORT_SYMBOL_GPL(unregister_pernet_device); 1088EXPORT_SYMBOL_GPL(unregister_pernet_device);
1089 1089