fix compiler warnings
[project/netifd.git] / device.c
index bc870c2..c02335c 100644 (file)
--- a/device.c
+++ b/device.c
@@ -120,10 +120,15 @@ static int set_device_state(struct device *dev, bool state)
        return 0;
 }
 
-int device_claim(struct device *dev)
+int device_claim(struct device_user *dep)
 {
+       struct device *dev = dep->dev;
        int ret;
 
+       if (dep->claimed)
+               return 0;
+
+       dep->claimed = true;
        DPRINTF("claim device %s, new refcount: %d\n", dev->ifname, dev->active + 1);
        if (++dev->active != 1)
                return 0;
@@ -138,8 +143,14 @@ int device_claim(struct device *dev)
        return ret;
 }
 
-void device_release(struct device *dev)
+void device_release(struct device_user *dep)
 {
+       struct device *dev = dep->dev;
+
+       if (!dep->claimed)
+               return;
+
+       dep->claimed = false;
        dev->active--;
        DPRINTF("release device %s, new refcount: %d\n", dev->ifname, dev->active);
        assert(dev->active >= 0);
@@ -242,7 +253,7 @@ void device_set_present(struct device *dev, bool state)
 void device_add_user(struct device_user *dep, struct device *dev)
 {
        dep->dev = dev;
-       list_add(&dep->list, &dev->users);
+       list_add_tail(&dep->list, &dev->users);
        if (dep->cb && dev->present) {
                dep->cb(dep, DEV_EVENT_ADD);
                if (dev->active)
@@ -254,6 +265,9 @@ void device_remove_user(struct device_user *dep)
 {
        struct device *dev = dep->dev;
 
+       if (dep->claimed)
+               device_release(dep);
+
        list_del(&dep->list);
 
        if (list_empty(&dev->users)) {