summaryrefslogtreecommitdiff
path: root/linux-core/drm_sysfs.c
diff options
context:
space:
mode:
Diffstat (limited to 'linux-core/drm_sysfs.c')
-rw-r--r--linux-core/drm_sysfs.c31
1 files changed, 25 insertions, 6 deletions
diff --git a/linux-core/drm_sysfs.c b/linux-core/drm_sysfs.c
index ace0778b..9b2f5dce 100644
--- a/linux-core/drm_sysfs.c
+++ b/linux-core/drm_sysfs.c
@@ -93,11 +93,15 @@ struct drm_sysfs_class *drm_sysfs_create(struct module *owner, char *name)
retval = class_register(&cs->class);
if (retval)
goto error;
- class_create_file(&cs->class, &class_attr_version);
+ retval = class_create_file(&cs->class, &class_attr_version);
+ if (retval)
+ goto error_with_class;
return cs;
- error:
+ error_with_class:
+ class_unregister(&cs->class);
+ error:
kfree(cs);
return ERR_PTR(retval);
}
@@ -170,16 +174,31 @@ struct class_device *drm_sysfs_device_add(struct drm_sysfs_class *cs,
if (retval)
goto error;
- class_device_create_file(&s_dev->class_dev, &cs->attr);
+ retval = class_device_create_file(&s_dev->class_dev, &cs->attr);
+ if (retval)
+ goto error_with_device;
+
class_set_devdata(&s_dev->class_dev, head);
- for (i = 0; i < ARRAY_SIZE(class_device_attrs); i++)
- class_device_create_file(&s_dev->class_dev, &class_device_attrs[i]);
+ for (i = 0; i < ARRAY_SIZE(class_device_attrs); i++) {
+ retval = class_device_create_file(&s_dev->class_dev,
+ &class_device_attrs[i]);
+ if (retval)
+ goto error_with_files;
+ }
return &s_dev->class_dev;
-error:
+ error_with_files:
+ while (i > 0)
+ class_device_remove_file(&s_dev->class_dev,
+ &class_device_attrs[--i]);
+ class_device_remove_file(&s_dev->class_dev, &cs->attr);
+ error_with_device:
+ class_device_unregister(&s_dev->class_dev);
+ error:
kfree(s_dev);
+
return ERR_PTR(retval);
}