int i;
char *name = NULL;
- for (i = 0; i < sizeof(raid_states)/sizeof(raid_states[0]); i++) {
+ for (i = 0; i < ARRAY_SIZE(raid_states); i++) {
if (raid_states[i].value == state) {
name = raid_states[i].name;
break;
int i;
char *name = NULL;
- for (i = 0; i < sizeof(raid_levels)/sizeof(raid_levels[0]); i++) {
+ for (i = 0; i < ARRAY_SIZE(raid_levels); i++) {
if (raid_levels[i].value == level) {
name = raid_levels[i].name;
break;
kfree(rc);
}
-void raid_component_add(struct raid_template *r,struct device *raid_dev,
- struct device *component_dev)
+int raid_component_add(struct raid_template *r,struct device *raid_dev,
+ struct device *component_dev)
{
struct class_device *cdev =
attribute_container_find_class_device(&r->raid_attrs.ac,
raid_dev);
struct raid_component *rc;
struct raid_data *rd = class_get_devdata(cdev);
+ int err;
rc = kzalloc(sizeof(*rc), GFP_KERNEL);
if (!rc)
- return;
+ return -ENOMEM;
INIT_LIST_HEAD(&rc->node);
class_device_initialize(&rc->cdev);
list_add_tail(&rc->node, &rd->component_list);
rc->cdev.parent = cdev;
rc->cdev.class = &raid_class.class;
- class_device_add(&rc->cdev);
+ err = class_device_add(&rc->cdev);
+ if (err)
+ goto err_out;
+
+ return 0;
+
+err_out:
+ list_del(&rc->node);
+ rd->component_count--;
+ put_device(component_dev);
+ kfree(rc);
+ return err;
}
EXPORT_SYMBOL(raid_component_add);
{
struct raid_internal *i = to_raid_internal(r);
- attribute_container_unregister(&i->r.raid_attrs.ac);
+ BUG_ON(attribute_container_unregister(&i->r.raid_attrs.ac));
kfree(i);
}