diff options
author | Greg Kroah-Hartman <gregkh@suse.de> | 2006-06-28 16:19:58 -0700 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2006-09-25 21:08:38 -0700 |
commit | 64bb5d2c116478dba7501d2acf078ed74ba30c1f (patch) | |
tree | bd0f695cad51a0b9608d686ab2b0232a31d4b2ad /drivers/base | |
parent | de0ff00d723fd821d372496e2c084805644aa5e1 (diff) | |
download | linux-3.10-64bb5d2c116478dba7501d2acf078ed74ba30c1f.tar.gz linux-3.10-64bb5d2c116478dba7501d2acf078ed74ba30c1f.tar.bz2 linux-3.10-64bb5d2c116478dba7501d2acf078ed74ba30c1f.zip |
Driver core: allow devices in classes to have no parent
This fixes an oops when a device is attached to a class, yet has no
"parent" device. An example of this would be the "lo" device in the
network core.
We should create a "virtual" subdirectory under /sys/devices/ for these,
but no one seems to agree on a proper name for it yet...
Oh, and update my copyright on the driver core.
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/base')
-rw-r--r-- | drivers/base/core.c | 21 |
1 files changed, 11 insertions, 10 deletions
diff --git a/drivers/base/core.c b/drivers/base/core.c index 641c0c42bb4..5c91d0d81e7 100644 --- a/drivers/base/core.c +++ b/drivers/base/core.c @@ -3,6 +3,8 @@ * * Copyright (c) 2002-3 Patrick Mochel * Copyright (c) 2002-3 Open Source Development Labs + * Copyright (c) 2006 Greg Kroah-Hartman <gregkh@suse.de> + * Copyright (c) 2006 Novell, Inc. * * This file is released under the GPLv2 * @@ -373,10 +375,11 @@ int device_add(struct device *dev) "subsystem"); sysfs_create_link(&dev->class->subsys.kset.kobj, &dev->kobj, dev->bus_id); - - sysfs_create_link(&dev->kobj, &dev->parent->kobj, "device"); - class_name = make_class_name(dev->class->name, &dev->kobj); - sysfs_create_link(&dev->parent->kobj, &dev->kobj, class_name); + if (parent) { + sysfs_create_link(&dev->kobj, &dev->parent->kobj, "device"); + class_name = make_class_name(dev->class->name, &dev->kobj); + sysfs_create_link(&dev->parent->kobj, &dev->kobj, class_name); + } } if ((error = device_add_groups(dev))) @@ -495,8 +498,10 @@ void device_del(struct device * dev) sysfs_remove_link(&dev->kobj, "subsystem"); sysfs_remove_link(&dev->class->subsys.kset.kobj, dev->bus_id); class_name = make_class_name(dev->class->name, &dev->kobj); - sysfs_remove_link(&dev->kobj, "device"); - sysfs_remove_link(&dev->parent->kobj, class_name); + if (parent) { + sysfs_remove_link(&dev->kobj, "device"); + sysfs_remove_link(&dev->parent->kobj, class_name); + } kfree(class_name); down(&dev->class->sem); list_del_init(&dev->node); @@ -625,10 +630,6 @@ struct device *device_create(struct class *class, struct device *parent, if (class == NULL || IS_ERR(class)) goto error; - if (parent == NULL) { - printk(KERN_WARNING "%s does not work yet for NULL parents\n", __FUNCTION__); - goto error; - } dev = kzalloc(sizeof(*dev), GFP_KERNEL); if (!dev) { |