Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Mathias Krause and committed by
Steffen Klassert
e59d82fd 644a918d

+20 -31
+20 -31
net/ipv6/ip6_vti.c
··· 1089 1089 **/ 1090 1090 static 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 1096 err = register_pernet_device(&vti6_net_ops); 1095 1097 if (err < 0) 1096 - goto out_pernet; 1098 + goto pernet_dev_failed; 1097 1099 1100 + msg = "tunnel protocols"; 1098 1101 err = xfrm6_protocol_register(&vti_esp6_protocol, IPPROTO_ESP); 1099 - if (err < 0) { 1100 - pr_err("%s: can't register vti6 protocol\n", __func__); 1101 - 1102 - goto out; 1103 - } 1104 - 1102 + if (err < 0) 1103 + goto xfrm_proto_esp_failed; 1105 1104 err = xfrm6_protocol_register(&vti_ah6_protocol, IPPROTO_AH); 1106 - if (err < 0) { 1107 - xfrm6_protocol_deregister(&vti_esp6_protocol, IPPROTO_ESP); 1108 - pr_err("%s: can't register vti6 protocol\n", __func__); 1109 - 1110 - goto out; 1111 - } 1112 - 1105 + if (err < 0) 1106 + goto xfrm_proto_ah_failed; 1113 1107 err = xfrm6_protocol_register(&vti_ipcomp6_protocol, IPPROTO_COMP); 1114 - if (err < 0) { 1115 - xfrm6_protocol_deregister(&vti_ah6_protocol, IPPROTO_AH); 1116 - xfrm6_protocol_deregister(&vti_esp6_protocol, IPPROTO_ESP); 1117 - pr_err("%s: can't register vti6 protocol\n", __func__); 1108 + if (err < 0) 1109 + goto xfrm_proto_comp_failed; 1118 1110 1119 - goto out; 1120 - } 1121 - 1111 + msg = "netlink interface"; 1122 1112 err = rtnl_link_register(&vti6_link_ops); 1123 1113 if (err < 0) 1124 1114 goto rtnl_link_failed; ··· 1117 1127 1118 1128 rtnl_link_failed: 1119 1129 xfrm6_protocol_deregister(&vti_ipcomp6_protocol, IPPROTO_COMP); 1130 + xfrm_proto_comp_failed: 1120 1131 xfrm6_protocol_deregister(&vti_ah6_protocol, IPPROTO_AH); 1132 + xfrm_proto_ah_failed: 1121 1133 xfrm6_protocol_deregister(&vti_esp6_protocol, IPPROTO_ESP); 1122 - out: 1134 + xfrm_proto_esp_failed: 1123 1135 unregister_pernet_device(&vti6_net_ops); 1124 - out_pernet: 1136 + pernet_dev_failed: 1137 + pr_err("vti6 init: failed to register %s\n", msg); 1125 1138 return err; 1126 1139 } 1127 1140 ··· 1134 1141 static void __exit vti6_tunnel_cleanup(void) 1135 1142 { 1136 1143 rtnl_link_unregister(&vti6_link_ops); 1137 - if (xfrm6_protocol_deregister(&vti_ipcomp6_protocol, IPPROTO_COMP)) 1138 - pr_info("%s: can't deregister protocol\n", __func__); 1139 - if (xfrm6_protocol_deregister(&vti_ah6_protocol, IPPROTO_AH)) 1140 - pr_info("%s: can't deregister protocol\n", __func__); 1141 - if (xfrm6_protocol_deregister(&vti_esp6_protocol, IPPROTO_ESP)) 1142 - pr_info("%s: can't deregister protocol\n", __func__); 1143 - 1144 + xfrm6_protocol_deregister(&vti_ipcomp6_protocol, IPPROTO_COMP); 1145 + xfrm6_protocol_deregister(&vti_ah6_protocol, IPPROTO_AH); 1146 + xfrm6_protocol_deregister(&vti_esp6_protocol, IPPROTO_ESP); 1144 1147 unregister_pernet_device(&vti6_net_ops); 1145 1148 } 1146 1149