s390/cio/chp: cleanup attribute usage
authorSebastian Ott <sebott@linux.vnet.ibm.com>
Mon, 4 Jun 2012 17:29:41 +0000 (19:29 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Tue, 5 Jun 2012 11:23:36 +0000 (13:23 +0200)
Let the driver core handle device attribute creation and removal. This
will simplify the code and eliminates races between attribute
availability and userspace notification via uevents.

Signed-off-by: Sebastian Ott <sebott@linux.vnet.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
drivers/s390/cio/chp.c

index e792436..9b05480 100644 (file)
@@ -362,10 +362,13 @@ static struct attribute *chp_attrs[] = {
        &dev_attr_shared.attr,
        NULL,
 };
-
 static struct attribute_group chp_attr_group = {
        .attrs = chp_attrs,
 };
+static const struct attribute_group *chp_attr_groups[] = {
+       &chp_attr_group,
+       NULL,
+};
 
 static void chp_release(struct device *dev)
 {
@@ -397,6 +400,7 @@ int chp_new(struct chp_id chpid)
        chp->chpid = chpid;
        chp->state = 1;
        chp->dev.parent = &channel_subsystems[chpid.cssid]->device;
+       chp->dev.groups = chp_attr_groups;
        chp->dev.release = chp_release;
        mutex_init(&chp->lock);
 
@@ -426,16 +430,10 @@ int chp_new(struct chp_id chpid)
                put_device(&chp->dev);
                goto out;
        }
-       ret = sysfs_create_group(&chp->dev.kobj, &chp_attr_group);
-       if (ret) {
-               device_unregister(&chp->dev);
-               goto out;
-       }
        mutex_lock(&channel_subsystems[chpid.cssid]->mutex);
        if (channel_subsystems[chpid.cssid]->cm_enabled) {
                ret = chp_add_cmg_attr(chp);
                if (ret) {
-                       sysfs_remove_group(&chp->dev.kobj, &chp_attr_group);
                        device_unregister(&chp->dev);
                        mutex_unlock(&channel_subsystems[chpid.cssid]->mutex);
                        goto out;