aboutsummaryrefslogtreecommitdiffstats
path: root/net/can/gw.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/can/gw.c')
-rw-r--r--net/can/gw.c48
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(&notifier); 1062 ret = register_netdevice_notifier(&notifier);
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(&notifier); 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
1082out_rtnl_register3:
1083 rtnl_unregister(PF_CAN, RTM_NEWROUTE);
1084out_rtnl_register2:
1085 rtnl_unregister(PF_CAN, RTM_GETROUTE);
1086out_rtnl_register1:
1087 unregister_netdevice_notifier(&notifier);
1088out_register_notifier:
1089 kmem_cache_destroy(cgw_cache);
1090out_cache_create:
1091 unregister_pernet_subsys(&cangw_pernet_ops);
1092
1093 return ret;
1076} 1094}
1077 1095
1078static __exit void cgw_module_exit(void) 1096static __exit void cgw_module_exit(void)