Revert to Fedora kernel-2.6.17-1.2187_FC5 patched with vs2.0.2.1; there are too many...
[linux-2.6.git] / drivers / s390 / cio / ccwgroup.c
index 38954f5..bdfee7f 100644 (file)
@@ -152,6 +152,7 @@ ccwgroup_create(struct device *root,
        struct ccwgroup_device *gdev;
        int i;
        int rc;
+       int del_drvdata;
 
        if (argc > 256) /* disallow dumb users */
                return -EINVAL;
@@ -162,6 +163,7 @@ ccwgroup_create(struct device *root,
 
        atomic_set(&gdev->onoff, 0);
 
+       del_drvdata = 0;
        for (i = 0; i < argc; i++) {
                gdev->cdev[i] = get_ccwdev_by_busid(cdrv, argv[i]);
 
@@ -178,14 +180,18 @@ ccwgroup_create(struct device *root,
                        rc = -EINVAL;
                        goto free_dev;
                }
-               gdev->cdev[i]->dev.driver_data = gdev;
        }
+       for (i = 0; i < argc; i++)
+               gdev->cdev[i]->dev.driver_data = gdev;
+       del_drvdata = 1;
 
        gdev->creator_id = creator_id;
        gdev->count = argc;
-       gdev->dev.bus = &ccwgroup_bus_type;
-       gdev->dev.parent = root;
-       gdev->dev.release = ccwgroup_release;
+       gdev->dev = (struct device ) {
+               .bus = &ccwgroup_bus_type,
+               .parent = root,
+               .release = ccwgroup_release,
+       };
 
        snprintf (gdev->dev.bus_id, BUS_ID_SIZE, "%s",
                        gdev->cdev[0]->dev.bus_id);
@@ -220,9 +226,9 @@ error:
 free_dev:
        for (i = 0; i < argc; i++)
                if (gdev->cdev[i]) {
-                       if (gdev->cdev[i]->dev.driver_data == gdev)
-                               gdev->cdev[i]->dev.driver_data = NULL;
                        put_device(&gdev->cdev[i]->dev);
+                       if (del_drvdata)
+                               gdev->cdev[i]->dev.driver_data = NULL;
                }
        kfree(gdev);
        return rc;
@@ -313,7 +319,7 @@ ccwgroup_online_store (struct device *dev, struct device_attribute *attr, const
        if (!try_module_get(gdrv->owner))
                return -EINVAL;
 
-       value = simple_strtoul(buf, NULL, 0);
+       value = simple_strtoul(buf, 0, 0);
        ret = count;
        if (value == 1)
                ccwgroup_set_online(gdev);
@@ -389,31 +395,30 @@ int
 ccwgroup_driver_register (struct ccwgroup_driver *cdriver)
 {
        /* register our new driver with the core */
-       cdriver->driver.bus = &ccwgroup_bus_type;
-       cdriver->driver.name = cdriver->name;
+       cdriver->driver = (struct device_driver) {
+               .bus = &ccwgroup_bus_type,
+               .name = cdriver->name,
+       };
 
        return driver_register(&cdriver->driver);
 }
 
 static int
-__ccwgroup_match_all(struct device *dev, void *data)
+__ccwgroup_driver_unregister_device(struct device *dev, void *data)
 {
-       return 1;
+       __ccwgroup_remove_symlinks(to_ccwgroupdev(dev));
+       device_unregister(dev);
+       put_device(dev);
+       return 0;
 }
 
 void
 ccwgroup_driver_unregister (struct ccwgroup_driver *cdriver)
 {
-       struct device *dev;
-
        /* We don't want ccwgroup devices to live longer than their driver. */
        get_driver(&cdriver->driver);
-       while ((dev = driver_find_device(&cdriver->driver, NULL, NULL,
-                                        __ccwgroup_match_all))) {
-               __ccwgroup_remove_symlinks(to_ccwgroupdev(dev));
-               device_unregister(dev);
-               put_device(dev);
-       }
+       driver_for_each_device(&cdriver->driver, NULL, NULL,
+                              __ccwgroup_driver_unregister_device);
        put_driver(&cdriver->driver);
        driver_unregister(&cdriver->driver);
 }