Commit eeb61f719c00c626115852bbc91189dc3011a844

Authored by Al Viro
Committed by Linus Torvalds
1 parent bfbcf03479

missing bits of net-namespace / sysctl

Piss-poor sysctl registration API strikes again, film at 11...

What we really need is _pathname_ required to be present in already
registered table, so that kernel could warn about bad order.  That's the
next target for sysctl stuff (and generally saner and more explicit
order of initialization of ipv[46] internals wouldn't hurt either).

For the time being, here are full fixups required by ..._rotable()
stuff; we make per-net sysctl sets descendents of "ro" one and make sure
that sufficient skeleton is there before we start registering per-net
sysctls.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

Showing 7 changed files with 43 additions and 18 deletions Side-by-side Diff

... ... @@ -608,6 +608,8 @@
608 608 extern struct ctl_table *ipv6_route_sysctl_init(struct net *net);
609 609 extern int ipv6_sysctl_register(void);
610 610 extern void ipv6_sysctl_unregister(void);
  611 +extern int ipv6_static_sysctl_register(void);
  612 +extern void ipv6_static_sysctl_unregister(void);
611 613 #endif
612 614  
613 615 #endif /* __KERNEL__ */
... ... @@ -204,7 +204,5 @@
204 204 return rt->peer;
205 205 }
206 206  
207   -extern ctl_table ipv4_route_table[];
208   -
209 207 #endif /* _ROUTE_H */
... ... @@ -2914,7 +2914,7 @@
2914 2914 return 0;
2915 2915 }
2916 2916  
2917   -ctl_table ipv4_route_table[] = {
  2917 +static ctl_table ipv4_route_table[] = {
2918 2918 {
2919 2919 .ctl_name = NET_IPV4_ROUTE_GC_THRESH,
2920 2920 .procname = "gc_thresh",
... ... @@ -3214,6 +3214,15 @@
3214 3214 register_pernet_subsys(&sysctl_route_ops);
3215 3215 #endif
3216 3216 return rc;
  3217 +}
  3218 +
  3219 +/*
  3220 + * We really need to sanitize the damn ipv4 init order, then all
  3221 + * this nonsense will go away.
  3222 + */
  3223 +void __init ip_static_sysctl_init(void)
  3224 +{
  3225 + register_sysctl_paths(ipv4_route_path, ipv4_route_table);
3217 3226 }
3218 3227  
3219 3228 EXPORT_SYMBOL(__ip_select_ident);
net/ipv4/sysctl_net_ipv4.c
... ... @@ -401,13 +401,6 @@
401 401 .proc_handler = &ipv4_local_port_range,
402 402 .strategy = &ipv4_sysctl_local_port_range,
403 403 },
404   - {
405   - .ctl_name = NET_IPV4_ROUTE,
406   - .procname = "route",
407   - .maxlen = 0,
408   - .mode = 0555,
409   - .child = ipv4_route_table
410   - },
411 404 #ifdef CONFIG_IP_MULTICAST
412 405 {
413 406 .ctl_name = NET_IPV4_IGMP_MAX_MEMBERSHIPS,
... ... @@ -880,13 +873,6 @@
880 873 }
881 874  
882 875 return 0;
883   -}
884   -
885   -/* set enough of tree skeleton to get rid of ordering problems */
886   -void __init ip_static_sysctl_init(void)
887   -{
888   - static ctl_table table[1];
889   - register_sysctl_paths(net_ipv4_ctl_path, table);
890 876 }
891 877  
892 878 __initcall(sysctl_ipv4_init);
... ... @@ -934,6 +934,11 @@
934 934 if (err)
935 935 goto out_unregister_sock;
936 936  
  937 +#ifdef CONFIG_SYSCTL
  938 + err = ipv6_static_sysctl_register();
  939 + if (err)
  940 + goto static_sysctl_fail;
  941 +#endif
937 942 /*
938 943 * ipngwg API draft makes clear that the correct semantics
939 944 * for TCP and UDP is to consider one TCP and UDP instance
... ... @@ -1058,6 +1063,10 @@
1058 1063 icmp_fail:
1059 1064 unregister_pernet_subsys(&inet6_net_ops);
1060 1065 register_pernet_fail:
  1066 +#ifdef CONFIG_SYSCTL
  1067 + ipv6_static_sysctl_unregister();
  1068 +static_sysctl_fail:
  1069 +#endif
1061 1070 cleanup_ipv6_mibs();
1062 1071 out_unregister_sock:
1063 1072 sock_unregister(PF_INET6);
... ... @@ -1113,6 +1122,9 @@
1113 1122 rawv6_exit();
1114 1123  
1115 1124 unregister_pernet_subsys(&inet6_net_ops);
  1125 +#ifdef CONFIG_SYSCTL
  1126 + ipv6_static_sysctl_unregister();
  1127 +#endif
1116 1128 cleanup_ipv6_mibs();
1117 1129 proto_unregister(&rawv6_prot);
1118 1130 proto_unregister(&udplitev6_prot);
net/ipv6/sysctl_net_ipv6.c
... ... @@ -150,4 +150,20 @@
150 150 unregister_net_sysctl_table(ip6_header);
151 151 unregister_pernet_subsys(&ipv6_sysctl_net_ops);
152 152 }
  153 +
  154 +static struct ctl_table_header *ip6_base;
  155 +
  156 +int ipv6_static_sysctl_register(void)
  157 +{
  158 + static struct ctl_table empty[1];
  159 + ip6_base = register_net_sysctl_rotable(net_ipv6_ctl_path, empty);
  160 + if (ip6_base == NULL)
  161 + return -ENOMEM;
  162 + return 0;
  163 +}
  164 +
  165 +void ipv6_static_sysctl_unregister(void)
  166 +{
  167 + unregister_net_sysctl_table(ip6_base);
  168 +}
... ... @@ -73,7 +73,9 @@
73 73  
74 74 static int sysctl_net_init(struct net *net)
75 75 {
76   - setup_sysctl_set(&net->sysctls, NULL, is_seen);
  76 + setup_sysctl_set(&net->sysctls,
  77 + &net_sysctl_ro_root.default_set,
  78 + is_seen);
77 79 return 0;
78 80 }
79 81