Re: [PATCH 8/9] Driver core: fix error by cleanup up symlinks properly
Greg Kroah-Hartman <[EMAIL PROTECTED]> writes: > From: James Simmons <[EMAIL PROTECTED]> > > When a device fails to register the class symlinks where not cleaned up. > This left a symlink in the /sys/class/"device"/ directory that pointed > to no where. This caused the sysfs_follow_link Oops I reported earlier. > This patch cleanups up the symlink. Please apply. Thank you. > > Signed-Off: James Simmons <[EMAIL PROTECTED]> > Signed-off-by: Greg Kroah-Hartman <[EMAIL PROTECTED]> > --- > drivers/base/core.c | 31 ++- > 1 files changed, 30 insertions(+), 1 deletions(-) > > diff --git a/drivers/base/core.c b/drivers/base/core.c > index d04fd33..cf2a398 100644 > --- a/drivers/base/core.c > +++ b/drivers/base/core.c > @@ -637,12 +637,41 @@ int device_add(struct device *dev) >BUS_NOTIFY_DEL_DEVICE, dev); > device_remove_groups(dev); > GroupError: > - device_remove_attrs(dev); > + device_remove_attrs(dev); > AttrsError: > if (dev->devt_attr) { > device_remove_file(dev, dev->devt_attr); > kfree(dev->devt_attr); > } > + > + if (dev->class) { > + sysfs_remove_link(>kobj, "subsystem"); > + /* If this is not a "fake" compatible device, remove the > + * symlink from the class to the device. */ > + if (dev->kobj.parent != >class->subsys.kset.kobj) > + sysfs_remove_link(>class->subsys.kset.kobj, > + dev->bus_id); > +#ifdef CONFIG_SYSFS_DEPRECATED > + if (parent) { > + char *class_name = make_class_name(dev->class->name, > +>kobj); > + if (class_name) > + sysfs_remove_link(>parent->kobj, > + class_name); > + kfree(class_name); > + sysfs_remove_link(>kobj, "device"); > + } > +#endif > + < block begin > + down(>class->sem); > + /* notify any interfaces that the device is now gone */ > + list_for_each_entry(class_intf, >class->interfaces, node) > + if (class_intf->remove_dev) > + class_intf->remove_dev(dev, class_intf); > + /* remove the device from the class list */ > + list_del_init(>node); > + up(>class->sem); << block end May be i've missed something, but i'm confuesd a litle bit. For example if error happens while device_pm_add() we jump to label "PMError" and code from block above will be executed (device will be remove from list), but this device wasn't added to this list yet! > + } > ueventattrError: > device_remove_file(dev, >uevent_attr); > attrError: > -- > 1.5.0.1 > > - > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to [EMAIL PROTECTED] > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH 8/9] Driver core: fix error by cleanup up symlinks properly
Greg Kroah-Hartman [EMAIL PROTECTED] writes: From: James Simmons [EMAIL PROTECTED] When a device fails to register the class symlinks where not cleaned up. This left a symlink in the /sys/class/device/ directory that pointed to no where. This caused the sysfs_follow_link Oops I reported earlier. This patch cleanups up the symlink. Please apply. Thank you. Signed-Off: James Simmons [EMAIL PROTECTED] Signed-off-by: Greg Kroah-Hartman [EMAIL PROTECTED] --- drivers/base/core.c | 31 ++- 1 files changed, 30 insertions(+), 1 deletions(-) diff --git a/drivers/base/core.c b/drivers/base/core.c index d04fd33..cf2a398 100644 --- a/drivers/base/core.c +++ b/drivers/base/core.c @@ -637,12 +637,41 @@ int device_add(struct device *dev) BUS_NOTIFY_DEL_DEVICE, dev); device_remove_groups(dev); GroupError: - device_remove_attrs(dev); + device_remove_attrs(dev); AttrsError: if (dev-devt_attr) { device_remove_file(dev, dev-devt_attr); kfree(dev-devt_attr); } + + if (dev-class) { + sysfs_remove_link(dev-kobj, subsystem); + /* If this is not a fake compatible device, remove the + * symlink from the class to the device. */ + if (dev-kobj.parent != dev-class-subsys.kset.kobj) + sysfs_remove_link(dev-class-subsys.kset.kobj, + dev-bus_id); +#ifdef CONFIG_SYSFS_DEPRECATED + if (parent) { + char *class_name = make_class_name(dev-class-name, +dev-kobj); + if (class_name) + sysfs_remove_link(dev-parent-kobj, + class_name); + kfree(class_name); + sysfs_remove_link(dev-kobj, device); + } +#endif + block begin + down(dev-class-sem); + /* notify any interfaces that the device is now gone */ + list_for_each_entry(class_intf, dev-class-interfaces, node) + if (class_intf-remove_dev) + class_intf-remove_dev(dev, class_intf); + /* remove the device from the class list */ + list_del_init(dev-node); + up(dev-class-sem); block end May be i've missed something, but i'm confuesd a litle bit. For example if error happens while device_pm_add() we jump to label PMError and code from block above will be executed (device will be remove from list), but this device wasn't added to this list yet! + } ueventattrError: device_remove_file(dev, dev-uevent_attr); attrError: -- 1.5.0.1 - To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/ - To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[PATCH 8/9] Driver core: fix error by cleanup up symlinks properly
From: James Simmons <[EMAIL PROTECTED]> When a device fails to register the class symlinks where not cleaned up. This left a symlink in the /sys/class/"device"/ directory that pointed to no where. This caused the sysfs_follow_link Oops I reported earlier. This patch cleanups up the symlink. Please apply. Thank you. Signed-Off: James Simmons <[EMAIL PROTECTED]> Signed-off-by: Greg Kroah-Hartman <[EMAIL PROTECTED]> --- drivers/base/core.c | 31 ++- 1 files changed, 30 insertions(+), 1 deletions(-) diff --git a/drivers/base/core.c b/drivers/base/core.c index d04fd33..cf2a398 100644 --- a/drivers/base/core.c +++ b/drivers/base/core.c @@ -637,12 +637,41 @@ int device_add(struct device *dev) BUS_NOTIFY_DEL_DEVICE, dev); device_remove_groups(dev); GroupError: - device_remove_attrs(dev); + device_remove_attrs(dev); AttrsError: if (dev->devt_attr) { device_remove_file(dev, dev->devt_attr); kfree(dev->devt_attr); } + + if (dev->class) { + sysfs_remove_link(>kobj, "subsystem"); + /* If this is not a "fake" compatible device, remove the +* symlink from the class to the device. */ + if (dev->kobj.parent != >class->subsys.kset.kobj) + sysfs_remove_link(>class->subsys.kset.kobj, + dev->bus_id); +#ifdef CONFIG_SYSFS_DEPRECATED + if (parent) { + char *class_name = make_class_name(dev->class->name, + >kobj); + if (class_name) + sysfs_remove_link(>parent->kobj, + class_name); + kfree(class_name); + sysfs_remove_link(>kobj, "device"); + } +#endif + + down(>class->sem); + /* notify any interfaces that the device is now gone */ + list_for_each_entry(class_intf, >class->interfaces, node) + if (class_intf->remove_dev) + class_intf->remove_dev(dev, class_intf); + /* remove the device from the class list */ + list_del_init(>node); + up(>class->sem); + } ueventattrError: device_remove_file(dev, >uevent_attr); attrError: -- 1.5.0.1 - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[PATCH 8/9] Driver core: fix error by cleanup up symlinks properly
From: James Simmons [EMAIL PROTECTED] When a device fails to register the class symlinks where not cleaned up. This left a symlink in the /sys/class/device/ directory that pointed to no where. This caused the sysfs_follow_link Oops I reported earlier. This patch cleanups up the symlink. Please apply. Thank you. Signed-Off: James Simmons [EMAIL PROTECTED] Signed-off-by: Greg Kroah-Hartman [EMAIL PROTECTED] --- drivers/base/core.c | 31 ++- 1 files changed, 30 insertions(+), 1 deletions(-) diff --git a/drivers/base/core.c b/drivers/base/core.c index d04fd33..cf2a398 100644 --- a/drivers/base/core.c +++ b/drivers/base/core.c @@ -637,12 +637,41 @@ int device_add(struct device *dev) BUS_NOTIFY_DEL_DEVICE, dev); device_remove_groups(dev); GroupError: - device_remove_attrs(dev); + device_remove_attrs(dev); AttrsError: if (dev-devt_attr) { device_remove_file(dev, dev-devt_attr); kfree(dev-devt_attr); } + + if (dev-class) { + sysfs_remove_link(dev-kobj, subsystem); + /* If this is not a fake compatible device, remove the +* symlink from the class to the device. */ + if (dev-kobj.parent != dev-class-subsys.kset.kobj) + sysfs_remove_link(dev-class-subsys.kset.kobj, + dev-bus_id); +#ifdef CONFIG_SYSFS_DEPRECATED + if (parent) { + char *class_name = make_class_name(dev-class-name, + dev-kobj); + if (class_name) + sysfs_remove_link(dev-parent-kobj, + class_name); + kfree(class_name); + sysfs_remove_link(dev-kobj, device); + } +#endif + + down(dev-class-sem); + /* notify any interfaces that the device is now gone */ + list_for_each_entry(class_intf, dev-class-interfaces, node) + if (class_intf-remove_dev) + class_intf-remove_dev(dev, class_intf); + /* remove the device from the class list */ + list_del_init(dev-node); + up(dev-class-sem); + } ueventattrError: device_remove_file(dev, dev-uevent_attr); attrError: -- 1.5.0.1 - To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/