Merge branch 'bkl/fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/frederic...
[safe/jmp/linux-2.6] / drivers / md / faulty.c
index cf2ddce..1a89878 100644 (file)
 #define        ModeShift       5
 
 #define MaxFault       50
-#include <linux/raid/md.h>
+#include <linux/blkdev.h>
+#include <linux/raid/md_u.h>
+#include <linux/slab.h>
+#include "md.h"
+#include <linux/seq_file.h>
 
 
 static void faulty_fail(struct bio *bio, int error)
@@ -165,10 +169,9 @@ static void add_sector(conf_t *conf, sector_t start, int mode)
                conf->nfaults = n+1;
 }
 
-static int make_request(struct request_queue *q, struct bio *bio)
+static int make_request(mddev_t *mddev, struct bio *bio)
 {
-       mddev_t *mddev = q->queuedata;
-       conf_t *conf = (conf_t*)mddev->private;
+       conf_t *conf = mddev->private;
        int failit = 0;
 
        if (bio_data_dir(bio) == WRITE) {
@@ -221,7 +224,7 @@ static int make_request(struct request_queue *q, struct bio *bio)
 
 static void status(struct seq_file *seq, mddev_t *mddev)
 {
-       conf_t *conf = (conf_t*)mddev->private;
+       conf_t *conf = mddev->private;
        int n;
 
        if ((n=atomic_read(&conf->counters[WriteTransient])) != 0)
@@ -252,14 +255,14 @@ static void status(struct seq_file *seq, mddev_t *mddev)
 }
 
 
-static int reconfig(mddev_t *mddev, int layout, int chunk_size)
+static int reshape(mddev_t *mddev)
 {
-       int mode = layout & ModeMask;
-       int count = layout >> ModeShift;
+       int mode = mddev->new_layout & ModeMask;
+       int count = mddev->new_layout >> ModeShift;
        conf_t *conf = mddev->private;
 
-       if (chunk_size != -1)
-               return -EINVAL;
+       if (mddev->new_layout < 0)
+               return 0;
 
        /* new layout */
        if (mode == ClearFaults)
@@ -276,17 +279,34 @@ static int reconfig(mddev_t *mddev, int layout, int chunk_size)
                atomic_set(&conf->counters[mode], count);
        } else
                return -EINVAL;
+       mddev->new_layout = -1;
        mddev->layout = -1; /* makes sure further changes come through */
        return 0;
 }
 
+static sector_t faulty_size(mddev_t *mddev, sector_t sectors, int raid_disks)
+{
+       WARN_ONCE(raid_disks,
+                 "%s does not support generic reshape\n", __func__);
+
+       if (sectors == 0)
+               return mddev->dev_sectors;
+
+       return sectors;
+}
+
 static int run(mddev_t *mddev)
 {
        mdk_rdev_t *rdev;
-       struct list_head *tmp;
        int i;
+       conf_t *conf;
 
-       conf_t *conf = kmalloc(sizeof(*conf), GFP_KERNEL);
+       if (md_check_no_bitmap(mddev))
+               return -EINVAL;
+
+       conf = kmalloc(sizeof(*conf), GFP_KERNEL);
+       if (!conf)
+               return -ENOMEM;
 
        for (i=0; i<Modes; i++) {
                atomic_set(&conf->counters[i], 0);
@@ -294,20 +314,20 @@ static int run(mddev_t *mddev)
        }
        conf->nfaults = 0;
 
-       ITERATE_RDEV(mddev, rdev, tmp)
+       list_for_each_entry(rdev, &mddev->disks, same_set)
                conf->rdev = rdev;
 
-       mddev->array_size = mddev->size;
+       md_set_array_sectors(mddev, faulty_size(mddev, 0, 0));
        mddev->private = conf;
 
-       reconfig(mddev, mddev->layout, -1);
+       reshape(mddev);
 
        return 0;
 }
 
 static int stop(mddev_t *mddev)
 {
-       conf_t *conf = (conf_t *)mddev->private;
+       conf_t *conf = mddev->private;
 
        kfree(conf);
        mddev->private = NULL;
@@ -323,7 +343,8 @@ static struct mdk_personality faulty_personality =
        .run            = run,
        .stop           = stop,
        .status         = status,
-       .reconfig       = reconfig,
+       .check_reshape  = reshape,
+       .size           = faulty_size,
 };
 
 static int __init raid_init(void)
@@ -339,6 +360,7 @@ static void raid_exit(void)
 module_init(raid_init);
 module_exit(raid_exit);
 MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("Fault injection personality for MD");
 MODULE_ALIAS("md-personality-10"); /* faulty */
 MODULE_ALIAS("md-faulty");
 MODULE_ALIAS("md-level--5");