diff options
Diffstat (limited to 'net/can/gw.c')
-rw-r--r-- | net/can/gw.c | 48 |
1 files changed, 33 insertions, 15 deletions
diff --git a/net/can/gw.c b/net/can/gw.c index 8abae841d504..ce17f836262b 100644 --- a/net/can/gw.c +++ b/net/can/gw.c | |||
@@ -1047,32 +1047,50 @@ static __init int cgw_module_init(void) | |||
1047 | pr_info("can: netlink gateway (rev " CAN_GW_VERSION ") max_hops=%d\n", | 1047 | pr_info("can: netlink gateway (rev " CAN_GW_VERSION ") max_hops=%d\n", |
1048 | max_hops); | 1048 | max_hops); |
1049 | 1049 | ||
1050 | register_pernet_subsys(&cangw_pernet_ops); | 1050 | ret = register_pernet_subsys(&cangw_pernet_ops); |
1051 | if (ret) | ||
1052 | return ret; | ||
1053 | |||
1054 | ret = -ENOMEM; | ||
1051 | cgw_cache = kmem_cache_create("can_gw", sizeof(struct cgw_job), | 1055 | cgw_cache = kmem_cache_create("can_gw", sizeof(struct cgw_job), |
1052 | 0, 0, NULL); | 1056 | 0, 0, NULL); |
1053 | |||
1054 | if (!cgw_cache) | 1057 | if (!cgw_cache) |
1055 | return -ENOMEM; | 1058 | goto out_cache_create; |
1056 | 1059 | ||
1057 | /* set notifier */ | 1060 | /* set notifier */ |
1058 | notifier.notifier_call = cgw_notifier; | 1061 | notifier.notifier_call = cgw_notifier; |
1059 | register_netdevice_notifier(¬ifier); | 1062 | ret = register_netdevice_notifier(¬ifier); |
1063 | if (ret) | ||
1064 | goto out_register_notifier; | ||
1060 | 1065 | ||
1061 | ret = rtnl_register_module(THIS_MODULE, PF_CAN, RTM_GETROUTE, | 1066 | ret = rtnl_register_module(THIS_MODULE, PF_CAN, RTM_GETROUTE, |
1062 | NULL, cgw_dump_jobs, 0); | 1067 | NULL, cgw_dump_jobs, 0); |
1063 | if (ret) { | 1068 | if (ret) |
1064 | unregister_netdevice_notifier(¬ifier); | 1069 | goto out_rtnl_register1; |
1065 | kmem_cache_destroy(cgw_cache); | 1070 | |
1066 | return -ENOBUFS; | 1071 | ret = rtnl_register_module(THIS_MODULE, PF_CAN, RTM_NEWROUTE, |
1067 | } | 1072 | cgw_create_job, NULL, 0); |
1068 | 1073 | if (ret) | |
1069 | /* Only the first call to rtnl_register_module can fail */ | 1074 | goto out_rtnl_register2; |
1070 | rtnl_register_module(THIS_MODULE, PF_CAN, RTM_NEWROUTE, | 1075 | ret = rtnl_register_module(THIS_MODULE, PF_CAN, RTM_DELROUTE, |
1071 | cgw_create_job, NULL, 0); | 1076 | cgw_remove_job, NULL, 0); |
1072 | rtnl_register_module(THIS_MODULE, PF_CAN, RTM_DELROUTE, | 1077 | if (ret) |
1073 | cgw_remove_job, NULL, 0); | 1078 | goto out_rtnl_register3; |
1074 | 1079 | ||
1075 | return 0; | 1080 | return 0; |
1081 | |||
1082 | out_rtnl_register3: | ||
1083 | rtnl_unregister(PF_CAN, RTM_NEWROUTE); | ||
1084 | out_rtnl_register2: | ||
1085 | rtnl_unregister(PF_CAN, RTM_GETROUTE); | ||
1086 | out_rtnl_register1: | ||
1087 | unregister_netdevice_notifier(¬ifier); | ||
1088 | out_register_notifier: | ||
1089 | kmem_cache_destroy(cgw_cache); | ||
1090 | out_cache_create: | ||
1091 | unregister_pernet_subsys(&cangw_pernet_ops); | ||
1092 | |||
1093 | return ret; | ||
1076 | } | 1094 | } |
1077 | 1095 | ||
1078 | static __exit void cgw_module_exit(void) | 1096 | static __exit void cgw_module_exit(void) |