linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / drivers / s390 / cio / ccwgroup.c
index 38954f5..8013c8e 100644 (file)
@@ -152,16 +152,19 @@ ccwgroup_create(struct device *root,
        struct ccwgroup_device *gdev;
        int i;
        int rc;
+       int del_drvdata;
 
        if (argc > 256) /* disallow dumb users */
                return -EINVAL;
 
-       gdev = kzalloc(sizeof(*gdev) + argc*sizeof(gdev->cdev[0]), GFP_KERNEL);
+       gdev = kmalloc(sizeof(*gdev) + argc*sizeof(gdev->cdev[0]), GFP_KERNEL);
        if (!gdev)
                return -ENOMEM;
 
+       memset(gdev, 0, sizeof(*gdev) + argc*sizeof(gdev->cdev[0]));
        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 +181,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 +227,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 +320,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 +396,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);
 }