Messages in this thread Patch in this message | | | From | Dmitry Torokhov <> | Subject | [RESEND][PATCH 3/4] Driver core updates (needed for serio) | Date | Wed, 7 Jul 2004 20:40:46 -0500 |
| |
===================================================================
ChangeSet@1.1821, 2004-07-07 18:16:59-05:00, dtor_core@ameritech.net Driver core: kset_find_obj should increment refcount of the found object so users of the function can safely use returned object Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
drivers/base/bus.c | 2 ++ drivers/base/core.c | 10 ++++++++++ drivers/pci/hotplug/rpaphp_vio.c | 9 ++++++++- lib/kobject.c | 7 ++++--- 4 files changed, 24 insertions(+), 4 deletions(-)
===================================================================
diff -Nru a/drivers/base/bus.c b/drivers/base/bus.c --- a/drivers/base/bus.c 2004-07-07 19:55:49 -05:00 +++ b/drivers/base/bus.c 2004-07-07 19:55:49 -05:00 @@ -607,6 +607,8 @@ * * Call kset_find_obj() to iterate over list of buses to * find a bus by name. Return bus if found. + * + * Note that kset_find_obj increments bus' reference count. */ struct bus_type * find_bus(char * name) diff -Nru a/drivers/base/core.c b/drivers/base/core.c --- a/drivers/base/core.c 2004-07-07 19:55:49 -05:00 +++ b/drivers/base/core.c 2004-07-07 19:55:49 -05:00 @@ -378,6 +378,16 @@ return error; } +/** + * device_find - locate device on a bus by name. + * @name: name of the device. + * @bus: bus to scan for the device. + * + * Call kset_find_obj() to iterate over list of devices on + * a bus to find device by name. Return device if found. + * + * Note that kset_find_obj increments device's reference count. + */ struct device *device_find(const char *name, struct bus_type *bus) { struct kobject *k = kset_find_obj(&bus->devices, name); diff -Nru a/drivers/pci/hotplug/rpaphp_vio.c b/drivers/pci/hotplug/rpaphp_vio.c --- a/drivers/pci/hotplug/rpaphp_vio.c 2004-07-07 19:55:49 -05:00 +++ b/drivers/pci/hotplug/rpaphp_vio.c 2004-07-07 19:55:49 -05:00 @@ -86,7 +86,14 @@ } slot->dev_type = VIO_DEV; slot->dev.vio_dev = vio_find_node(dn); - if (!slot->dev.vio_dev) + if (slot->dev.vio_dev) { + /* + * rpaphp is the only owner of vio devices and + * does not need extra reference taken by + * vio_find_node + */ + put_device(&slot->dev.vio_dev->dev); + } else slot->dev.vio_dev = vio_register_device_node(dn); if (slot->dev.vio_dev) slot->state = CONFIGURED; diff -Nru a/lib/kobject.c b/lib/kobject.c --- a/lib/kobject.c 2004-07-07 19:55:49 -05:00 +++ b/lib/kobject.c 2004-07-07 19:55:49 -05:00 @@ -537,7 +537,8 @@ * @name: object's name. * * Lock kset via @kset->subsys, and iterate over @kset->list, - * looking for a matching kobject. Return object if found. + * looking for a matching kobject. If matching object is found + * take a reference and return the object. */ struct kobject * kset_find_obj(struct kset * kset, const char * name) @@ -548,8 +549,8 @@ down_read(&kset->subsys->rwsem); list_for_each(entry,&kset->list) { struct kobject * k = to_kobj(entry); - if (kobject_name(k) && (!strcmp(kobject_name(k),name))) { - ret = k; + if (kobject_name(k) && !strcmp(kobject_name(k),name)) { + ret = kobject_get(k); break; } } - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |