ACPI: sanity check _PSS frequency to prevent cpufreq crash
[safe/jmp/linux-2.6] / drivers / md / faulty.c
index 4ebd0f2..8695809 100644 (file)
 #define        ModeShift       5
 
 #define MaxFault       50
-#include <linux/raid/md.h>
+#include <linux/blkdev.h>
+#include <linux/raid/md_u.h>
+#include "md.h"
+#include <linux/seq_file.h>
 
 
-static int faulty_fail(struct bio *bio, unsigned int bytes_done, int error)
+static void faulty_fail(struct bio *bio, int error)
 {
        struct bio *b = bio->bi_private;
 
        b->bi_size = bio->bi_size;
        b->bi_sector = bio->bi_sector;
 
-       if (bio->bi_size == 0)
-               bio_put(bio);
+       bio_put(bio);
 
-       clear_bit(BIO_UPTODATE, &b->bi_flags);
-       return (b->bi_end_io)(b, bytes_done, -EIO);
+       bio_io_error(b);
 }
 
 typedef struct faulty_conf {
@@ -167,7 +168,7 @@ static void add_sector(conf_t *conf, sector_t start, int mode)
                conf->nfaults = n+1;
 }
 
-static int make_request(request_queue_t *q, struct bio *bio)
+static int make_request(struct request_queue *q, struct bio *bio)
 {
        mddev_t *mddev = q->queuedata;
        conf_t *conf = (conf_t*)mddev->private;
@@ -179,7 +180,7 @@ static int make_request(request_queue_t *q, struct bio *bio)
                        /* special case - don't decrement, don't generic_make_request,
                         * just fail immediately
                         */
-                       bio_endio(bio, bio->bi_size, -EIO);
+                       bio_endio(bio, -EIO);
                        return 0;
                }
 
@@ -282,13 +283,25 @@ static int reconfig(mddev_t *mddev, int layout, int chunk_size)
        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 = kmalloc(sizeof(*conf), GFP_KERNEL);
+       if (!conf)
+               return -ENOMEM;
 
        for (i=0; i<Modes; i++) {
                atomic_set(&conf->counters[i], 0);
@@ -296,10 +309,10 @@ 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);
@@ -326,6 +339,7 @@ static struct mdk_personality faulty_personality =
        .stop           = stop,
        .status         = status,
        .reconfig       = reconfig,
+       .size           = faulty_size,
 };
 
 static int __init raid_init(void)