aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorMathias Krause <minipli@googlemail.com>2014-05-09 17:43:41 -0400
committerSteffen Klassert <steffen.klassert@secunet.com>2014-06-26 02:21:57 -0400
commite59d82fd33f7670cf67fd69cf684aa589ec8340a (patch)
treecb7747de194a9979831ca943dac1a00d331c10b7 /net
parent644a918d20336a7deaa81f675c3c2f25bf3dafbb (diff)
vti6: Simplify error handling in module init and exit
The error handling in the module init and exit functions can be shortened to safe us some code. 1/ Remove the code duplications in the init function, jump straight to the existing cleanup code by adding some labels. Also give the error message some more value by telling the reason why loading the module has failed. 2/ Remove the error handling in the exit function as the only legitimate reason xfrm6_protocol_deregister() might fail is inet6_del_protocol() returning -1. That, in turn, means some other protocol handler had been registered for this very protocol in the meantime. But that essentially means we haven't been handling that protocol any more, anyway. What it definitely means not is that we "can't deregister protocol". Therefore just get rid of that bogus warning. It's plain wrong. Signed-off-by: Mathias Krause <minipli@googlemail.com> Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
Diffstat (limited to 'net')
-rw-r--r--net/ipv6/ip6_vti.c51
1 files changed, 20 insertions, 31 deletions
diff --git a/net/ipv6/ip6_vti.c b/net/ipv6/ip6_vti.c
index 9aaa6bb229e4..b61b0b1bb7ce 100644
--- a/net/ipv6/ip6_vti.c
+++ b/net/ipv6/ip6_vti.c
@@ -1089,36 +1089,26 @@ static struct xfrm6_protocol vti_ipcomp6_protocol __read_mostly = {
1089 **/ 1089 **/
1090static int __init vti6_tunnel_init(void) 1090static int __init vti6_tunnel_init(void)
1091{ 1091{
1092 int err; 1092 const char *msg;
1093 int err;
1093 1094
1095 msg = "tunnel device";
1094 err = register_pernet_device(&vti6_net_ops); 1096 err = register_pernet_device(&vti6_net_ops);
1095 if (err < 0) 1097 if (err < 0)
1096 goto out_pernet; 1098 goto pernet_dev_failed;
1097 1099
1100 msg = "tunnel protocols";
1098 err = xfrm6_protocol_register(&vti_esp6_protocol, IPPROTO_ESP); 1101 err = xfrm6_protocol_register(&vti_esp6_protocol, IPPROTO_ESP);
1099 if (err < 0) { 1102 if (err < 0)
1100 pr_err("%s: can't register vti6 protocol\n", __func__); 1103 goto xfrm_proto_esp_failed;
1101
1102 goto out;
1103 }
1104
1105 err = xfrm6_protocol_register(&vti_ah6_protocol, IPPROTO_AH); 1104 err = xfrm6_protocol_register(&vti_ah6_protocol, IPPROTO_AH);
1106 if (err < 0) { 1105 if (err < 0)
1107 xfrm6_protocol_deregister(&vti_esp6_protocol, IPPROTO_ESP); 1106 goto xfrm_proto_ah_failed;
1108 pr_err("%s: can't register vti6 protocol\n", __func__);
1109
1110 goto out;
1111 }
1112
1113 err = xfrm6_protocol_register(&vti_ipcomp6_protocol, IPPROTO_COMP); 1107 err = xfrm6_protocol_register(&vti_ipcomp6_protocol, IPPROTO_COMP);
1114 if (err < 0) { 1108 if (err < 0)
1115 xfrm6_protocol_deregister(&vti_ah6_protocol, IPPROTO_AH); 1109 goto xfrm_proto_comp_failed;
1116 xfrm6_protocol_deregister(&vti_esp6_protocol, IPPROTO_ESP);
1117 pr_err("%s: can't register vti6 protocol\n", __func__);
1118
1119 goto out;
1120 }
1121 1110
1111 msg = "netlink interface";
1122 err = rtnl_link_register(&vti6_link_ops); 1112 err = rtnl_link_register(&vti6_link_ops);
1123 if (err < 0) 1113 if (err < 0)
1124 goto rtnl_link_failed; 1114 goto rtnl_link_failed;
@@ -1127,11 +1117,14 @@ static int __init vti6_tunnel_init(void)
1127 1117
1128rtnl_link_failed: 1118rtnl_link_failed:
1129 xfrm6_protocol_deregister(&vti_ipcomp6_protocol, IPPROTO_COMP); 1119 xfrm6_protocol_deregister(&vti_ipcomp6_protocol, IPPROTO_COMP);
1120xfrm_proto_comp_failed:
1130 xfrm6_protocol_deregister(&vti_ah6_protocol, IPPROTO_AH); 1121 xfrm6_protocol_deregister(&vti_ah6_protocol, IPPROTO_AH);
1122xfrm_proto_ah_failed:
1131 xfrm6_protocol_deregister(&vti_esp6_protocol, IPPROTO_ESP); 1123 xfrm6_protocol_deregister(&vti_esp6_protocol, IPPROTO_ESP);
1132out: 1124xfrm_proto_esp_failed:
1133 unregister_pernet_device(&vti6_net_ops); 1125 unregister_pernet_device(&vti6_net_ops);
1134out_pernet: 1126pernet_dev_failed:
1127 pr_err("vti6 init: failed to register %s\n", msg);
1135 return err; 1128 return err;
1136} 1129}
1137 1130
@@ -1141,13 +1134,9 @@ out_pernet:
1141static void __exit vti6_tunnel_cleanup(void) 1134static void __exit vti6_tunnel_cleanup(void)
1142{ 1135{
1143 rtnl_link_unregister(&vti6_link_ops); 1136 rtnl_link_unregister(&vti6_link_ops);
1144 if (xfrm6_protocol_deregister(&vti_ipcomp6_protocol, IPPROTO_COMP)) 1137 xfrm6_protocol_deregister(&vti_ipcomp6_protocol, IPPROTO_COMP);
1145 pr_info("%s: can't deregister protocol\n", __func__); 1138 xfrm6_protocol_deregister(&vti_ah6_protocol, IPPROTO_AH);
1146 if (xfrm6_protocol_deregister(&vti_ah6_protocol, IPPROTO_AH)) 1139 xfrm6_protocol_deregister(&vti_esp6_protocol, IPPROTO_ESP);
1147 pr_info("%s: can't deregister protocol\n", __func__);
1148 if (xfrm6_protocol_deregister(&vti_esp6_protocol, IPPROTO_ESP))
1149 pr_info("%s: can't deregister protocol\n", __func__);
1150
1151 unregister_pernet_device(&vti6_net_ops); 1140 unregister_pernet_device(&vti6_net_ops);
1152} 1141}
1153 1142