[v2,05/26] batman-adv: init, Add some error handling
Commit Message
This patch adds some error handling for the main init function. It
checks the return values of all the function calls that provide return
values.
Signed-off-by: Markus Pargmann <mpa@pengutronix.de>
---
main.c | 28 +++++++++++++++++++++++-----
1 file changed, 23 insertions(+), 5 deletions(-)
Comments
On Friday 26 December 2014 12:41:22 Markus Pargmann wrote:
> static int __init batadv_init(void)
> {
> + int ret;
> +
> INIT_LIST_HEAD(&batadv_hardif_list);
> INIT_HLIST_HEAD(&batadv_algo_list);
>
> batadv_recv_handler_init();
>
> - batadv_iv_init();
> - batadv_nc_init();
> + ret = batadv_iv_init();
> + if (ret)
> + return ret;
> +
> + ret = batadv_nc_init();
> + if (ret)
> + return ret;
>
> batadv_event_workqueue =
> create_singlethread_workqueue("bat_events"); -
> if (!batadv_event_workqueue)
> return -ENOMEM;
>
> batadv_socket_init();
> batadv_debugfs_init();
>
> - register_netdevice_notifier(&batadv_hard_if_notifier);
> - rtnl_link_register(&batadv_link_ops);
> + ret = register_netdevice_notifier(&batadv_hard_if_notifier);
> + if (ret)
> + goto err_netdev_notifier;
> +
> + ret = rtnl_link_register(&batadv_link_ops);
> + if (ret)
> + goto err_link_register;
>
> pr_info("B.A.T.M.A.N. advanced %s (compatibility version %i)
> loaded\n", BATADV_SOURCE_VERSION, BATADV_COMPAT_VERSION);
>
> return 0;
> +
> +err_link_register:
> + unregister_netdevice_notifier(&batadv_hard_if_notifier);
> +err_netdev_notifier:
> + batadv_debugfs_destroy();
> +
> + return ret;
> }
To be truely clean, I guess the workqueue should be destroyed as well ?
Cheers,
Marek
On Sun, Jan 11, 2015 at 08:38:10PM +0800, Marek Lindner wrote:
> On Friday 26 December 2014 12:41:22 Markus Pargmann wrote:
> > static int __init batadv_init(void)
> > {
> > + int ret;
> > +
> > INIT_LIST_HEAD(&batadv_hardif_list);
> > INIT_HLIST_HEAD(&batadv_algo_list);
> >
> > batadv_recv_handler_init();
> >
> > - batadv_iv_init();
> > - batadv_nc_init();
> > + ret = batadv_iv_init();
> > + if (ret)
> > + return ret;
> > +
> > + ret = batadv_nc_init();
> > + if (ret)
> > + return ret;
> >
> > batadv_event_workqueue =
> > create_singlethread_workqueue("bat_events"); -
> > if (!batadv_event_workqueue)
> > return -ENOMEM;
> >
> > batadv_socket_init();
> > batadv_debugfs_init();
> >
> > - register_netdevice_notifier(&batadv_hard_if_notifier);
> > - rtnl_link_register(&batadv_link_ops);
> > + ret = register_netdevice_notifier(&batadv_hard_if_notifier);
> > + if (ret)
> > + goto err_netdev_notifier;
> > +
> > + ret = rtnl_link_register(&batadv_link_ops);
> > + if (ret)
> > + goto err_link_register;
> >
> > pr_info("B.A.T.M.A.N. advanced %s (compatibility version %i)
> > loaded\n", BATADV_SOURCE_VERSION, BATADV_COMPAT_VERSION);
> >
> > return 0;
> > +
> > +err_link_register:
> > + unregister_netdevice_notifier(&batadv_hard_if_notifier);
> > +err_netdev_notifier:
> > + batadv_debugfs_destroy();
> > +
> > + return ret;
> > }
>
> To be truely clean, I guess the workqueue should be destroyed as well ?
Yes, thanks, added destroy_workqueue() for v3.
Best Regards,
Markus
@@ -59,29 +59,47 @@ static void batadv_recv_handler_init(void);
static int __init batadv_init(void)
{
+ int ret;
+
INIT_LIST_HEAD(&batadv_hardif_list);
INIT_HLIST_HEAD(&batadv_algo_list);
batadv_recv_handler_init();
- batadv_iv_init();
- batadv_nc_init();
+ ret = batadv_iv_init();
+ if (ret)
+ return ret;
+
+ ret = batadv_nc_init();
+ if (ret)
+ return ret;
batadv_event_workqueue = create_singlethread_workqueue("bat_events");
-
if (!batadv_event_workqueue)
return -ENOMEM;
batadv_socket_init();
batadv_debugfs_init();
- register_netdevice_notifier(&batadv_hard_if_notifier);
- rtnl_link_register(&batadv_link_ops);
+ ret = register_netdevice_notifier(&batadv_hard_if_notifier);
+ if (ret)
+ goto err_netdev_notifier;
+
+ ret = rtnl_link_register(&batadv_link_ops);
+ if (ret)
+ goto err_link_register;
pr_info("B.A.T.M.A.N. advanced %s (compatibility version %i) loaded\n",
BATADV_SOURCE_VERSION, BATADV_COMPAT_VERSION);
return 0;
+
+err_link_register:
+ unregister_netdevice_notifier(&batadv_hard_if_notifier);
+err_netdev_notifier:
+ batadv_debugfs_destroy();
+
+ return ret;
}
static void __exit batadv_exit(void)