]> git.neil.brown.name Git - history.git/commitdiff
devicemode: Implement driver_for_each_dev
authorPatrick Mochel <mochel@osdl.org>
Thu, 30 May 2002 06:13:48 +0000 (23:13 -0700)
committerPatrick Mochel <mochel@osdl.org>
Thu, 30 May 2002 06:13:48 +0000 (23:13 -0700)
- iterate over all devices a driver has, with proper locking on driver and refcounting on devices

drivers/base/driver.c

index a3e1e078385ded60fed38c5a69d26af75fc31693..b640347eeedaedc8f7e88aea58d739c91d37eff9 100644 (file)
@@ -8,6 +8,39 @@
 #include <linux/errno.h>
 #include "base.h"
 
+
+int driver_for_each_dev(struct device_driver * drv, void * data, int (*callback)(struct device *, void * ))
+{
+       struct device * next;
+       struct device * dev = NULL;
+       struct list_head * node;
+       int error = 0;
+
+       get_driver(drv);
+       read_lock(&drv->lock);
+       node = drv->devices.next;
+       while (node != &drv->devices) {
+               next = list_entry(node,struct device,driver_list);
+               get_device(next);
+               read_unlock(&drv->lock);
+
+               if (dev)
+                       put_device(dev);
+               dev = next;
+               if ((error = callback(dev,data))) {
+                       put_device(dev);
+                       break;
+               }
+               read_lock(&drv->lock);
+               node = dev->driver_list.next;
+       }
+       read_unlock(&drv->lock);
+       if (dev)
+               put_device(dev);
+       put_driver(drv);
+       return error;
+}
+
 /**
  * driver_make_dir - create a driverfs directory for a driver
  * @drv:       driver in question
@@ -68,5 +101,6 @@ void put_driver(struct device_driver * drv)
                drv->release(drv);
 }
 
+EXPORT_SYMBOL(driver_for_each_dev);
 EXPORT_SYMBOL(driver_register);
 EXPORT_SYMBOL(put_driver);