@@ -125,7 +125,7 @@ static int ops_init(const struct pernet_operations *ops, struct net *net)
125
125
int err = - ENOMEM ;
126
126
void * data = NULL ;
127
127
128
- if (ops -> id && ops -> size ) {
128
+ if (ops -> id ) {
129
129
data = kzalloc (ops -> size , GFP_KERNEL );
130
130
if (!data )
131
131
goto out ;
@@ -140,7 +140,7 @@ static int ops_init(const struct pernet_operations *ops, struct net *net)
140
140
if (!err )
141
141
return 0 ;
142
142
143
- if (ops -> id && ops -> size ) {
143
+ if (ops -> id ) {
144
144
ng = rcu_dereference_protected (net -> gen ,
145
145
lockdep_is_held (& pernet_ops_rwsem ));
146
146
ng -> ptr [* ops -> id ] = NULL ;
@@ -182,7 +182,8 @@ static void ops_free_list(const struct pernet_operations *ops,
182
182
struct list_head * net_exit_list )
183
183
{
184
184
struct net * net ;
185
- if (ops -> size && ops -> id ) {
185
+
186
+ if (ops -> id ) {
186
187
list_for_each_entry (net , net_exit_list , exit_list )
187
188
kfree (net_generic (net , * ops -> id ));
188
189
}
@@ -308,36 +309,48 @@ struct net *get_net_ns_by_id(const struct net *net, int id)
308
309
}
309
310
EXPORT_SYMBOL_GPL (get_net_ns_by_id );
310
311
312
+ static __net_init void preinit_net_sysctl (struct net * net )
313
+ {
314
+ net -> core .sysctl_somaxconn = SOMAXCONN ;
315
+ /* Limits per socket sk_omem_alloc usage.
316
+ * TCP zerocopy regular usage needs 128 KB.
317
+ */
318
+ net -> core .sysctl_optmem_max = 128 * 1024 ;
319
+ net -> core .sysctl_txrehash = SOCK_TXREHASH_ENABLED ;
320
+ }
321
+
311
322
/* init code that must occur even if setup_net() is not called. */
312
- static __net_init void preinit_net (struct net * net )
323
+ static __net_init void preinit_net (struct net * net , struct user_namespace * user_ns )
313
324
{
325
+ refcount_set (& net -> passive , 1 );
326
+ refcount_set (& net -> ns .count , 1 );
327
+ ref_tracker_dir_init (& net -> refcnt_tracker , 128 , "net refcnt" );
314
328
ref_tracker_dir_init (& net -> notrefcnt_tracker , 128 , "net notrefcnt" );
329
+
330
+ get_random_bytes (& net -> hash_mix , sizeof (u32 ));
331
+ net -> dev_base_seq = 1 ;
332
+ net -> user_ns = user_ns ;
333
+
334
+ idr_init (& net -> netns_ids );
335
+ spin_lock_init (& net -> nsid_lock );
336
+ mutex_init (& net -> ipv4 .ra_mutex );
337
+ preinit_net_sysctl (net );
315
338
}
316
339
317
340
/*
318
341
* setup_net runs the initializers for the network namespace object.
319
342
*/
320
- static __net_init int setup_net (struct net * net , struct user_namespace * user_ns )
343
+ static __net_init int setup_net (struct net * net )
321
344
{
322
345
/* Must be called with pernet_ops_rwsem held */
323
346
const struct pernet_operations * ops , * saved_ops ;
324
347
LIST_HEAD (net_exit_list );
325
348
LIST_HEAD (dev_kill_list );
326
349
int error = 0 ;
327
350
328
- refcount_set (& net -> ns .count , 1 );
329
- ref_tracker_dir_init (& net -> refcnt_tracker , 128 , "net refcnt" );
330
-
331
- refcount_set (& net -> passive , 1 );
332
- get_random_bytes (& net -> hash_mix , sizeof (u32 ));
333
351
preempt_disable ();
334
352
net -> net_cookie = gen_cookie_next (& net_cookie );
335
353
preempt_enable ();
336
- net -> dev_base_seq = 1 ;
337
- net -> user_ns = user_ns ;
338
- idr_init (& net -> netns_ids );
339
- spin_lock_init (& net -> nsid_lock );
340
- mutex_init (& net -> ipv4 .ra_mutex );
341
354
342
355
list_for_each_entry (ops , & pernet_list , list ) {
343
356
error = ops_init (ops , net );
@@ -382,32 +395,6 @@ static __net_init int setup_net(struct net *net, struct user_namespace *user_ns)
382
395
goto out ;
383
396
}
384
397
385
- static int __net_init net_defaults_init_net (struct net * net )
386
- {
387
- net -> core .sysctl_somaxconn = SOMAXCONN ;
388
- /* Limits per socket sk_omem_alloc usage.
389
- * TCP zerocopy regular usage needs 128 KB.
390
- */
391
- net -> core .sysctl_optmem_max = 128 * 1024 ;
392
- net -> core .sysctl_txrehash = SOCK_TXREHASH_ENABLED ;
393
-
394
- return 0 ;
395
- }
396
-
397
- static struct pernet_operations net_defaults_ops = {
398
- .init = net_defaults_init_net ,
399
- };
400
-
401
- static __init int net_defaults_init (void )
402
- {
403
- if (register_pernet_subsys (& net_defaults_ops ))
404
- panic ("Cannot initialize net default settings" );
405
-
406
- return 0 ;
407
- }
408
-
409
- core_initcall (net_defaults_init );
410
-
411
398
#ifdef CONFIG_NET_NS
412
399
static struct ucounts * inc_net_namespaces (struct user_namespace * ns )
413
400
{
@@ -496,16 +483,15 @@ struct net *copy_net_ns(unsigned long flags,
496
483
goto dec_ucounts ;
497
484
}
498
485
499
- preinit_net (net );
500
- refcount_set (& net -> passive , 1 );
486
+ preinit_net (net , user_ns );
501
487
net -> ucounts = ucounts ;
502
488
get_user_ns (user_ns );
503
489
504
490
rv = down_read_killable (& pernet_ops_rwsem );
505
491
if (rv < 0 )
506
492
goto put_userns ;
507
493
508
- rv = setup_net (net , user_ns );
494
+ rv = setup_net (net );
509
495
510
496
up_read (& pernet_ops_rwsem );
511
497
@@ -1199,9 +1185,10 @@ void __init net_ns_init(void)
1199
1185
#ifdef CONFIG_KEYS
1200
1186
init_net .key_domain = & init_net_key_domain ;
1201
1187
#endif
1188
+ preinit_net (& init_net , & init_user_ns );
1189
+
1202
1190
down_write (& pernet_ops_rwsem );
1203
- preinit_net (& init_net );
1204
- if (setup_net (& init_net , & init_user_ns ))
1191
+ if (setup_net (& init_net ))
1205
1192
panic ("Could not setup the initial network namespace" );
1206
1193
1207
1194
init_net_initialized = true;
@@ -1244,7 +1231,7 @@ static int __register_pernet_operations(struct list_head *list,
1244
1231
LIST_HEAD (net_exit_list );
1245
1232
1246
1233
list_add_tail (& ops -> list , list );
1247
- if (ops -> init || ( ops -> id && ops -> size ) ) {
1234
+ if (ops -> init || ops -> id ) {
1248
1235
/* We held write locked pernet_ops_rwsem, and parallel
1249
1236
* setup_net() and cleanup_net() are not possible.
1250
1237
*/
@@ -1310,6 +1297,9 @@ static int register_pernet_operations(struct list_head *list,
1310
1297
{
1311
1298
int error ;
1312
1299
1300
+ if (WARN_ON (!!ops -> id ^ !!ops -> size ))
1301
+ return - EINVAL ;
1302
+
1313
1303
if (ops -> id ) {
1314
1304
error = ida_alloc_min (& net_generic_ids , MIN_PERNET_OPS_ID ,
1315
1305
GFP_KERNEL );
0 commit comments