ChangeSet 1.2055, 2005/03/09 15:41:29-08:00, [EMAIL PROTECTED]

[PATCH] class: add a semaphore to struct class, and use that instead of the 
subsystem rwsem.

This moves us away from using the rwsem, although recursive adds and removes of 
class devices
is not yet possible (nor is it really known if it even is needed.)  So this 
simple change is
done instead.

Signed-off-by: Greg Kroah-Hartman <[EMAIL PROTECTED]>


 drivers/base/class.c   |   23 +++++++++++------------
 include/linux/device.h |    2 +-
 2 files changed, 12 insertions(+), 13 deletions(-)


diff -Nru a/drivers/base/class.c b/drivers/base/class.c
--- a/drivers/base/class.c      2005-03-09 16:28:04 -08:00
+++ b/drivers/base/class.c      2005-03-09 16:28:04 -08:00
@@ -140,6 +140,7 @@
 
        INIT_LIST_HEAD(&cls->children);
        INIT_LIST_HEAD(&cls->interfaces);
+       init_MUTEX(&cls->sem);
        error = kobject_set_name(&cls->subsys.kset.kobj, "%s", cls->name);
        if (error)
                return error;
@@ -413,12 +414,12 @@
 
        /* now take care of our own registration */
        if (parent) {
-               down_write(&parent->subsys.rwsem);
+               down(&parent->sem);
                list_add_tail(&class_dev->node, &parent->children);
                list_for_each_entry(class_intf, &parent->interfaces, node)
                        if (class_intf->add)
                                class_intf->add(class_dev);
-               up_write(&parent->subsys.rwsem);
+               up(&parent->sem);
        }
 
        if (MAJOR(class_dev->devt))
@@ -448,12 +449,12 @@
        struct class_interface * class_intf;
 
        if (parent) {
-               down_write(&parent->subsys.rwsem);
+               down(&parent->sem);
                list_del_init(&class_dev->node);
                list_for_each_entry(class_intf, &parent->interfaces, node)
                        if (class_intf->remove)
                                class_intf->remove(class_dev);
-               up_write(&parent->subsys.rwsem);
+               up(&parent->sem);
        }
 
        if (class_dev->dev)
@@ -509,8 +510,8 @@
 
 int class_interface_register(struct class_interface *class_intf)
 {
-       struct class * parent;
-       struct class_device * class_dev;
+       struct class *parent;
+       struct class_device *class_dev;
 
        if (!class_intf || !class_intf->class)
                return -ENODEV;
@@ -519,14 +520,13 @@
        if (!parent)
                return -EINVAL;
 
-       down_write(&parent->subsys.rwsem);
+       down(&parent->sem);
        list_add_tail(&class_intf->node, &parent->interfaces);
-
        if (class_intf->add) {
                list_for_each_entry(class_dev, &parent->children, node)
                        class_intf->add(class_dev);
        }
-       up_write(&parent->subsys.rwsem);
+       up(&parent->sem);
 
        return 0;
 }
@@ -539,14 +539,13 @@
        if (!parent)
                return;
 
-       down_write(&parent->subsys.rwsem);
+       down(&parent->sem);
        list_del_init(&class_intf->node);
-
        if (class_intf->remove) {
                list_for_each_entry(class_dev, &parent->children, node)
                        class_intf->remove(class_dev);
        }
-       up_write(&parent->subsys.rwsem);
+       up(&parent->sem);
 
        class_put(parent);
 }
diff -Nru a/include/linux/device.h b/include/linux/device.h
--- a/include/linux/device.h    2005-03-09 16:28:04 -08:00
+++ b/include/linux/device.h    2005-03-09 16:28:04 -08:00
@@ -15,7 +15,6 @@
 #include <linux/ioport.h>
 #include <linux/kobject.h>
 #include <linux/list.h>
-#include <linux/spinlock.h>
 #include <linux/types.h>
 #include <linux/module.h>
 #include <linux/pm.h>
@@ -148,6 +147,7 @@
        struct subsystem        subsys;
        struct list_head        children;
        struct list_head        interfaces;
+       struct semaphore        sem;    /* locks both the children and 
interfaces lists */
 
        struct class_attribute          * class_attrs;
        struct class_device_attribute   * class_dev_attrs;

-
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/

Reply via email to