device: Drop device down event during device release if device gets active again
authorHans Dedecker <dedeckeh@gmail.com>
Fri, 23 Sep 2016 13:08:23 +0000 (15:08 +0200)
committerFelix Fietkau <nbd@nbd.name>
Mon, 26 Sep 2016 09:51:19 +0000 (11:51 +0200)
Fixes a race condition as the device can be active again; due to a device_claim; by the logic
behind the set_state device type function. In this case the down event cannot be sent anymore
as it would bring down the interface(s) referencing the device.
This can be the case for an aliased device when the underlying device is switched during a reload;
the alias_set_device function can add a new dependency on the new active device which will put the
aliased device in active mode again as the aliased device is already claimed by the interface
using it.

Signed-off-by: Hans Dedecker <dedeckeh@gmail.com>
device.c

index e17df13dbaca202055edb37efb019227f0e0c773..996ffabe770beadac52754ec6c4da69c2c31c7ab 100644 (file)
--- a/device.c
+++ b/device.c
@@ -450,6 +450,10 @@ void device_release(struct device_user *dep)
        device_broadcast_event(dev, DEV_EVENT_TEARDOWN);
        if (!dev->external)
                dev->set_state(dev, false);
+
+       if (dev->active)
+               return;
+
        device_broadcast_event(dev, DEV_EVENT_DOWN);
 }