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