rk: revert 20f3d0b+v3.0.66 to v3.0
[firefly-linux-kernel-4.4.55.git] / drivers / s390 / cio / ccwgroup.c
index cda9bd6e48e8d19743290a9fec017194a116655b..5c567414c4bb81ee74250b01a4755d8c30da3dbc 100644 (file)
@@ -87,12 +87,6 @@ static void __ccwgroup_remove_cdev_refs(struct ccwgroup_device *gdev)
        }
 }
 
-static ssize_t ccwgroup_online_store(struct device *dev,
-                                    struct device_attribute *attr,
-                                    const char *buf, size_t count);
-static ssize_t ccwgroup_online_show(struct device *dev,
-                                   struct device_attribute *attr,
-                                   char *buf);
 /*
  * Provide an 'ungroup' attribute so the user can remove group devices no
  * longer needed or accidentially created. Saves memory :)
@@ -140,20 +134,6 @@ out:
 }
 
 static DEVICE_ATTR(ungroup, 0200, NULL, ccwgroup_ungroup_store);
-static DEVICE_ATTR(online, 0644, ccwgroup_online_show, ccwgroup_online_store);
-
-static struct attribute *ccwgroup_attrs[] = {
-       &dev_attr_online.attr,
-       &dev_attr_ungroup.attr,
-       NULL,
-};
-static struct attribute_group ccwgroup_attr_group = {
-       .attrs = ccwgroup_attrs,
-};
-static const struct attribute_group *ccwgroup_attr_groups[] = {
-       &ccwgroup_attr_group,
-       NULL,
-};
 
 static void
 ccwgroup_release (struct device *dev)
@@ -313,17 +293,25 @@ int ccwgroup_create_from_string(struct device *root, unsigned int creator_id,
        }
 
        dev_set_name(&gdev->dev, "%s", dev_name(&gdev->cdev[0]->dev));
-       gdev->dev.groups = ccwgroup_attr_groups;
+
        rc = device_add(&gdev->dev);
        if (rc)
                goto error;
        get_device(&gdev->dev);
+       rc = device_create_file(&gdev->dev, &dev_attr_ungroup);
+
+       if (rc) {
+               device_unregister(&gdev->dev);
+               goto error;
+       }
+
        rc = __ccwgroup_create_symlinks(gdev);
        if (!rc) {
                mutex_unlock(&gdev->reg_mutex);
                put_device(&gdev->dev);
                return 0;
        }
+       device_remove_file(&gdev->dev, &dev_attr_ungroup);
        device_unregister(&gdev->dev);
 error:
        for (i = 0; i < num_devices; i++)
@@ -435,7 +423,7 @@ ccwgroup_online_store (struct device *dev, struct device_attribute *attr, const
        int ret;
 
        if (!dev->driver)
-               return -EINVAL;
+               return -ENODEV;
 
        gdev = to_ccwgroupdev(dev);
        gdrv = to_ccwgroupdrv(dev->driver);
@@ -468,6 +456,8 @@ ccwgroup_online_show (struct device *dev, struct device_attribute *attr, char *b
        return sprintf(buf, online ? "1\n" : "0\n");
 }
 
+static DEVICE_ATTR(online, 0644, ccwgroup_online_show, ccwgroup_online_store);
+
 static int
 ccwgroup_probe (struct device *dev)
 {
@@ -479,7 +469,12 @@ ccwgroup_probe (struct device *dev)
        gdev = to_ccwgroupdev(dev);
        gdrv = to_ccwgroupdrv(dev->driver);
 
+       if ((ret = device_create_file(dev, &dev_attr_online)))
+               return ret;
+
        ret = gdrv->probe ? gdrv->probe(gdev) : -ENODEV;
+       if (ret)
+               device_remove_file(dev, &dev_attr_online);
 
        return ret;
 }
@@ -490,6 +485,9 @@ ccwgroup_remove (struct device *dev)
        struct ccwgroup_device *gdev;
        struct ccwgroup_driver *gdrv;
 
+       device_remove_file(dev, &dev_attr_online);
+       device_remove_file(dev, &dev_attr_ungroup);
+
        if (!dev->driver)
                return 0;