fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / drivers / s390 / cio / ccwgroup.c
index 8013c8e..38954f5 100644 (file)
@@ -152,19 +152,16 @@ 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 = kmalloc(sizeof(*gdev) + argc*sizeof(gdev->cdev[0]), GFP_KERNEL);
+       gdev = kzalloc(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]);
 
@@ -181,18 +178,14 @@ ccwgroup_create(struct device *root,
                        rc = -EINVAL;
                        goto free_dev;
                }
-       }
-       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 = (struct device ) {
-               .bus = &ccwgroup_bus_type,
-               .parent = root,
-               .release = ccwgroup_release,
-       };
+       gdev->dev.bus = &ccwgroup_bus_type;
+       gdev->dev.parent = root;
+       gdev->dev.release = ccwgroup_release;
 
        snprintf (gdev->dev.bus_id, BUS_ID_SIZE, "%s",
                        gdev->cdev[0]->dev.bus_id);
@@ -227,9 +220,9 @@ error:
 free_dev:
        for (i = 0; i < argc; i++)
                if (gdev->cdev[i]) {
-                       put_device(&gdev->cdev[i]->dev);
-                       if (del_drvdata)
+                       if (gdev->cdev[i]->dev.driver_data == gdev)
                                gdev->cdev[i]->dev.driver_data = NULL;
+                       put_device(&gdev->cdev[i]->dev);
                }
        kfree(gdev);
        return rc;
@@ -320,7 +313,7 @@ ccwgroup_online_store (struct device *dev, struct device_attribute *attr, const
        if (!try_module_get(gdrv->owner))
                return -EINVAL;
 
-       value = simple_strtoul(buf, 0, 0);
+       value = simple_strtoul(buf, NULL, 0);
        ret = count;
        if (value == 1)
                ccwgroup_set_online(gdev);
@@ -396,30 +389,31 @@ int
 ccwgroup_driver_register (struct ccwgroup_driver *cdriver)
 {
        /* register our new driver with the core */
-       cdriver->driver = (struct device_driver) {
-               .bus = &ccwgroup_bus_type,
-               .name = cdriver->name,
-       };
+       cdriver->driver.bus = &ccwgroup_bus_type;
+       cdriver->driver.name = cdriver->name;
 
        return driver_register(&cdriver->driver);
 }
 
 static int
-__ccwgroup_driver_unregister_device(struct device *dev, void *data)
+__ccwgroup_match_all(struct device *dev, void *data)
 {
-       __ccwgroup_remove_symlinks(to_ccwgroupdev(dev));
-       device_unregister(dev);
-       put_device(dev);
-       return 0;
+       return 1;
 }
 
 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);
-       driver_for_each_device(&cdriver->driver, NULL, NULL,
-                              __ccwgroup_driver_unregister_device);
+       while ((dev = driver_find_device(&cdriver->driver, NULL, NULL,
+                                        __ccwgroup_match_all))) {
+               __ccwgroup_remove_symlinks(to_ccwgroupdev(dev));
+               device_unregister(dev);
+               put_device(dev);
+       }
        put_driver(&cdriver->driver);
        driver_unregister(&cdriver->driver);
 }