Re: [PATCH 8/9] Driver core: fix error by cleanup up symlinks properly

2007-03-10 Thread Dmitriy Monakhov
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

2007-03-10 Thread Dmitriy Monakhov
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

2007-02-23 Thread Greg Kroah-Hartman
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

2007-02-23 Thread Greg Kroah-Hartman
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/