diff options
author | Hans Schillstrom <hans.schillstrom@ericsson.com> | 2012-04-26 01:47:44 -0400 |
---|---|---|
committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2012-04-30 04:40:35 -0400 |
commit | 8537de8a7ab6681cc72fb0411ab1ba7fdba62dd0 (patch) | |
tree | 7a57ad6ef5aa0147dd13bba8be9bd77ab60f3f50 /net | |
parent | 582b8e3eadaec77788c1aa188081a8d5059c42a6 (diff) |
ipvs: kernel oops - do_ip_vs_get_ctl
Change order of init so netns init is ready
when register ioctl and netlink.
Ver2
Whitespace fixes and __init added.
Reported-by: "Ryan O'Hara" <rohara@redhat.com>
Signed-off-by: Hans Schillstrom <hans.schillstrom@ericsson.com>
Acked-by: Julian Anastasov <ja@ssi.bg>
Signed-off-by: Jesper Dangaard Brouer <brouer@redhat.com>
Signed-off-by: Simon Horman <horms@verge.net.au>
Diffstat (limited to 'net')
-rw-r--r-- | net/netfilter/ipvs/ip_vs_core.c | 9 | ||||
-rw-r--r-- | net/netfilter/ipvs/ip_vs_ctl.c | 52 |
2 files changed, 39 insertions, 22 deletions
diff --git a/net/netfilter/ipvs/ip_vs_core.c b/net/netfilter/ipvs/ip_vs_core.c index 260b9ef88775..00bdb1d9d690 100644 --- a/net/netfilter/ipvs/ip_vs_core.c +++ b/net/netfilter/ipvs/ip_vs_core.c | |||
@@ -1995,10 +1995,18 @@ static int __init ip_vs_init(void) | |||
1995 | goto cleanup_dev; | 1995 | goto cleanup_dev; |
1996 | } | 1996 | } |
1997 | 1997 | ||
1998 | ret = ip_vs_register_nl_ioctl(); | ||
1999 | if (ret < 0) { | ||
2000 | pr_err("can't register netlink/ioctl.\n"); | ||
2001 | goto cleanup_hooks; | ||
2002 | } | ||
2003 | |||
1998 | pr_info("ipvs loaded.\n"); | 2004 | pr_info("ipvs loaded.\n"); |
1999 | 2005 | ||
2000 | return ret; | 2006 | return ret; |
2001 | 2007 | ||
2008 | cleanup_hooks: | ||
2009 | nf_unregister_hooks(ip_vs_ops, ARRAY_SIZE(ip_vs_ops)); | ||
2002 | cleanup_dev: | 2010 | cleanup_dev: |
2003 | unregister_pernet_device(&ipvs_core_dev_ops); | 2011 | unregister_pernet_device(&ipvs_core_dev_ops); |
2004 | cleanup_sub: | 2012 | cleanup_sub: |
@@ -2014,6 +2022,7 @@ exit: | |||
2014 | 2022 | ||
2015 | static void __exit ip_vs_cleanup(void) | 2023 | static void __exit ip_vs_cleanup(void) |
2016 | { | 2024 | { |
2025 | ip_vs_unregister_nl_ioctl(); | ||
2017 | nf_unregister_hooks(ip_vs_ops, ARRAY_SIZE(ip_vs_ops)); | 2026 | nf_unregister_hooks(ip_vs_ops, ARRAY_SIZE(ip_vs_ops)); |
2018 | unregister_pernet_device(&ipvs_core_dev_ops); | 2027 | unregister_pernet_device(&ipvs_core_dev_ops); |
2019 | unregister_pernet_subsys(&ipvs_core_ops); /* free ip_vs struct */ | 2028 | unregister_pernet_subsys(&ipvs_core_ops); /* free ip_vs struct */ |
diff --git a/net/netfilter/ipvs/ip_vs_ctl.c b/net/netfilter/ipvs/ip_vs_ctl.c index 376d2b12d581..f5589987fc80 100644 --- a/net/netfilter/ipvs/ip_vs_ctl.c +++ b/net/netfilter/ipvs/ip_vs_ctl.c | |||
@@ -3750,21 +3750,10 @@ void __net_exit ip_vs_control_net_cleanup(struct net *net) | |||
3750 | free_percpu(ipvs->tot_stats.cpustats); | 3750 | free_percpu(ipvs->tot_stats.cpustats); |
3751 | } | 3751 | } |
3752 | 3752 | ||
3753 | int __init ip_vs_control_init(void) | 3753 | int __init ip_vs_register_nl_ioctl(void) |
3754 | { | 3754 | { |
3755 | int idx; | ||
3756 | int ret; | 3755 | int ret; |
3757 | 3756 | ||
3758 | EnterFunction(2); | ||
3759 | |||
3760 | /* Initialize svc_table, ip_vs_svc_fwm_table, rs_table */ | ||
3761 | for(idx = 0; idx < IP_VS_SVC_TAB_SIZE; idx++) { | ||
3762 | INIT_LIST_HEAD(&ip_vs_svc_table[idx]); | ||
3763 | INIT_LIST_HEAD(&ip_vs_svc_fwm_table[idx]); | ||
3764 | } | ||
3765 | |||
3766 | smp_wmb(); /* Do we really need it now ? */ | ||
3767 | |||
3768 | ret = nf_register_sockopt(&ip_vs_sockopts); | 3757 | ret = nf_register_sockopt(&ip_vs_sockopts); |
3769 | if (ret) { | 3758 | if (ret) { |
3770 | pr_err("cannot register sockopt.\n"); | 3759 | pr_err("cannot register sockopt.\n"); |
@@ -3776,28 +3765,47 @@ int __init ip_vs_control_init(void) | |||
3776 | pr_err("cannot register Generic Netlink interface.\n"); | 3765 | pr_err("cannot register Generic Netlink interface.\n"); |
3777 | goto err_genl; | 3766 | goto err_genl; |
3778 | } | 3767 | } |
3779 | |||
3780 | ret = register_netdevice_notifier(&ip_vs_dst_notifier); | ||
3781 | if (ret < 0) | ||
3782 | goto err_notf; | ||
3783 | |||
3784 | LeaveFunction(2); | ||
3785 | return 0; | 3768 | return 0; |
3786 | 3769 | ||
3787 | err_notf: | ||
3788 | ip_vs_genl_unregister(); | ||
3789 | err_genl: | 3770 | err_genl: |
3790 | nf_unregister_sockopt(&ip_vs_sockopts); | 3771 | nf_unregister_sockopt(&ip_vs_sockopts); |
3791 | err_sock: | 3772 | err_sock: |
3792 | return ret; | 3773 | return ret; |
3793 | } | 3774 | } |
3794 | 3775 | ||
3776 | void ip_vs_unregister_nl_ioctl(void) | ||
3777 | { | ||
3778 | ip_vs_genl_unregister(); | ||
3779 | nf_unregister_sockopt(&ip_vs_sockopts); | ||
3780 | } | ||
3781 | |||
3782 | int __init ip_vs_control_init(void) | ||
3783 | { | ||
3784 | int idx; | ||
3785 | int ret; | ||
3786 | |||
3787 | EnterFunction(2); | ||
3788 | |||
3789 | /* Initialize svc_table, ip_vs_svc_fwm_table, rs_table */ | ||
3790 | for (idx = 0; idx < IP_VS_SVC_TAB_SIZE; idx++) { | ||
3791 | INIT_LIST_HEAD(&ip_vs_svc_table[idx]); | ||
3792 | INIT_LIST_HEAD(&ip_vs_svc_fwm_table[idx]); | ||
3793 | } | ||
3794 | |||
3795 | smp_wmb(); /* Do we really need it now ? */ | ||
3796 | |||
3797 | ret = register_netdevice_notifier(&ip_vs_dst_notifier); | ||
3798 | if (ret < 0) | ||
3799 | return ret; | ||
3800 | |||
3801 | LeaveFunction(2); | ||
3802 | return 0; | ||
3803 | } | ||
3804 | |||
3795 | 3805 | ||
3796 | void ip_vs_control_cleanup(void) | 3806 | void ip_vs_control_cleanup(void) |
3797 | { | 3807 | { |
3798 | EnterFunction(2); | 3808 | EnterFunction(2); |
3799 | unregister_netdevice_notifier(&ip_vs_dst_notifier); | 3809 | unregister_netdevice_notifier(&ip_vs_dst_notifier); |
3800 | ip_vs_genl_unregister(); | ||
3801 | nf_unregister_sockopt(&ip_vs_sockopts); | ||
3802 | LeaveFunction(2); | 3810 | LeaveFunction(2); |
3803 | } | 3811 | } |