projects
/
oweals
/
netifd.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
beaf1b3
)
fix refcount bugs when dev->set_state fails
author
Felix Fietkau
<nbd@openwrt.org>
Thu, 6 Oct 2011 01:24:23 +0000
(
03:24
+0200)
committer
Felix Fietkau
<nbd@openwrt.org>
Thu, 6 Oct 2011 01:25:33 +0000
(
03:25
+0200)
device.c
patch
|
blob
|
history
diff --git
a/device.c
b/device.c
index 44541e2bada6b4713bf572439531f188889c418a..32fa4a46db702f7dec4c194fc3a41cad4b62a2f6 100644
(file)
--- a/
device.c
+++ b/
device.c
@@
-141,8
+141,11
@@
int device_claim(struct device_user *dep)
ret = dev->set_state(dev, true);
if (ret == 0)
device_broadcast_event(dev, DEV_EVENT_UP);
ret = dev->set_state(dev, true);
if (ret == 0)
device_broadcast_event(dev, DEV_EVENT_UP);
- else
+ else {
+ D(DEVICE, "claim device %s failed: %d\n", dev->ifname, ret);
dev->active = 0;
dev->active = 0;
+ dep->claimed = false;
+ }
return ret;
}
return ret;
}
@@
-259,6
+262,7
@@
void device_cleanup(struct device *dev)
continue;
dep->cb(dep, DEV_EVENT_REMOVE);
continue;
dep->cb(dep, DEV_EVENT_REMOVE);
+ device_release(dep);
}
device_delete(dev);
}
device_delete(dev);
@@
-379,8
+383,9
@@
device_replace(struct device *dev, struct device *odev)
device_set_present(odev, false);
list_for_each_entry_safe(dep, tmp, &odev->users, list) {
device_set_present(odev, false);
list_for_each_entry_safe(dep, tmp, &odev->users, list) {
- device_remove_user(dep);
- device_add_user(dep, dev);
+ device_release(dep);
+ list_move_tail(&dep->list, &dev->users);
+ dep->dev = dev;
}
device_free(odev);
}
device_free(odev);