Module: xenomai-3 Branch: master Commit: 96e85548a56c8c7fbd6d64c079701483a8e5da27 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=96e85548a56c8c7fbd6d64c079701483a8e5da27
Author: Gilles Chanteperdrix <gilles.chanteperd...@xenomai.org> Date: Tue Sep 29 01:41:26 2015 +0200 rtdm/devices: avoid incomplete device cleanup when unregister_driver() is called from rtdm_dev_unregister(), __rtdm_put_device() has already decreased the driver reference count, so the result of atomic_dec_and_test() is always false and unregister_driver() does not finish the cleanup. Fix this by moving the atomic_dec_and_test() test to the only other call site of unregister_driver(): the rtdm_dev_regiter() error path. --- kernel/cobalt/rtdm/device.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/kernel/cobalt/rtdm/device.c b/kernel/cobalt/rtdm/device.c index 1c602c2..9af2221 100644 --- a/kernel/cobalt/rtdm/device.c +++ b/kernel/cobalt/rtdm/device.c @@ -303,6 +303,7 @@ static int register_driver(struct rtdm_driver *drv) drv->named.major = MAJOR(rdev); atomic_set(&drv->refcount, 1); + done: drv->nb_statechange.notifier_call = state_change_notifier; drv->nb_statechange.priority = 0; @@ -321,9 +322,6 @@ static void unregister_driver(struct rtdm_driver *drv) { XENO_BUG_ON(COBALT, drv->profile_info.magic != RTDM_CLASS_MAGIC); - if (!atomic_dec_and_test(&drv->refcount)) - return; - cobalt_remove_notifier_chain(&drv->nb_statechange); if (drv->device_flags & RTDM_NAMED_DEVICE) { @@ -452,7 +450,8 @@ fail: if (kdev) device_destroy(rtdm_class, rdev); - unregister_driver(drv); + if (atomic_dec_and_test(&drv->refcount)) + unregister_driver(drv); mutex_unlock(®ister_lock); _______________________________________________ Xenomai-git mailing list Xenomai-git@xenomai.org http://xenomai.org/mailman/listinfo/xenomai-git