]> nv-tegra.nvidia Code Review - linux-2.6.git/blobdiff - drivers/scsi/raid_class.c
config: tegra3: enable /dev mount with ACL
[linux-2.6.git] / drivers / scsi / raid_class.c
index 5b1c12041a4fd054ffb00bed6bb9eefda1665930..2c146b44d95fc7e14a5705f2934142770f65f79b 100644 (file)
@@ -24,15 +24,15 @@ struct raid_internal {
        struct raid_template r;
        struct raid_function_template *f;
        /* The actual attributes */
-       struct class_device_attribute private_attrs[RAID_NUM_ATTRS];
+       struct device_attribute private_attrs[RAID_NUM_ATTRS];
        /* The array of null terminated pointers to attributes 
         * needed by scsi_sysfs.c */
-       struct class_device_attribute *attrs[RAID_NUM_ATTRS + 1];
+       struct device_attribute *attrs[RAID_NUM_ATTRS + 1];
 };
 
 struct raid_component {
        struct list_head node;
-       struct class_device cdev;
+       struct device dev;
        int num;
 };
 
@@ -50,9 +50,9 @@ struct raid_component {
        tc_to_raid_internal(tc);                                        \
 })
 
-#define class_device_to_raid_internal(cdev) ({                         \
+#define device_to_raid_internal(dev) ({                                \
        struct attribute_container *ac =                                \
-               attribute_container_classdev_to_container(cdev);        \
+               attribute_container_classdev_to_container(dev); \
        ac_to_raid_internal(ac);                                        \
 })
        
@@ -63,6 +63,7 @@ static int raid_match(struct attribute_container *cont, struct device *dev)
         * emulated RAID devices, so start with SCSI */
        struct raid_internal *i = ac_to_raid_internal(cont);
 
+#if defined(CONFIG_SCSI) || defined(CONFIG_SCSI_MODULE)
        if (scsi_is_sdev_device(dev)) {
                struct scsi_device *sdev = to_scsi_device(dev);
 
@@ -71,38 +72,39 @@ static int raid_match(struct attribute_container *cont, struct device *dev)
 
                return i->f->is_raid(dev);
        }
+#endif
        /* FIXME: look at other subsystems too */
        return 0;
 }
 
 static int raid_setup(struct transport_container *tc, struct device *dev,
-                      struct class_device *cdev)
+                      struct device *cdev)
 {
        struct raid_data *rd;
 
-       BUG_ON(class_get_devdata(cdev));
+       BUG_ON(dev_get_drvdata(cdev));
 
        rd = kzalloc(sizeof(*rd), GFP_KERNEL);
        if (!rd)
                return -ENOMEM;
 
        INIT_LIST_HEAD(&rd->component_list);
-       class_set_devdata(cdev, rd);
+       dev_set_drvdata(cdev, rd);
                
        return 0;
 }
 
 static int raid_remove(struct transport_container *tc, struct device *dev,
-                      struct class_device *cdev)
+                      struct device *cdev)
 {
-       struct raid_data *rd = class_get_devdata(cdev);
+       struct raid_data *rd = dev_get_drvdata(cdev);
        struct raid_component *rc, *next;
        dev_printk(KERN_ERR, dev, "RAID REMOVE\n");
-       class_set_devdata(cdev, NULL);
+       dev_set_drvdata(cdev, NULL);
        list_for_each_entry_safe(rc, next, &rd->component_list, node) {
                list_del(&rc->node);
-               dev_printk(KERN_ERR, rc->cdev.dev, "RAID COMPONENT REMOVE\n");
-               class_device_unregister(&rc->cdev);
+               dev_printk(KERN_ERR, rc->dev.parent, "RAID COMPONENT REMOVE\n");
+               device_unregister(&rc->dev);
        }
        dev_printk(KERN_ERR, dev, "RAID REMOVE DONE\n");
        kfree(rd);
@@ -115,7 +117,7 @@ static DECLARE_TRANSPORT_CLASS(raid_class,
                               raid_remove,
                               NULL);
 
-static struct {
+static const struct {
        enum raid_state value;
        char            *name;
 } raid_states[] = {
@@ -131,7 +133,7 @@ static const char *raid_state_name(enum raid_state state)
        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;
@@ -148,9 +150,12 @@ static struct {
        { RAID_LEVEL_LINEAR, "linear" },
        { RAID_LEVEL_0, "raid0" },
        { RAID_LEVEL_1, "raid1" },
+       { RAID_LEVEL_10, "raid10" },
+       { RAID_LEVEL_1E, "raid1e" },
        { RAID_LEVEL_3, "raid3" },
        { RAID_LEVEL_4, "raid4" },
        { RAID_LEVEL_5, "raid5" },
+       { RAID_LEVEL_50, "raid50" },
        { RAID_LEVEL_6, "raid6" },
 };
 
@@ -159,7 +164,7 @@ static const char *raid_level_name(enum raid_level level)
        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;
@@ -169,9 +174,11 @@ static const char *raid_level_name(enum raid_level level)
 }
 
 #define raid_attr_show_internal(attr, fmt, var, code)                  \
-static ssize_t raid_show_##attr(struct class_device *cdev, char *buf)  \
+static ssize_t raid_show_##attr(struct device *dev,                    \
+                               struct device_attribute *attr,          \
+                               char *buf)                              \
 {                                                                      \
-       struct raid_data *rd = class_get_devdata(cdev);                 \
+       struct raid_data *rd = dev_get_drvdata(dev);                    \
        code                                                            \
        return snprintf(buf, 20, #fmt "\n", var);                       \
 }
@@ -182,17 +189,17 @@ raid_attr_show_internal(attr, %s, name,                                   \
        code                                                            \
        name = raid_##states##_name(rd->attr);                          \
 )                                                                      \
-static CLASS_DEVICE_ATTR(attr, S_IRUGO, raid_show_##attr, NULL)
+static DEVICE_ATTR(attr, S_IRUGO, raid_show_##attr, NULL)
 
 
 #define raid_attr_ro_internal(attr, code)                              \
 raid_attr_show_internal(attr, %d, rd->attr, code)                      \
-static CLASS_DEVICE_ATTR(attr, S_IRUGO, raid_show_##attr, NULL)
+static DEVICE_ATTR(attr, S_IRUGO, raid_show_##attr, NULL)
 
 #define ATTR_CODE(attr)                                                        \
-       struct raid_internal *i = class_device_to_raid_internal(cdev);  \
+       struct raid_internal *i = device_to_raid_internal(dev);         \
        if (i->f->get_##attr)                                           \
-               i->f->get_##attr(cdev->dev);
+               i->f->get_##attr(dev->parent);
 
 #define raid_attr_ro(attr)     raid_attr_ro_internal(attr, )
 #define raid_attr_ro_fn(attr)  raid_attr_ro_internal(attr, ATTR_CODE(attr))
@@ -204,40 +211,50 @@ raid_attr_ro_state(level);
 raid_attr_ro_fn(resync);
 raid_attr_ro_state_fn(state);
 
-static void raid_component_release(struct class_device *cdev)
+static void raid_component_release(struct device *dev)
 {
-       struct raid_component *rc = container_of(cdev, struct raid_component,
-                                                cdev);
-       dev_printk(KERN_ERR, rc->cdev.dev, "COMPONENT RELEASE\n");
-       put_device(rc->cdev.dev);
+       struct raid_component *rc =
+               container_of(dev, struct raid_component, dev);
+       dev_printk(KERN_ERR, rc->dev.parent, "COMPONENT RELEASE\n");
+       put_device(rc->dev.parent);
        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 =
+       struct 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);
+       struct raid_data *rd = dev_get_drvdata(cdev);
+       int err;
 
        rc = kzalloc(sizeof(*rc), GFP_KERNEL);
        if (!rc)
-               return;
+               return -ENOMEM;
 
        INIT_LIST_HEAD(&rc->node);
-       class_device_initialize(&rc->cdev);
-       rc->cdev.release = raid_component_release;
-       rc->cdev.dev = get_device(component_dev);
+       device_initialize(&rc->dev);
+       rc->dev.release = raid_component_release;
+       rc->dev.parent = get_device(component_dev);
        rc->num = rd->component_count++;
 
-       snprintf(rc->cdev.class_id, sizeof(rc->cdev.class_id),
-                "component-%d", rc->num);
+       dev_set_name(&rc->dev, "component-%d", rc->num);
        list_add_tail(&rc->node, &rd->component_list);
-       rc->cdev.parent = cdev;
-       rc->cdev.class = &raid_class.class;
-       class_device_add(&rc->cdev);
+       rc->dev.class = &raid_class.class;
+       err = device_add(&rc->dev);
+       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);
 
@@ -259,9 +276,9 @@ raid_class_attach(struct raid_function_template *ft)
 
        attribute_container_register(&i->r.raid_attrs.ac);
 
-       i->attrs[count++] = &class_device_attr_level;
-       i->attrs[count++] = &class_device_attr_resync;
-       i->attrs[count++] = &class_device_attr_state;
+       i->attrs[count++] = &dev_attr_level;
+       i->attrs[count++] = &dev_attr_resync;
+       i->attrs[count++] = &dev_attr_state;
 
        i->attrs[count] = NULL;
        BUG_ON(count > RAID_NUM_ATTRS);
@@ -275,7 +292,7 @@ raid_class_release(struct raid_template *r)
 {
        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);
 }