Merge branch 'for-3.2/core' of git://git.kernel.dk/linux-block
authorLinus Torvalds <torvalds@linux-foundation.org>
Sat, 5 Nov 2011 00:06:58 +0000 (17:06 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sat, 5 Nov 2011 00:06:58 +0000 (17:06 -0700)
* 'for-3.2/core' of git://git.kernel.dk/linux-block: (29 commits)
  block: don't call blk_drain_queue() if elevator is not up
  blk-throttle: use queue_is_locked() instead of lockdep_is_held()
  blk-throttle: Take blkcg->lock while traversing blkcg->policy_list
  blk-throttle: Free up policy node associated with deleted rule
  block: warn if tag is greater than real_max_depth.
  block: make gendisk hold a reference to its queue
  blk-flush: move the queue kick into
  blk-flush: fix invalid BUG_ON in blk_insert_flush
  block: Remove the control of complete cpu from bio.
  block: fix a typo in the blk-cgroup.h file
  block: initialize the bounce pool if high memory may be added later
  block: fix request_queue lifetime handling by making blk_queue_cleanup() properly shutdown
  block: drop @tsk from attempt_plug_merge() and explain sync rules
  block: make get_request[_wait]() fail if queue is dead
  block: reorganize throtl_get_tg() and blk_throtl_bio()
  block: reorganize queue draining
  block: drop unnecessary blk_get/put_queue() in scsi_cmd_ioctl() and blk_get_tg()
  block: pass around REQ_* flags instead of broken down booleans during request alloc/free
  block: move blk_throtl prototypes to block/blk.h
  block: fix genhd refcounting in blkio_policy_parse_and_set()
  ...

Fix up trivial conflicts due to "mddev_t" -> "struct mddev" conversion
and making the request functions be of type "void" instead of "int" in
 - drivers/md/{faulty.c,linear.c,md.c,md.h,multipath.c,raid0.c,raid1.c,raid10.c,raid5.c}
 - drivers/staging/zram/zram_drv.c

13 files changed:
1  2 
block/genhd.c
drivers/block/drbd/drbd_int.h
drivers/md/dm.c
drivers/md/faulty.c
drivers/md/linear.c
drivers/md/md.c
drivers/md/md.h
drivers/md/multipath.c
drivers/md/raid0.c
drivers/md/raid1.c
drivers/md/raid10.c
drivers/md/raid5.c
drivers/staging/zram/zram_drv.c

diff --combined block/genhd.c
@@@ -19,7 -19,6 +19,7 @@@
  #include <linux/mutex.h>
  #include <linux/idr.h>
  #include <linux/log2.h>
 +#include <linux/ctype.h>
  
  #include "blk.h"
  
@@@ -612,6 -611,12 +612,12 @@@ void add_disk(struct gendisk *disk
        register_disk(disk);
        blk_register_queue(disk);
  
+       /*
+        * Take an extra ref on queue which will be put on disk_release()
+        * so that it sticks around as long as @disk is there.
+        */
+       WARN_ON_ONCE(blk_get_queue(disk->queue));
        retval = sysfs_create_link(&disk_to_dev(disk)->kobj, &bdi->dev->kobj,
                                   "bdi");
        WARN_ON(retval);
@@@ -910,74 -915,6 +916,74 @@@ static int __init genhd_device_init(voi
  
  subsys_initcall(genhd_device_init);
  
 +static ssize_t alias_show(struct device *dev,
 +                             struct device_attribute *attr, char *buf)
 +{
 +      struct gendisk *disk = dev_to_disk(dev);
 +      ssize_t ret = 0;
 +
 +      if (disk->alias)
 +              ret = snprintf(buf, ALIAS_LEN, "%s\n", disk->alias);
 +      return ret;
 +}
 +
 +static ssize_t alias_store(struct device *dev, struct device_attribute *attr,
 +                         const char *buf, size_t count)
 +{
 +      struct gendisk *disk = dev_to_disk(dev);
 +      char *alias;
 +      char *envp[] = { NULL, NULL };
 +      unsigned char c;
 +      int i;
 +      ssize_t ret = count;
 +
 +      if (!count)
 +              return -EINVAL;
 +
 +      if (count >= ALIAS_LEN) {
 +              printk(KERN_ERR "alias: alias is too long\n");
 +              return -EINVAL;
 +      }
 +
 +      /* Validation check */
 +      for (i = 0; i < count; i++) {
 +              c = buf[i];
 +              if (i == count - 1 && c == '\n')
 +                      break;
 +              if (!isalnum(c) && c != '_' && c != '-') {
 +                      printk(KERN_ERR "alias: invalid alias\n");
 +                      return -EINVAL;
 +              }
 +      }
 +
 +      if (disk->alias) {
 +              printk(KERN_INFO "alias: %s is already assigned (%s)\n",
 +                     disk->disk_name, disk->alias);
 +              return -EINVAL;
 +      }
 +
 +      alias = kasprintf(GFP_KERNEL, "%s", buf);
 +      if (!alias)
 +              return -ENOMEM;
 +
 +      if (alias[count - 1] == '\n')
 +              alias[count - 1] = '\0';
 +
 +      envp[0] = kasprintf(GFP_KERNEL, "ALIAS=%s", alias);
 +      if (!envp[0]) {
 +              kfree(alias);
 +              return -ENOMEM;
 +      }
 +
 +      disk->alias = alias;
 +      printk(KERN_INFO "alias: assigned %s to %s\n", alias, disk->disk_name);
 +
 +      kobject_uevent_env(&dev->kobj, KOBJ_ADD, envp);
 +
 +      kfree(envp[0]);
 +      return ret;
 +}
 +
  static ssize_t disk_range_show(struct device *dev,
                               struct device_attribute *attr, char *buf)
  {
@@@ -1037,7 -974,6 +1043,7 @@@ static ssize_t disk_discard_alignment_s
        return sprintf(buf, "%d\n", queue_discard_alignment(disk->queue));
  }
  
 +static DEVICE_ATTR(alias, S_IRUGO|S_IWUSR, alias_show, alias_store);
  static DEVICE_ATTR(range, S_IRUGO, disk_range_show, NULL);
  static DEVICE_ATTR(ext_range, S_IRUGO, disk_ext_range_show, NULL);
  static DEVICE_ATTR(removable, S_IRUGO, disk_removable_show, NULL);
@@@ -1060,7 -996,6 +1066,7 @@@ static struct device_attribute dev_attr
  #endif
  
  static struct attribute *disk_attrs[] = {
 +      &dev_attr_alias.attr,
        &dev_attr_range.attr,
        &dev_attr_ext_range.attr,
        &dev_attr_removable.attr,
@@@ -1166,6 -1101,8 +1172,8 @@@ static void disk_release(struct device 
        disk_replace_part_tbl(disk, NULL);
        free_part_stats(&disk->part0);
        free_part_info(&disk->part0);
+       if (disk->queue)
+               blk_put_queue(disk->queue);
        kfree(disk);
  }
  struct class block_class = {
@@@ -28,6 -28,7 +28,6 @@@
  
  #include <linux/compiler.h>
  #include <linux/types.h>
 -#include <linux/version.h>
  #include <linux/list.h>
  #include <linux/sched.h>
  #include <linux/bitops.h>
@@@ -927,7 -928,7 +927,7 @@@ struct drbd_md 
  #define NL_INT64(pn,pr,member) __u64 member;
  #define NL_BIT(pn,pr,member)   unsigned member:1;
  #define NL_STRING(pn,pr,member,len) unsigned char member[len]; int member ## _len;
 -#include "linux/drbd_nl.h"
 +#include <linux/drbd_nl.h>
  
  struct drbd_backing_dev {
        struct block_device *backing_bdev;
@@@ -1506,7 -1507,7 +1506,7 @@@ extern void drbd_free_mdev(struct drbd_
  extern int proc_details;
  
  /* drbd_req */
- extern int drbd_make_request(struct request_queue *q, struct bio *bio);
+ extern void drbd_make_request(struct request_queue *q, struct bio *bio);
  extern int drbd_read_remote(struct drbd_conf *mdev, struct drbd_request *req);
  extern int drbd_merge_bvec(struct request_queue *q, struct bvec_merge_data *bvm, struct bio_vec *bvec);
  extern int is_valid_ar_handle(struct drbd_request *, sector_t);
diff --combined drivers/md/dm.c
  
  #define DM_MSG_PREFIX "core"
  
 +#ifdef CONFIG_PRINTK
 +/*
 + * ratelimit state to be used in DMXXX_LIMIT().
 + */
 +DEFINE_RATELIMIT_STATE(dm_ratelimit_state,
 +                     DEFAULT_RATELIMIT_INTERVAL,
 +                     DEFAULT_RATELIMIT_BURST);
 +EXPORT_SYMBOL(dm_ratelimit_state);
 +#endif
 +
  /*
   * Cookies are numeric values sent with CHANGE and REMOVE
   * uevents while resuming, removing or renaming the device.
@@@ -140,8 -130,6 +140,8 @@@ struct mapped_device 
        /* Protect queue and type against concurrent access. */
        struct mutex type_lock;
  
 +      struct target_type *immutable_target_type;
 +
        struct gendisk *disk;
        char name[16];
  
        /* forced geometry settings */
        struct hd_geometry geometry;
  
-       /* For saving the address of __make_request for request based dm */
-       make_request_fn *saved_make_request_fn;
        /* sysfs handle */
        struct kobject kobj;
  
@@@ -1403,7 -1388,7 +1400,7 @@@ out
   * The request function that just remaps the bio built up by
   * dm_merge_bvec.
   */
- static int _dm_request(struct request_queue *q, struct bio *bio)
+ static void _dm_request(struct request_queue *q, struct bio *bio)
  {
        int rw = bio_data_dir(bio);
        struct mapped_device *md = q->queuedata;
                        queue_io(md, bio);
                else
                        bio_io_error(bio);
-               return 0;
+               return;
        }
  
        __split_and_process_bio(md, bio);
        up_read(&md->io_lock);
-       return 0;
- }
- static int dm_make_request(struct request_queue *q, struct bio *bio)
- {
-       struct mapped_device *md = q->queuedata;
-       return md->saved_make_request_fn(q, bio); /* call __make_request() */
+       return;
  }
  
  static int dm_request_based(struct mapped_device *md)
        return blk_queue_stackable(md->queue);
  }
  
- static int dm_request(struct request_queue *q, struct bio *bio)
+ static void dm_request(struct request_queue *q, struct bio *bio)
  {
        struct mapped_device *md = q->queuedata;
  
        if (dm_request_based(md))
-               return dm_make_request(q, bio);
-       return _dm_request(q, bio);
+               blk_queue_bio(q, bio);
+       else
+               _dm_request(q, bio);
  }
  
  void dm_dispatch_request(struct request *rq)
@@@ -2098,8 -2076,6 +2088,8 @@@ static struct dm_table *__bind(struct m
        write_lock_irqsave(&md->map_lock, flags);
        old_map = md->map;
        md->map = t;
 +      md->immutable_target_type = dm_table_get_immutable_target_type(t);
 +
        dm_table_set_restrictions(t, q, limits);
        if (merge_is_optional)
                set_bit(DMF_MERGE_IS_OPTIONAL, &md->flags);
@@@ -2170,11 -2146,6 +2160,11 @@@ unsigned dm_get_md_type(struct mapped_d
        return md->type;
  }
  
 +struct target_type *dm_get_immutable_target_type(struct mapped_device *md)
 +{
 +      return md->immutable_target_type;
 +}
 +
  /*
   * Fully initialize a request-based queue (->elevator, ->request_fn, etc).
   */
@@@ -2191,7 -2162,6 +2181,6 @@@ static int dm_init_request_based_queue(
                return 0;
  
        md->queue = q;
-       md->saved_make_request_fn = md->queue->make_request_fn;
        dm_init_md_queue(md);
        blk_queue_softirq_done(md->queue, dm_softirq_done);
        blk_queue_prep_rq(md->queue, dm_prep_fn);
@@@ -2250,7 -2220,6 +2239,7 @@@ struct mapped_device *dm_get_md(dev_t d
  
        return md;
  }
 +EXPORT_SYMBOL_GPL(dm_get_md);
  
  void *dm_get_mdptr(struct mapped_device *md)
  {
@@@ -2336,6 -2305,7 +2325,6 @@@ static int dm_wait_for_completion(struc
        while (1) {
                set_current_state(interruptible);
  
 -              smp_mb();
                if (!md_in_flight(md))
                        break;
  
diff --combined drivers/md/faulty.c
@@@ -81,16 -81,16 +81,16 @@@ static void faulty_fail(struct bio *bio
        bio_io_error(b);
  }
  
 -typedef struct faulty_conf {
 +struct faulty_conf {
        int period[Modes];
        atomic_t counters[Modes];
        sector_t faults[MaxFault];
        int     modes[MaxFault];
        int nfaults;
 -      mdk_rdev_t *rdev;
 -} conf_t;
 +      struct md_rdev *rdev;
 +};
  
 -static int check_mode(conf_t *conf, int mode)
 +static int check_mode(struct faulty_conf *conf, int mode)
  {
        if (conf->period[mode] == 0 &&
            atomic_read(&conf->counters[mode]) <= 0)
        return 0;
  }
  
 -static int check_sector(conf_t *conf, sector_t start, sector_t end, int dir)
 +static int check_sector(struct faulty_conf *conf, sector_t start, sector_t end, int dir)
  {
        /* If we find a ReadFixable sector, we fix it ... */
        int i;
        return 0;
  }
  
 -static void add_sector(conf_t *conf, sector_t start, int mode)
 +static void add_sector(struct faulty_conf *conf, sector_t start, int mode)
  {
        int i;
        int n = conf->nfaults;
                conf->nfaults = n+1;
  }
  
- static int make_request(struct mddev *mddev, struct bio *bio)
 -static void make_request(mddev_t *mddev, struct bio *bio)
++static void make_request(struct mddev *mddev, struct bio *bio)
  {
 -      conf_t *conf = mddev->private;
 +      struct faulty_conf *conf = mddev->private;
        int failit = 0;
  
        if (bio_data_dir(bio) == WRITE) {
                         * just fail immediately
                         */
                        bio_endio(bio, -EIO);
-                       return 0;
+                       return;
                }
  
                if (check_sector(conf, bio->bi_sector, bio->bi_sector+(bio->bi_size>>9),
        }
        if (failit) {
                struct bio *b = bio_clone_mddev(bio, GFP_NOIO, mddev);
                b->bi_bdev = conf->rdev->bdev;
                b->bi_private = bio;
                b->bi_end_io = faulty_fail;
-               generic_make_request(b);
-               return 0;
-       } else {
+               bio = b;
+       } else
                bio->bi_bdev = conf->rdev->bdev;
-               return 1;
-       }
+       generic_make_request(bio);
  }
  
 -static void status(struct seq_file *seq, mddev_t *mddev)
 +static void status(struct seq_file *seq, struct mddev *mddev)
  {
 -      conf_t *conf = mddev->private;
 +      struct faulty_conf *conf = mddev->private;
        int n;
  
        if ((n=atomic_read(&conf->counters[WriteTransient])) != 0)
  }
  
  
 -static int reshape(mddev_t *mddev)
 +static int reshape(struct mddev *mddev)
  {
        int mode = mddev->new_layout & ModeMask;
        int count = mddev->new_layout >> ModeShift;
 -      conf_t *conf = mddev->private;
 +      struct faulty_conf *conf = mddev->private;
  
        if (mddev->new_layout < 0)
                return 0;
        return 0;
  }
  
 -static sector_t faulty_size(mddev_t *mddev, sector_t sectors, int raid_disks)
 +static sector_t faulty_size(struct mddev *mddev, sector_t sectors, int raid_disks)
  {
        WARN_ONCE(raid_disks,
                  "%s does not support generic reshape\n", __func__);
        return sectors;
  }
  
 -static int run(mddev_t *mddev)
 +static int run(struct mddev *mddev)
  {
 -      mdk_rdev_t *rdev;
 +      struct md_rdev *rdev;
        int i;
 -      conf_t *conf;
 +      struct faulty_conf *conf;
  
        if (md_check_no_bitmap(mddev))
                return -EINVAL;
        return 0;
  }
  
 -static int stop(mddev_t *mddev)
 +static int stop(struct mddev *mddev)
  {
 -      conf_t *conf = mddev->private;
 +      struct faulty_conf *conf = mddev->private;
  
        kfree(conf);
        mddev->private = NULL;
        return 0;
  }
  
 -static struct mdk_personality faulty_personality =
 +static struct md_personality faulty_personality =
  {
        .name           = "faulty",
        .level          = LEVEL_FAULTY,
diff --combined drivers/md/linear.c
  /*
   * find which device holds a particular offset 
   */
 -static inline dev_info_t *which_dev(mddev_t *mddev, sector_t sector)
 +static inline struct dev_info *which_dev(struct mddev *mddev, sector_t sector)
  {
        int lo, mid, hi;
 -      linear_conf_t *conf;
 +      struct linear_conf *conf;
  
        lo = 0;
        hi = mddev->raid_disks - 1;
@@@ -63,8 -63,8 +63,8 @@@ static int linear_mergeable_bvec(struc
                                 struct bvec_merge_data *bvm,
                                 struct bio_vec *biovec)
  {
 -      mddev_t *mddev = q->queuedata;
 -      dev_info_t *dev0;
 +      struct mddev *mddev = q->queuedata;
 +      struct dev_info *dev0;
        unsigned long maxsectors, bio_sectors = bvm->bi_size >> 9;
        sector_t sector = bvm->bi_sector + get_start_sect(bvm->bi_bdev);
  
@@@ -89,8 -89,8 +89,8 @@@
  
  static int linear_congested(void *data, int bits)
  {
 -      mddev_t *mddev = data;
 -      linear_conf_t *conf;
 +      struct mddev *mddev = data;
 +      struct linear_conf *conf;
        int i, ret = 0;
  
        if (mddev_congested(mddev, bits))
        return ret;
  }
  
 -static sector_t linear_size(mddev_t *mddev, sector_t sectors, int raid_disks)
 +static sector_t linear_size(struct mddev *mddev, sector_t sectors, int raid_disks)
  {
 -      linear_conf_t *conf;
 +      struct linear_conf *conf;
        sector_t array_sectors;
  
        rcu_read_lock();
        return array_sectors;
  }
  
 -static linear_conf_t *linear_conf(mddev_t *mddev, int raid_disks)
 +static struct linear_conf *linear_conf(struct mddev *mddev, int raid_disks)
  {
 -      linear_conf_t *conf;
 -      mdk_rdev_t *rdev;
 +      struct linear_conf *conf;
 +      struct md_rdev *rdev;
        int i, cnt;
  
 -      conf = kzalloc (sizeof (*conf) + raid_disks*sizeof(dev_info_t),
 +      conf = kzalloc (sizeof (*conf) + raid_disks*sizeof(struct dev_info),
                        GFP_KERNEL);
        if (!conf)
                return NULL;
  
        list_for_each_entry(rdev, &mddev->disks, same_set) {
                int j = rdev->raid_disk;
 -              dev_info_t *disk = conf->disks + j;
 +              struct dev_info *disk = conf->disks + j;
                sector_t sectors;
  
                if (j < 0 || j >= raid_disks || disk->rdev) {
@@@ -194,9 -194,9 +194,9 @@@ out
        return NULL;
  }
  
 -static int linear_run (mddev_t *mddev)
 +static int linear_run (struct mddev *mddev)
  {
 -      linear_conf_t *conf;
 +      struct linear_conf *conf;
  
        if (md_check_no_bitmap(mddev))
                return -EINVAL;
        return md_integrity_register(mddev);
  }
  
 -static int linear_add(mddev_t *mddev, mdk_rdev_t *rdev)
 +static int linear_add(struct mddev *mddev, struct md_rdev *rdev)
  {
        /* Adding a drive to a linear array allows the array to grow.
         * It is permitted if the new drive has a matching superblock
         * The current one is never freed until the array is stopped.
         * This avoids races.
         */
 -      linear_conf_t *newconf, *oldconf;
 +      struct linear_conf *newconf, *oldconf;
  
        if (rdev->saved_raid_disk != mddev->raid_disks)
                return -EINVAL;
        return 0;
  }
  
 -static int linear_stop (mddev_t *mddev)
 +static int linear_stop (struct mddev *mddev)
  {
 -      linear_conf_t *conf = mddev->private;
 +      struct linear_conf *conf = mddev->private;
  
        /*
         * We do not require rcu protection here since
        return 0;
  }
  
- static int linear_make_request (struct mddev *mddev, struct bio *bio)
 -static void linear_make_request (mddev_t *mddev, struct bio *bio)
++static void linear_make_request(struct mddev *mddev, struct bio *bio)
  {
 -      dev_info_t *tmp_dev;
 +      struct dev_info *tmp_dev;
        sector_t start_sector;
  
        if (unlikely(bio->bi_rw & REQ_FLUSH)) {
                md_flush_request(mddev, bio);
-               return 0;
+               return;
        }
  
        rcu_read_lock();
                       (unsigned long long)start_sector);
                rcu_read_unlock();
                bio_io_error(bio);
-               return 0;
+               return;
        }
        if (unlikely(bio->bi_sector + (bio->bi_size >> 9) >
                     tmp_dev->end_sector)) {
  
                bp = bio_split(bio, end_sector - bio->bi_sector);
  
-               if (linear_make_request(mddev, &bp->bio1))
-                       generic_make_request(&bp->bio1);
-               if (linear_make_request(mddev, &bp->bio2))
-                       generic_make_request(&bp->bio2);
+               linear_make_request(mddev, &bp->bio1);
+               linear_make_request(mddev, &bp->bio2);
                bio_pair_release(bp);
-               return 0;
+               return;
        }
                    
        bio->bi_bdev = tmp_dev->rdev->bdev;
        bio->bi_sector = bio->bi_sector - start_sector
                + tmp_dev->rdev->data_offset;
        rcu_read_unlock();
-       return 1;
+       generic_make_request(bio);
  }
  
 -static void linear_status (struct seq_file *seq, mddev_t *mddev)
 +static void linear_status (struct seq_file *seq, struct mddev *mddev)
  {
  
        seq_printf(seq, " %dk rounding", mddev->chunk_sectors / 2);
  }
  
  
 -static struct mdk_personality linear_personality =
 +static struct md_personality linear_personality =
  {
        .name           = "linear",
        .level          = LEVEL_LINEAR,
diff --combined drivers/md/md.c
@@@ -54,6 -54,9 +54,6 @@@
  #include "md.h"
  #include "bitmap.h"
  
 -#define DEBUG 0
 -#define dprintk(x...) ((void)(DEBUG && printk(x)))
 -
  #ifndef MODULE
  static void autostart_arrays(int part);
  #endif
@@@ -95,13 -98,13 +95,13 @@@ static struct workqueue_struct *md_misc
  
  static int sysctl_speed_limit_min = 1000;
  static int sysctl_speed_limit_max = 200000;
 -static inline int speed_min(mddev_t *mddev)
 +static inline int speed_min(struct mddev *mddev)
  {
        return mddev->sync_speed_min ?
                mddev->sync_speed_min : sysctl_speed_limit_min;
  }
  
 -static inline int speed_max(mddev_t *mddev)
 +static inline int speed_max(struct mddev *mddev)
  {
        return mddev->sync_speed_max ?
                mddev->sync_speed_max : sysctl_speed_limit_max;
@@@ -157,7 -160,7 +157,7 @@@ static int start_readonly
  
  static void mddev_bio_destructor(struct bio *bio)
  {
 -      mddev_t *mddev, **mddevp;
 +      struct mddev *mddev, **mddevp;
  
        mddevp = (void*)bio;
        mddev = mddevp[-1];
  }
  
  struct bio *bio_alloc_mddev(gfp_t gfp_mask, int nr_iovecs,
 -                          mddev_t *mddev)
 +                          struct mddev *mddev)
  {
        struct bio *b;
 -      mddev_t **mddevp;
 +      struct mddev **mddevp;
  
        if (!mddev || !mddev->bio_set)
                return bio_alloc(gfp_mask, nr_iovecs);
  EXPORT_SYMBOL_GPL(bio_alloc_mddev);
  
  struct bio *bio_clone_mddev(struct bio *bio, gfp_t gfp_mask,
 -                          mddev_t *mddev)
 +                          struct mddev *mddev)
  {
        struct bio *b;
 -      mddev_t **mddevp;
 +      struct mddev **mddevp;
  
        if (!mddev || !mddev->bio_set)
                return bio_clone(bio, gfp_mask);
@@@ -278,7 -281,7 +278,7 @@@ EXPORT_SYMBOL_GPL(md_trim_bio)
   */
  static DECLARE_WAIT_QUEUE_HEAD(md_event_waiters);
  static atomic_t md_event_count;
 -void md_new_event(mddev_t *mddev)
 +void md_new_event(struct mddev *mddev)
  {
        atomic_inc(&md_event_count);
        wake_up(&md_event_waiters);
@@@ -288,7 -291,7 +288,7 @@@ EXPORT_SYMBOL_GPL(md_new_event)
  /* Alternate version that can be called from interrupts
   * when calling sysfs_notify isn't needed.
   */
 -static void md_new_event_inintr(mddev_t *mddev)
 +static void md_new_event_inintr(struct mddev *mddev)
  {
        atomic_inc(&md_event_count);
        wake_up(&md_event_waiters);
@@@ -309,19 -312,19 +309,19 @@@ static DEFINE_SPINLOCK(all_mddevs_lock)
   * Any code which breaks out of this loop while own
   * a reference to the current mddev and must mddev_put it.
   */
 -#define for_each_mddev(mddev,tmp)                                     \
 +#define for_each_mddev(_mddev,_tmp)                                   \
                                                                        \
        for (({ spin_lock(&all_mddevs_lock);                            \
 -              tmp = all_mddevs.next;                                  \
 -              mddev = NULL;});                                        \
 -           ({ if (tmp != &all_mddevs)                                 \
 -                      mddev_get(list_entry(tmp, mddev_t, all_mddevs));\
 +              _tmp = all_mddevs.next;                                 \
 +              _mddev = NULL;});                                       \
 +           ({ if (_tmp != &all_mddevs)                                \
 +                      mddev_get(list_entry(_tmp, struct mddev, all_mddevs));\
                spin_unlock(&all_mddevs_lock);                          \
 -              if (mddev) mddev_put(mddev);                            \
 -              mddev = list_entry(tmp, mddev_t, all_mddevs);           \
 -              tmp != &all_mddevs;});                                  \
 +              if (_mddev) mddev_put(_mddev);                          \
 +              _mddev = list_entry(_tmp, struct mddev, all_mddevs);    \
 +              _tmp != &all_mddevs;});                                 \
             ({ spin_lock(&all_mddevs_lock);                            \
 -              tmp = tmp->next;})                                      \
 +              _tmp = _tmp->next;})                                    \
                )
  
  
   * call has finished, the bio has been linked into some internal structure
   * and so is visible to ->quiesce(), so we don't need the refcount any more.
   */
- static int md_make_request(struct request_queue *q, struct bio *bio)
+ static void md_make_request(struct request_queue *q, struct bio *bio)
  {
        const int rw = bio_data_dir(bio);
 -      mddev_t *mddev = q->queuedata;
 +      struct mddev *mddev = q->queuedata;
-       int rv;
        int cpu;
        unsigned int sectors;
  
        if (mddev == NULL || mddev->pers == NULL
            || !mddev->ready) {
                bio_io_error(bio);
-               return 0;
+               return;
        }
        smp_rmb(); /* Ensure implications of  'active' are visible */
        rcu_read_lock();
         * go away inside make_request
         */
        sectors = bio_sectors(bio);
-       rv = mddev->pers->make_request(mddev, bio);
+       mddev->pers->make_request(mddev, bio);
  
        cpu = part_stat_lock();
        part_stat_inc(cpu, &mddev->gendisk->part0, ios[rw]);
  
        if (atomic_dec_and_test(&mddev->active_io) && mddev->suspended)
                wake_up(&mddev->sb_wait);
-       return rv;
  }
  
  /* mddev_suspend makes sure no new requests are submitted
   * Once ->stop is called and completes, the module will be completely
   * unused.
   */
 -void mddev_suspend(mddev_t *mddev)
 +void mddev_suspend(struct mddev *mddev)
  {
        BUG_ON(mddev->suspended);
        mddev->suspended = 1;
  }
  EXPORT_SYMBOL_GPL(mddev_suspend);
  
 -void mddev_resume(mddev_t *mddev)
 +void mddev_resume(struct mddev *mddev)
  {
        mddev->suspended = 0;
        wake_up(&mddev->sb_wait);
  }
  EXPORT_SYMBOL_GPL(mddev_resume);
  
 -int mddev_congested(mddev_t *mddev, int bits)
 +int mddev_congested(struct mddev *mddev, int bits)
  {
        return mddev->suspended;
  }
@@@ -420,8 -420,8 +417,8 @@@ EXPORT_SYMBOL(mddev_congested)
  
  static void md_end_flush(struct bio *bio, int err)
  {
 -      mdk_rdev_t *rdev = bio->bi_private;
 -      mddev_t *mddev = rdev->mddev;
 +      struct md_rdev *rdev = bio->bi_private;
 +      struct mddev *mddev = rdev->mddev;
  
        rdev_dec_pending(rdev, mddev);
  
@@@ -436,8 -436,8 +433,8 @@@ static void md_submit_flush_data(struc
  
  static void submit_flushes(struct work_struct *ws)
  {
 -      mddev_t *mddev = container_of(ws, mddev_t, flush_work);
 -      mdk_rdev_t *rdev;
 +      struct mddev *mddev = container_of(ws, struct mddev, flush_work);
 +      struct md_rdev *rdev;
  
        INIT_WORK(&mddev->flush_work, md_submit_flush_data);
        atomic_set(&mddev->flush_pending, 1);
  
  static void md_submit_flush_data(struct work_struct *ws)
  {
 -      mddev_t *mddev = container_of(ws, mddev_t, flush_work);
 +      struct mddev *mddev = container_of(ws, struct mddev, flush_work);
        struct bio *bio = mddev->flush_bio;
  
        if (bio->bi_size == 0)
                bio_endio(bio, 0);
        else {
                bio->bi_rw &= ~REQ_FLUSH;
-               if (mddev->pers->make_request(mddev, bio))
-                       generic_make_request(bio);
+               mddev->pers->make_request(mddev, bio);
        }
  
        mddev->flush_bio = NULL;
        wake_up(&mddev->sb_wait);
  }
  
 -void md_flush_request(mddev_t *mddev, struct bio *bio)
 +void md_flush_request(struct mddev *mddev, struct bio *bio)
  {
        spin_lock_irq(&mddev->write_lock);
        wait_event_lock_irq(mddev->sb_wait,
@@@ -509,7 -508,7 +505,7 @@@ EXPORT_SYMBOL(md_flush_request)
   */
  struct md_plug_cb {
        struct blk_plug_cb cb;
 -      mddev_t *mddev;
 +      struct mddev *mddev;
  };
  
  static void plugger_unplug(struct blk_plug_cb *cb)
  /* Check that an unplug wakeup will come shortly.
   * If not, wakeup the md thread immediately
   */
 -int mddev_check_plugged(mddev_t *mddev)
 +int mddev_check_plugged(struct mddev *mddev)
  {
        struct blk_plug *plug = current->plug;
        struct md_plug_cb *mdcb;
  }
  EXPORT_SYMBOL_GPL(mddev_check_plugged);
  
 -static inline mddev_t *mddev_get(mddev_t *mddev)
 +static inline struct mddev *mddev_get(struct mddev *mddev)
  {
        atomic_inc(&mddev->active);
        return mddev;
  
  static void mddev_delayed_delete(struct work_struct *ws);
  
 -static void mddev_put(mddev_t *mddev)
 +static void mddev_put(struct mddev *mddev)
  {
        struct bio_set *bs = NULL;
  
                bioset_free(bs);
  }
  
 -void mddev_init(mddev_t *mddev)
 +void mddev_init(struct mddev *mddev)
  {
        mutex_init(&mddev->open_mutex);
        mutex_init(&mddev->reconfig_mutex);
  }
  EXPORT_SYMBOL_GPL(mddev_init);
  
 -static mddev_t * mddev_find(dev_t unit)
 +static struct mddev * mddev_find(dev_t unit)
  {
 -      mddev_t *mddev, *new = NULL;
 +      struct mddev *mddev, *new = NULL;
  
        if (unit && MAJOR(unit) != MD_MAJOR)
                unit &= ~((1<<MdpMinorShift)-1);
        goto retry;
  }
  
 -static inline int mddev_lock(mddev_t * mddev)
 +static inline int mddev_lock(struct mddev * mddev)
  {
        return mutex_lock_interruptible(&mddev->reconfig_mutex);
  }
  
 -static inline int mddev_is_locked(mddev_t *mddev)
 +static inline int mddev_is_locked(struct mddev *mddev)
  {
        return mutex_is_locked(&mddev->reconfig_mutex);
  }
  
 -static inline int mddev_trylock(mddev_t * mddev)
 +static inline int mddev_trylock(struct mddev * mddev)
  {
        return mutex_trylock(&mddev->reconfig_mutex);
  }
  
  static struct attribute_group md_redundancy_group;
  
 -static void mddev_unlock(mddev_t * mddev)
 +static void mddev_unlock(struct mddev * mddev)
  {
        if (mddev->to_remove) {
                /* These cannot be removed under reconfig_mutex as
        } else
                mutex_unlock(&mddev->reconfig_mutex);
  
 -      /* was we've dropped the mutex we need a spinlock to
 -       * make sur the thread doesn't disappear
 +      /* As we've dropped the mutex we need a spinlock to
 +       * make sure the thread doesn't disappear
         */
        spin_lock(&pers_lock);
        md_wakeup_thread(mddev->thread);
        spin_unlock(&pers_lock);
  }
  
 -static mdk_rdev_t * find_rdev_nr(mddev_t *mddev, int nr)
 +static struct md_rdev * find_rdev_nr(struct mddev *mddev, int nr)
  {
 -      mdk_rdev_t *rdev;
 +      struct md_rdev *rdev;
  
        list_for_each_entry(rdev, &mddev->disks, same_set)
                if (rdev->desc_nr == nr)
        return NULL;
  }
  
 -static mdk_rdev_t * find_rdev(mddev_t * mddev, dev_t dev)
 +static struct md_rdev * find_rdev(struct mddev * mddev, dev_t dev)
  {
 -      mdk_rdev_t *rdev;
 +      struct md_rdev *rdev;
  
        list_for_each_entry(rdev, &mddev->disks, same_set)
                if (rdev->bdev->bd_dev == dev)
        return NULL;
  }
  
 -static struct mdk_personality *find_pers(int level, char *clevel)
 +static struct md_personality *find_pers(int level, char *clevel)
  {
 -      struct mdk_personality *pers;
 +      struct md_personality *pers;
        list_for_each_entry(pers, &pers_list, list) {
                if (level != LEVEL_NONE && pers->level == level)
                        return pers;
  }
  
  /* return the offset of the super block in 512byte sectors */
 -static inline sector_t calc_dev_sboffset(mdk_rdev_t *rdev)
 +static inline sector_t calc_dev_sboffset(struct md_rdev *rdev)
  {
        sector_t num_sectors = i_size_read(rdev->bdev->bd_inode) / 512;
        return MD_NEW_SIZE_SECTORS(num_sectors);
  }
  
 -static int alloc_disk_sb(mdk_rdev_t * rdev)
 +static int alloc_disk_sb(struct md_rdev * rdev)
  {
        if (rdev->sb_page)
                MD_BUG();
        return 0;
  }
  
 -static void free_disk_sb(mdk_rdev_t * rdev)
 +static void free_disk_sb(struct md_rdev * rdev)
  {
        if (rdev->sb_page) {
                put_page(rdev->sb_page);
  
  static void super_written(struct bio *bio, int error)
  {
 -      mdk_rdev_t *rdev = bio->bi_private;
 -      mddev_t *mddev = rdev->mddev;
 +      struct md_rdev *rdev = bio->bi_private;
 +      struct mddev *mddev = rdev->mddev;
  
        if (error || !test_bit(BIO_UPTODATE, &bio->bi_flags)) {
                printk("md: super_written gets error=%d, uptodate=%d\n",
        bio_put(bio);
  }
  
 -void md_super_write(mddev_t *mddev, mdk_rdev_t *rdev,
 +void md_super_write(struct mddev *mddev, struct md_rdev *rdev,
                   sector_t sector, int size, struct page *page)
  {
        /* write first size bytes of page to sector of rdev
        submit_bio(WRITE_FLUSH_FUA, bio);
  }
  
 -void md_super_wait(mddev_t *mddev)
 +void md_super_wait(struct mddev *mddev)
  {
        /* wait for all superblock writes that were scheduled to complete */
        DEFINE_WAIT(wq);
@@@ -876,7 -875,7 +872,7 @@@ static void bi_complete(struct bio *bio
        complete((struct completion*)bio->bi_private);
  }
  
 -int sync_page_io(mdk_rdev_t *rdev, sector_t sector, int size,
 +int sync_page_io(struct md_rdev *rdev, sector_t sector, int size,
                 struct page *page, int rw, bool metadata_op)
  {
        struct bio *bio = bio_alloc_mddev(GFP_NOIO, 1, rdev->mddev);
  }
  EXPORT_SYMBOL_GPL(sync_page_io);
  
 -static int read_disk_sb(mdk_rdev_t * rdev, int size)
 +static int read_disk_sb(struct md_rdev * rdev, int size)
  {
        char b[BDEVNAME_SIZE];
        if (!rdev->sb_page) {
@@@ -1011,7 -1010,7 +1007,7 @@@ static unsigned int calc_sb_csum(mdp_su
   * We rely on user-space to write the initial superblock, and support
   * reading and updating of superblocks.
   * Interface methods are:
 - *   int load_super(mdk_rdev_t *dev, mdk_rdev_t *refdev, int minor_version)
 + *   int load_super(struct md_rdev *dev, struct md_rdev *refdev, int minor_version)
   *      loads and validates a superblock on dev.
   *      if refdev != NULL, compare superblocks on both devices
   *    Return:
   *     -EINVAL superblock incompatible or invalid
   *     -othererror e.g. -EIO
   *
 - *   int validate_super(mddev_t *mddev, mdk_rdev_t *dev)
 + *   int validate_super(struct mddev *mddev, struct md_rdev *dev)
   *      Verify that dev is acceptable into mddev.
   *       The first time, mddev->raid_disks will be 0, and data from
   *       dev should be merged in.  Subsequent calls check that dev
   *       is new enough.  Return 0 or -EINVAL
   *
 - *   void sync_super(mddev_t *mddev, mdk_rdev_t *dev)
 + *   void sync_super(struct mddev *mddev, struct md_rdev *dev)
   *     Update the superblock for rdev with data in mddev
   *     This does not write to disc.
   *
  struct super_type  {
        char                *name;
        struct module       *owner;
 -      int                 (*load_super)(mdk_rdev_t *rdev, mdk_rdev_t *refdev,
 +      int                 (*load_super)(struct md_rdev *rdev, struct md_rdev *refdev,
                                          int minor_version);
 -      int                 (*validate_super)(mddev_t *mddev, mdk_rdev_t *rdev);
 -      void                (*sync_super)(mddev_t *mddev, mdk_rdev_t *rdev);
 -      unsigned long long  (*rdev_size_change)(mdk_rdev_t *rdev,
 +      int                 (*validate_super)(struct mddev *mddev, struct md_rdev *rdev);
 +      void                (*sync_super)(struct mddev *mddev, struct md_rdev *rdev);
 +      unsigned long long  (*rdev_size_change)(struct md_rdev *rdev,
                                                sector_t num_sectors);
  };
  
   * has a bitmap. Otherwise, it returns 0.
   *
   */
 -int md_check_no_bitmap(mddev_t *mddev)
 +int md_check_no_bitmap(struct mddev *mddev)
  {
        if (!mddev->bitmap_info.file && !mddev->bitmap_info.offset)
                return 0;
@@@ -1065,7 -1064,7 +1061,7 @@@ EXPORT_SYMBOL(md_check_no_bitmap)
  /*
   * load_super for 0.90.0 
   */
 -static int super_90_load(mdk_rdev_t *rdev, mdk_rdev_t *refdev, int minor_version)
 +static int super_90_load(struct md_rdev *rdev, struct md_rdev *refdev, int minor_version)
  {
        char b[BDEVNAME_SIZE], b2[BDEVNAME_SIZE];
        mdp_super_t *sb;
  /*
   * validate_super for 0.90.0
   */
 -static int super_90_validate(mddev_t *mddev, mdk_rdev_t *rdev)
 +static int super_90_validate(struct mddev *mddev, struct md_rdev *rdev)
  {
        mdp_disk_t *desc;
        mdp_super_t *sb = page_address(rdev->sb_page);
  /*
   * sync_super for 0.90.0
   */
 -static void super_90_sync(mddev_t *mddev, mdk_rdev_t *rdev)
 +static void super_90_sync(struct mddev *mddev, struct md_rdev *rdev)
  {
        mdp_super_t *sb;
 -      mdk_rdev_t *rdev2;
 +      struct md_rdev *rdev2;
        int next_spare = mddev->raid_disks;
  
  
   * rdev_size_change for 0.90.0
   */
  static unsigned long long
 -super_90_rdev_size_change(mdk_rdev_t *rdev, sector_t num_sectors)
 +super_90_rdev_size_change(struct md_rdev *rdev, sector_t num_sectors)
  {
        if (num_sectors && num_sectors < rdev->mddev->dev_sectors)
                return 0; /* component must fit device */
@@@ -1466,7 -1465,7 +1462,7 @@@ static __le32 calc_sb_1_csum(struct mdp
  
  static int md_set_badblocks(struct badblocks *bb, sector_t s, int sectors,
                            int acknowledged);
 -static int super_1_load(mdk_rdev_t *rdev, mdk_rdev_t *refdev, int minor_version)
 +static int super_1_load(struct md_rdev *rdev, struct md_rdev *refdev, int minor_version)
  {
        struct mdp_superblock_1 *sb;
        int ret;
        return ret;
  }
  
 -static int super_1_validate(mddev_t *mddev, mdk_rdev_t *rdev)
 +static int super_1_validate(struct mddev *mddev, struct md_rdev *rdev)
  {
        struct mdp_superblock_1 *sb = page_address(rdev->sb_page);
        __u64 ev1 = le64_to_cpu(sb->events);
        return 0;
  }
  
 -static void super_1_sync(mddev_t *mddev, mdk_rdev_t *rdev)
 +static void super_1_sync(struct mddev *mddev, struct md_rdev *rdev)
  {
        struct mdp_superblock_1 *sb;
 -      mdk_rdev_t *rdev2;
 +      struct md_rdev *rdev2;
        int max_dev, i;
        /* make rdev->sb match mddev and rdev data. */
  
@@@ -1848,7 -1847,7 +1844,7 @@@ retry
  }
  
  static unsigned long long
 -super_1_rdev_size_change(mdk_rdev_t *rdev, sector_t num_sectors)
 +super_1_rdev_size_change(struct md_rdev *rdev, sector_t num_sectors)
  {
        struct mdp_superblock_1 *sb;
        sector_t max_sectors;
@@@ -1902,7 -1901,7 +1898,7 @@@ static struct super_type super_types[] 
        },
  };
  
 -static void sync_super(mddev_t *mddev, mdk_rdev_t *rdev)
 +static void sync_super(struct mddev *mddev, struct md_rdev *rdev)
  {
        if (mddev->sync_super) {
                mddev->sync_super(mddev, rdev);
        super_types[mddev->major_version].sync_super(mddev, rdev);
  }
  
 -static int match_mddev_units(mddev_t *mddev1, mddev_t *mddev2)
 +static int match_mddev_units(struct mddev *mddev1, struct mddev *mddev2)
  {
 -      mdk_rdev_t *rdev, *rdev2;
 +      struct md_rdev *rdev, *rdev2;
  
        rcu_read_lock();
        rdev_for_each_rcu(rdev, mddev1)
@@@ -1939,9 -1938,9 +1935,9 @@@ static LIST_HEAD(pending_raid_disks)
   * from the array. It only succeeds if all working and active component devices
   * are integrity capable with matching profiles.
   */
 -int md_integrity_register(mddev_t *mddev)
 +int md_integrity_register(struct mddev *mddev)
  {
 -      mdk_rdev_t *rdev, *reference = NULL;
 +      struct md_rdev *rdev, *reference = NULL;
  
        if (list_empty(&mddev->disks))
                return 0; /* nothing to do */
  EXPORT_SYMBOL(md_integrity_register);
  
  /* Disable data integrity if non-capable/non-matching disk is being added */
 -void md_integrity_add_rdev(mdk_rdev_t *rdev, mddev_t *mddev)
 +void md_integrity_add_rdev(struct md_rdev *rdev, struct mddev *mddev)
  {
        struct blk_integrity *bi_rdev = bdev_get_integrity(rdev->bdev);
        struct blk_integrity *bi_mddev = blk_get_integrity(mddev->gendisk);
  }
  EXPORT_SYMBOL(md_integrity_add_rdev);
  
 -static int bind_rdev_to_array(mdk_rdev_t * rdev, mddev_t * mddev)
 +static int bind_rdev_to_array(struct md_rdev * rdev, struct mddev * mddev)
  {
        char b[BDEVNAME_SIZE];
        struct kobject *ko;
  
  static void md_delayed_delete(struct work_struct *ws)
  {
 -      mdk_rdev_t *rdev = container_of(ws, mdk_rdev_t, del_work);
 +      struct md_rdev *rdev = container_of(ws, struct md_rdev, del_work);
        kobject_del(&rdev->kobj);
        kobject_put(&rdev->kobj);
  }
  
 -static void unbind_rdev_from_array(mdk_rdev_t * rdev)
 +static void unbind_rdev_from_array(struct md_rdev * rdev)
  {
        char b[BDEVNAME_SIZE];
        if (!rdev->mddev) {
   * otherwise reused by a RAID array (or any other kernel
   * subsystem), by bd_claiming the device.
   */
 -static int lock_rdev(mdk_rdev_t *rdev, dev_t dev, int shared)
 +static int lock_rdev(struct md_rdev *rdev, dev_t dev, int shared)
  {
        int err = 0;
        struct block_device *bdev;
        char b[BDEVNAME_SIZE];
  
        bdev = blkdev_get_by_dev(dev, FMODE_READ|FMODE_WRITE|FMODE_EXCL,
 -                               shared ? (mdk_rdev_t *)lock_rdev : rdev);
 +                               shared ? (struct md_rdev *)lock_rdev : rdev);
        if (IS_ERR(bdev)) {
                printk(KERN_ERR "md: could not open %s.\n",
                        __bdevname(dev, b));
        return err;
  }
  
 -static void unlock_rdev(mdk_rdev_t *rdev)
 +static void unlock_rdev(struct md_rdev *rdev)
  {
        struct block_device *bdev = rdev->bdev;
        rdev->bdev = NULL;
  
  void md_autodetect_dev(dev_t dev);
  
 -static void export_rdev(mdk_rdev_t * rdev)
 +static void export_rdev(struct md_rdev * rdev)
  {
        char b[BDEVNAME_SIZE];
        printk(KERN_INFO "md: export_rdev(%s)\n",
        kobject_put(&rdev->kobj);
  }
  
 -static void kick_rdev_from_array(mdk_rdev_t * rdev)
 +static void kick_rdev_from_array(struct md_rdev * rdev)
  {
        unbind_rdev_from_array(rdev);
        export_rdev(rdev);
  }
  
 -static void export_array(mddev_t *mddev)
 +static void export_array(struct mddev *mddev)
  {
 -      mdk_rdev_t *rdev, *tmp;
 +      struct md_rdev *rdev, *tmp;
  
        rdev_for_each(rdev, tmp, mddev) {
                if (!rdev->mddev) {
@@@ -2268,7 -2267,7 +2264,7 @@@ static void print_sb_1(struct mdp_super
                );
  }
  
 -static void print_rdev(mdk_rdev_t *rdev, int major_version)
 +static void print_rdev(struct md_rdev *rdev, int major_version)
  {
        char b[BDEVNAME_SIZE];
        printk(KERN_INFO "md: rdev %s, Sect:%08llu F:%d S:%d DN:%u\n",
  static void md_print_devices(void)
  {
        struct list_head *tmp;
 -      mdk_rdev_t *rdev;
 -      mddev_t *mddev;
 +      struct md_rdev *rdev;
 +      struct mddev *mddev;
        char b[BDEVNAME_SIZE];
  
        printk("\n");
  }
  
  
 -static void sync_sbs(mddev_t * mddev, int nospares)
 +static void sync_sbs(struct mddev * mddev, int nospares)
  {
        /* Update each superblock (in-memory image), but
         * if we are allowed to, skip spares which already
         * (which would mean they aren't being marked as dirty
         * with the rest of the array)
         */
 -      mdk_rdev_t *rdev;
 +      struct md_rdev *rdev;
        list_for_each_entry(rdev, &mddev->disks, same_set) {
                if (rdev->sb_events == mddev->events ||
                    (nospares &&
        }
  }
  
 -static void md_update_sb(mddev_t * mddev, int force_change)
 +static void md_update_sb(struct mddev * mddev, int force_change)
  {
 -      mdk_rdev_t *rdev;
 +      struct md_rdev *rdev;
        int sync_req;
        int nospares = 0;
        int any_badblocks_changed = 0;
@@@ -2439,24 -2438,27 +2435,24 @@@ repeat
        sync_sbs(mddev, nospares);
        spin_unlock_irq(&mddev->write_lock);
  
 -      dprintk(KERN_INFO 
 -              "md: updating %s RAID superblock on device (in sync %d)\n",
 -              mdname(mddev),mddev->in_sync);
 +      pr_debug("md: updating %s RAID superblock on device (in sync %d)\n",
 +               mdname(mddev), mddev->in_sync);
  
        bitmap_update_sb(mddev->bitmap);
        list_for_each_entry(rdev, &mddev->disks, same_set) {
                char b[BDEVNAME_SIZE];
 -              dprintk(KERN_INFO "md: ");
 +
                if (rdev->sb_loaded != 1)
                        continue; /* no noise on spare devices */
 -              if (test_bit(Faulty, &rdev->flags))
 -                      dprintk("(skipping faulty ");
  
 -              dprintk("%s ", bdevname(rdev->bdev,b));
 -              if (!test_bit(Faulty, &rdev->flags)) {
 +              if (!test_bit(Faulty, &rdev->flags) &&
 +                  rdev->saved_raid_disk == -1) {
                        md_super_write(mddev,rdev,
                                       rdev->sb_start, rdev->sb_size,
                                       rdev->sb_page);
 -                      dprintk(KERN_INFO "(write) %s's sb offset: %llu\n",
 -                              bdevname(rdev->bdev,b),
 -                              (unsigned long long)rdev->sb_start);
 +                      pr_debug("md: (write) %s's sb offset: %llu\n",
 +                               bdevname(rdev->bdev, b),
 +                               (unsigned long long)rdev->sb_start);
                        rdev->sb_events = mddev->events;
                        if (rdev->badblocks.size) {
                                md_super_write(mddev, rdev,
                                rdev->badblocks.size = 0;
                        }
  
 -              } else
 -                      dprintk(")\n");
 +              } else if (test_bit(Faulty, &rdev->flags))
 +                      pr_debug("md: %s (skipping faulty)\n",
 +                               bdevname(rdev->bdev, b));
 +              else
 +                      pr_debug("(skipping incremental s/r ");
 +
                if (mddev->level == LEVEL_MULTIPATH)
                        /* only need to write one superblock... */
                        break;
@@@ -2525,12 -2523,12 +2521,12 @@@ static int cmd_match(const char *cmd, c
  
  struct rdev_sysfs_entry {
        struct attribute attr;
 -      ssize_t (*show)(mdk_rdev_t *, char *);
 -      ssize_t (*store)(mdk_rdev_t *, const char *, size_t);
 +      ssize_t (*show)(struct md_rdev *, char *);
 +      ssize_t (*store)(struct md_rdev *, const char *, size_t);
  };
  
  static ssize_t
 -state_show(mdk_rdev_t *rdev, char *page)
 +state_show(struct md_rdev *rdev, char *page)
  {
        char *sep = "";
        size_t len = 0;
  }
  
  static ssize_t
 -state_store(mdk_rdev_t *rdev, const char *buf, size_t len)
 +state_store(struct md_rdev *rdev, const char *buf, size_t len)
  {
        /* can write
         *  faulty  - simulates an error
                if (rdev->raid_disk >= 0)
                        err = -EBUSY;
                else {
 -                      mddev_t *mddev = rdev->mddev;
 +                      struct mddev *mddev = rdev->mddev;
                        kick_rdev_from_array(rdev);
                        if (mddev->pers)
                                md_update_sb(mddev, 1);
@@@ -2639,13 -2637,13 +2635,13 @@@ static struct rdev_sysfs_entry rdev_sta
  __ATTR(state, S_IRUGO|S_IWUSR, state_show, state_store);
  
  static ssize_t
 -errors_show(mdk_rdev_t *rdev, char *page)
 +errors_show(struct md_rdev *rdev, char *page)
  {
        return sprintf(page, "%d\n", atomic_read(&rdev->corrected_errors));
  }
  
  static ssize_t
 -errors_store(mdk_rdev_t *rdev, const char *buf, size_t len)
 +errors_store(struct md_rdev *rdev, const char *buf, size_t len)
  {
        char *e;
        unsigned long n = simple_strtoul(buf, &e, 10);
@@@ -2659,7 -2657,7 +2655,7 @@@ static struct rdev_sysfs_entry rdev_err
  __ATTR(errors, S_IRUGO|S_IWUSR, errors_show, errors_store);
  
  static ssize_t
 -slot_show(mdk_rdev_t *rdev, char *page)
 +slot_show(struct md_rdev *rdev, char *page)
  {
        if (rdev->raid_disk < 0)
                return sprintf(page, "none\n");
  }
  
  static ssize_t
 -slot_store(mdk_rdev_t *rdev, const char *buf, size_t len)
 +slot_store(struct md_rdev *rdev, const char *buf, size_t len)
  {
        char *e;
        int err;
                set_bit(MD_RECOVERY_NEEDED, &rdev->mddev->recovery);
                md_wakeup_thread(rdev->mddev->thread);
        } else if (rdev->mddev->pers) {
 -              mdk_rdev_t *rdev2;
 +              struct md_rdev *rdev2;
                /* Activating a spare .. or possibly reactivating
                 * if we ever get bitmaps working here.
                 */
                        rdev->saved_raid_disk = slot;
                else
                        rdev->saved_raid_disk = -1;
 +              clear_bit(In_sync, &rdev->flags);
                err = rdev->mddev->pers->
                        hot_add_disk(rdev->mddev, rdev);
                if (err) {
@@@ -2756,13 -2753,13 +2752,13 @@@ static struct rdev_sysfs_entry rdev_slo
  __ATTR(slot, S_IRUGO|S_IWUSR, slot_show, slot_store);
  
  static ssize_t
 -offset_show(mdk_rdev_t *rdev, char *page)
 +offset_show(struct md_rdev *rdev, char *page)
  {
        return sprintf(page, "%llu\n", (unsigned long long)rdev->data_offset);
  }
  
  static ssize_t
 -offset_store(mdk_rdev_t *rdev, const char *buf, size_t len)
 +offset_store(struct md_rdev *rdev, const char *buf, size_t len)
  {
        char *e;
        unsigned long long offset = simple_strtoull(buf, &e, 10);
@@@ -2782,7 -2779,7 +2778,7 @@@ static struct rdev_sysfs_entry rdev_off
  __ATTR(offset, S_IRUGO|S_IWUSR, offset_show, offset_store);
  
  static ssize_t
 -rdev_size_show(mdk_rdev_t *rdev, char *page)
 +rdev_size_show(struct md_rdev *rdev, char *page)
  {
        return sprintf(page, "%llu\n", (unsigned long long)rdev->sectors / 2);
  }
@@@ -2817,9 -2814,9 +2813,9 @@@ static int strict_blocks_to_sectors(con
  }
  
  static ssize_t
 -rdev_size_store(mdk_rdev_t *rdev, const char *buf, size_t len)
 +rdev_size_store(struct md_rdev *rdev, const char *buf, size_t len)
  {
 -      mddev_t *my_mddev = rdev->mddev;
 +      struct mddev *my_mddev = rdev->mddev;
        sector_t oldsectors = rdev->sectors;
        sector_t sectors;
  
                 * a deadlock.  We have already changed rdev->sectors, and if
                 * we have to change it back, we will have the lock again.
                 */
 -              mddev_t *mddev;
 +              struct mddev *mddev;
                int overlap = 0;
                struct list_head *tmp;
  
                mddev_unlock(my_mddev);
                for_each_mddev(mddev, tmp) {
 -                      mdk_rdev_t *rdev2;
 +                      struct md_rdev *rdev2;
  
                        mddev_lock(mddev);
                        list_for_each_entry(rdev2, &mddev->disks, same_set)
@@@ -2888,7 -2885,7 +2884,7 @@@ static struct rdev_sysfs_entry rdev_siz
  __ATTR(size, S_IRUGO|S_IWUSR, rdev_size_show, rdev_size_store);
  
  
 -static ssize_t recovery_start_show(mdk_rdev_t *rdev, char *page)
 +static ssize_t recovery_start_show(struct md_rdev *rdev, char *page)
  {
        unsigned long long recovery_start = rdev->recovery_offset;
  
        return sprintf(page, "%llu\n", recovery_start);
  }
  
 -static ssize_t recovery_start_store(mdk_rdev_t *rdev, const char *buf, size_t len)
 +static ssize_t recovery_start_store(struct md_rdev *rdev, const char *buf, size_t len)
  {
        unsigned long long recovery_start;
  
@@@ -2929,11 -2926,11 +2925,11 @@@ badblocks_show(struct badblocks *bb, ch
  static ssize_t
  badblocks_store(struct badblocks *bb, const char *page, size_t len, int unack);
  
 -static ssize_t bb_show(mdk_rdev_t *rdev, char *page)
 +static ssize_t bb_show(struct md_rdev *rdev, char *page)
  {
        return badblocks_show(&rdev->badblocks, page, 0);
  }
 -static ssize_t bb_store(mdk_rdev_t *rdev, const char *page, size_t len)
 +static ssize_t bb_store(struct md_rdev *rdev, const char *page, size_t len)
  {
        int rv = badblocks_store(&rdev->badblocks, page, len, 0);
        /* Maybe that ack was all we needed */
@@@ -2945,11 -2942,11 +2941,11 @@@ static struct rdev_sysfs_entry rdev_bad
  __ATTR(bad_blocks, S_IRUGO|S_IWUSR, bb_show, bb_store);
  
  
 -static ssize_t ubb_show(mdk_rdev_t *rdev, char *page)
 +static ssize_t ubb_show(struct md_rdev *rdev, char *page)
  {
        return badblocks_show(&rdev->badblocks, page, 1);
  }
 -static ssize_t ubb_store(mdk_rdev_t *rdev, const char *page, size_t len)
 +static ssize_t ubb_store(struct md_rdev *rdev, const char *page, size_t len)
  {
        return badblocks_store(&rdev->badblocks, page, len, 1);
  }
@@@ -2971,8 -2968,8 +2967,8 @@@ static ssize_
  rdev_attr_show(struct kobject *kobj, struct attribute *attr, char *page)
  {
        struct rdev_sysfs_entry *entry = container_of(attr, struct rdev_sysfs_entry, attr);
 -      mdk_rdev_t *rdev = container_of(kobj, mdk_rdev_t, kobj);
 -      mddev_t *mddev = rdev->mddev;
 +      struct md_rdev *rdev = container_of(kobj, struct md_rdev, kobj);
 +      struct mddev *mddev = rdev->mddev;
        ssize_t rv;
  
        if (!entry->show)
@@@ -2994,9 -2991,9 +2990,9 @@@ rdev_attr_store(struct kobject *kobj, s
              const char *page, size_t length)
  {
        struct rdev_sysfs_entry *entry = container_of(attr, struct rdev_sysfs_entry, attr);
 -      mdk_rdev_t *rdev = container_of(kobj, mdk_rdev_t, kobj);
 +      struct md_rdev *rdev = container_of(kobj, struct md_rdev, kobj);
        ssize_t rv;
 -      mddev_t *mddev = rdev->mddev;
 +      struct mddev *mddev = rdev->mddev;
  
        if (!entry->store)
                return -EIO;
  
  static void rdev_free(struct kobject *ko)
  {
 -      mdk_rdev_t *rdev = container_of(ko, mdk_rdev_t, kobj);
 +      struct md_rdev *rdev = container_of(ko, struct md_rdev, kobj);
        kfree(rdev);
  }
  static const struct sysfs_ops rdev_sysfs_ops = {
@@@ -3028,7 -3025,7 +3024,7 @@@ static struct kobj_type rdev_ktype = 
        .default_attrs  = rdev_default_attrs,
  };
  
 -int md_rdev_init(mdk_rdev_t *rdev)
 +int md_rdev_init(struct md_rdev *rdev)
  {
        rdev->desc_nr = -1;
        rdev->saved_raid_disk = -1;
@@@ -3071,11 -3068,11 +3067,11 @@@ EXPORT_SYMBOL_GPL(md_rdev_init)
   *
   * a faulty rdev _never_ has rdev->sb set.
   */
 -static mdk_rdev_t *md_import_device(dev_t newdev, int super_format, int super_minor)
 +static struct md_rdev *md_import_device(dev_t newdev, int super_format, int super_minor)
  {
        char b[BDEVNAME_SIZE];
        int err;
 -      mdk_rdev_t *rdev;
 +      struct md_rdev *rdev;
        sector_t size;
  
        rdev = kzalloc(sizeof(*rdev), GFP_KERNEL);
@@@ -3144,10 -3141,10 +3140,10 @@@ abort_free
   */
  
  
 -static void analyze_sbs(mddev_t * mddev)
 +static void analyze_sbs(struct mddev * mddev)
  {
        int i;
 -      mdk_rdev_t *rdev, *freshest, *tmp;
 +      struct md_rdev *rdev, *freshest, *tmp;
        char b[BDEVNAME_SIZE];
  
        freshest = NULL;
@@@ -3247,13 -3244,13 +3243,13 @@@ int strict_strtoul_scaled(const char *c
  static void md_safemode_timeout(unsigned long data);
  
  static ssize_t
 -safe_delay_show(mddev_t *mddev, char *page)
 +safe_delay_show(struct mddev *mddev, char *page)
  {
        int msec = (mddev->safemode_delay*1000)/HZ;
        return sprintf(page, "%d.%03d\n", msec/1000, msec%1000);
  }
  static ssize_t
 -safe_delay_store(mddev_t *mddev, const char *cbuf, size_t len)
 +safe_delay_store(struct mddev *mddev, const char *cbuf, size_t len)
  {
        unsigned long msec;
  
@@@ -3275,9 -3272,9 +3271,9 @@@ static struct md_sysfs_entry md_safe_de
  __ATTR(safe_mode_delay, S_IRUGO|S_IWUSR,safe_delay_show, safe_delay_store);
  
  static ssize_t
 -level_show(mddev_t *mddev, char *page)
 +level_show(struct mddev *mddev, char *page)
  {
 -      struct mdk_personality *p = mddev->pers;
 +      struct md_personality *p = mddev->pers;
        if (p)
                return sprintf(page, "%s\n", p->name);
        else if (mddev->clevel[0])
  }
  
  static ssize_t
 -level_store(mddev_t *mddev, const char *buf, size_t len)
 +level_store(struct mddev *mddev, const char *buf, size_t len)
  {
        char clevel[16];
        ssize_t rv = len;
 -      struct mdk_personality *pers;
 +      struct md_personality *pers;
        long level;
        void *priv;
 -      mdk_rdev_t *rdev;
 +      struct md_rdev *rdev;
  
        if (mddev->pers == NULL) {
                if (len == 0)
@@@ -3470,7 -3467,7 +3466,7 @@@ __ATTR(level, S_IRUGO|S_IWUSR, level_sh
  
  
  static ssize_t
 -layout_show(mddev_t *mddev, char *page)
 +layout_show(struct mddev *mddev, char *page)
  {
        /* just a number, not meaningful for all levels */
        if (mddev->reshape_position != MaxSector &&
  }
  
  static ssize_t
 -layout_store(mddev_t *mddev, const char *buf, size_t len)
 +layout_store(struct mddev *mddev, const char *buf, size_t len)
  {
        char *e;
        unsigned long n = simple_strtoul(buf, &e, 10);
@@@ -3511,7 -3508,7 +3507,7 @@@ __ATTR(layout, S_IRUGO|S_IWUSR, layout_
  
  
  static ssize_t
 -raid_disks_show(mddev_t *mddev, char *page)
 +raid_disks_show(struct mddev *mddev, char *page)
  {
        if (mddev->raid_disks == 0)
                return 0;
        return sprintf(page, "%d\n", mddev->raid_disks);
  }
  
 -static int update_raid_disks(mddev_t *mddev, int raid_disks);
 +static int update_raid_disks(struct mddev *mddev, int raid_disks);
  
  static ssize_t
 -raid_disks_store(mddev_t *mddev, const char *buf, size_t len)
 +raid_disks_store(struct mddev *mddev, const char *buf, size_t len)
  {
        char *e;
        int rv = 0;
@@@ -3548,7 -3545,7 +3544,7 @@@ static struct md_sysfs_entry md_raid_di
  __ATTR(raid_disks, S_IRUGO|S_IWUSR, raid_disks_show, raid_disks_store);
  
  static ssize_t
 -chunk_size_show(mddev_t *mddev, char *page)
 +chunk_size_show(struct mddev *mddev, char *page)
  {
        if (mddev->reshape_position != MaxSector &&
            mddev->chunk_sectors != mddev->new_chunk_sectors)
  }
  
  static ssize_t
 -chunk_size_store(mddev_t *mddev, const char *buf, size_t len)
 +chunk_size_store(struct mddev *mddev, const char *buf, size_t len)
  {
        char *e;
        unsigned long n = simple_strtoul(buf, &e, 10);
@@@ -3588,7 -3585,7 +3584,7 @@@ static struct md_sysfs_entry md_chunk_s
  __ATTR(chunk_size, S_IRUGO|S_IWUSR, chunk_size_show, chunk_size_store);
  
  static ssize_t
 -resync_start_show(mddev_t *mddev, char *page)
 +resync_start_show(struct mddev *mddev, char *page)
  {
        if (mddev->recovery_cp == MaxSector)
                return sprintf(page, "none\n");
  }
  
  static ssize_t
 -resync_start_store(mddev_t *mddev, const char *buf, size_t len)
 +resync_start_store(struct mddev *mddev, const char *buf, size_t len)
  {
        char *e;
        unsigned long long n = simple_strtoull(buf, &e, 10);
@@@ -3666,7 -3663,7 +3662,7 @@@ static int match_word(const char *word
  }
  
  static ssize_t
 -array_state_show(mddev_t *mddev, char *page)
 +array_state_show(struct mddev *mddev, char *page)
  {
        enum array_state st = inactive;
  
        return sprintf(page, "%s\n", array_states[st]);
  }
  
 -static int do_md_stop(mddev_t * mddev, int ro, int is_open);
 -static int md_set_readonly(mddev_t * mddev, int is_open);
 -static int do_md_run(mddev_t * mddev);
 -static int restart_array(mddev_t *mddev);
 +static int do_md_stop(struct mddev * mddev, int ro, int is_open);
 +static int md_set_readonly(struct mddev * mddev, int is_open);
 +static int do_md_run(struct mddev * mddev);
 +static int restart_array(struct mddev *mddev);
  
  static ssize_t
 -array_state_store(mddev_t *mddev, const char *buf, size_t len)
 +array_state_store(struct mddev *mddev, const char *buf, size_t len)
  {
        int err = -EINVAL;
        enum array_state st = match_word(buf, array_states);
@@@ -3799,13 -3796,13 +3795,13 @@@ static struct md_sysfs_entry md_array_s
  __ATTR(array_state, S_IRUGO|S_IWUSR, array_state_show, array_state_store);
  
  static ssize_t
 -max_corrected_read_errors_show(mddev_t *mddev, char *page) {
 +max_corrected_read_errors_show(struct mddev *mddev, char *page) {
        return sprintf(page, "%d\n",
                       atomic_read(&mddev->max_corr_read_errors));
  }
  
  static ssize_t
 -max_corrected_read_errors_store(mddev_t *mddev, const char *buf, size_t len)
 +max_corrected_read_errors_store(struct mddev *mddev, const char *buf, size_t len)
  {
        char *e;
        unsigned long n = simple_strtoul(buf, &e, 10);
@@@ -3822,13 -3819,13 +3818,13 @@@ __ATTR(max_read_errors, S_IRUGO|S_IWUSR
        max_corrected_read_errors_store);
  
  static ssize_t
 -null_show(mddev_t *mddev, char *page)
 +null_show(struct mddev *mddev, char *page)
  {
        return -EINVAL;
  }
  
  static ssize_t
 -new_dev_store(mddev_t *mddev, const char *buf, size_t len)
 +new_dev_store(struct mddev *mddev, const char *buf, size_t len)
  {
        /* buf must be %d:%d\n? giving major and minor numbers */
        /* The new device is added to the array.
        int major = simple_strtoul(buf, &e, 10);
        int minor;
        dev_t dev;
 -      mdk_rdev_t *rdev;
 +      struct md_rdev *rdev;
        int err;
  
        if (!*buf || *e != ':' || !e[1] || e[1] == '\n')
                rdev = md_import_device(dev, mddev->major_version,
                                        mddev->minor_version);
                if (!IS_ERR(rdev) && !list_empty(&mddev->disks)) {
 -                      mdk_rdev_t *rdev0 = list_entry(mddev->disks.next,
 -                                                     mdk_rdev_t, same_set);
 +                      struct md_rdev *rdev0
 +                              = list_entry(mddev->disks.next,
 +                                           struct md_rdev, same_set);
                        err = super_types[mddev->major_version]
                                .load_super(rdev, rdev0, mddev->minor_version);
                        if (err < 0)
@@@ -3885,7 -3881,7 +3881,7 @@@ static struct md_sysfs_entry md_new_dev
  __ATTR(new_dev, S_IWUSR, null_show, new_dev_store);
  
  static ssize_t
 -bitmap_store(mddev_t *mddev, const char *buf, size_t len)
 +bitmap_store(struct mddev *mddev, const char *buf, size_t len)
  {
        char *end;
        unsigned long chunk, end_chunk;
@@@ -3914,16 -3910,16 +3910,16 @@@ static struct md_sysfs_entry md_bitmap 
  __ATTR(bitmap_set_bits, S_IWUSR, null_show, bitmap_store);
  
  static ssize_t
 -size_show(mddev_t *mddev, char *page)
 +size_show(struct mddev *mddev, char *page)
  {
        return sprintf(page, "%llu\n",
                (unsigned long long)mddev->dev_sectors / 2);
  }
  
 -static int update_size(mddev_t *mddev, sector_t num_sectors);
 +static int update_size(struct mddev *mddev, sector_t num_sectors);
  
  static ssize_t
 -size_store(mddev_t *mddev, const char *buf, size_t len)
 +size_store(struct mddev *mddev, const char *buf, size_t len)
  {
        /* If array is inactive, we can reduce the component size, but
         * not increase it (except from 0).
@@@ -3958,7 -3954,7 +3954,7 @@@ __ATTR(component_size, S_IRUGO|S_IWUSR
   * or N.M for internally known formats
   */
  static ssize_t
 -metadata_show(mddev_t *mddev, char *page)
 +metadata_show(struct mddev *mddev, char *page)
  {
        if (mddev->persistent)
                return sprintf(page, "%d.%d\n",
  }
  
  static ssize_t
 -metadata_store(mddev_t *mddev, const char *buf, size_t len)
 +metadata_store(struct mddev *mddev, const char *buf, size_t len)
  {
        int major, minor;
        char *e;
@@@ -4024,7 -4020,7 +4020,7 @@@ static struct md_sysfs_entry md_metadat
  __ATTR(metadata_version, S_IRUGO|S_IWUSR, metadata_show, metadata_store);
  
  static ssize_t
 -action_show(mddev_t *mddev, char *page)
 +action_show(struct mddev *mddev, char *page)
  {
        char *type = "idle";
        if (test_bit(MD_RECOVERY_FROZEN, &mddev->recovery))
        return sprintf(page, "%s\n", type);
  }
  
 -static void reap_sync_thread(mddev_t *mddev);
 +static void reap_sync_thread(struct mddev *mddev);
  
  static ssize_t
 -action_store(mddev_t *mddev, const char *page, size_t len)
 +action_store(struct mddev *mddev, const char *page, size_t len)
  {
        if (!mddev->pers || !mddev->pers->sync_request)
                return -EINVAL;
  }
  
  static ssize_t
 -mismatch_cnt_show(mddev_t *mddev, char *page)
 +mismatch_cnt_show(struct mddev *mddev, char *page)
  {
        return sprintf(page, "%llu\n",
                       (unsigned long long) mddev->resync_mismatches);
@@@ -4108,14 -4104,14 +4104,14 @@@ __ATTR(sync_action, S_IRUGO|S_IWUSR, ac
  static struct md_sysfs_entry md_mismatches = __ATTR_RO(mismatch_cnt);
  
  static ssize_t
 -sync_min_show(mddev_t *mddev, char *page)
 +sync_min_show(struct mddev *mddev, char *page)
  {
        return sprintf(page, "%d (%s)\n", speed_min(mddev),
                       mddev->sync_speed_min ? "local": "system");
  }
  
  static ssize_t
 -sync_min_store(mddev_t *mddev, const char *buf, size_t len)
 +sync_min_store(struct mddev *mddev, const char *buf, size_t len)
  {
        int min;
        char *e;
@@@ -4134,14 -4130,14 +4130,14 @@@ static struct md_sysfs_entry md_sync_mi
  __ATTR(sync_speed_min, S_IRUGO|S_IWUSR, sync_min_show, sync_min_store);
  
  static ssize_t
 -sync_max_show(mddev_t *mddev, char *page)
 +sync_max_show(struct mddev *mddev, char *page)
  {
        return sprintf(page, "%d (%s)\n", speed_max(mddev),
                       mddev->sync_speed_max ? "local": "system");
  }
  
  static ssize_t
 -sync_max_store(mddev_t *mddev, const char *buf, size_t len)
 +sync_max_store(struct mddev *mddev, const char *buf, size_t len)
  {
        int max;
        char *e;
@@@ -4160,20 -4156,20 +4156,20 @@@ static struct md_sysfs_entry md_sync_ma
  __ATTR(sync_speed_max, S_IRUGO|S_IWUSR, sync_max_show, sync_max_store);
  
  static ssize_t
 -degraded_show(mddev_t *mddev, char *page)
 +degraded_show(struct mddev *mddev, char *page)
  {
        return sprintf(page, "%d\n", mddev->degraded);
  }
  static struct md_sysfs_entry md_degraded = __ATTR_RO(degraded);
  
  static ssize_t
 -sync_force_parallel_show(mddev_t *mddev, char *page)
 +sync_force_parallel_show(struct mddev *mddev, char *page)
  {
        return sprintf(page, "%d\n", mddev->parallel_resync);
  }
  
  static ssize_t
 -sync_force_parallel_store(mddev_t *mddev, const char *buf, size_t len)
 +sync_force_parallel_store(struct mddev *mddev, const char *buf, size_t len)
  {
        long n;
  
@@@ -4197,7 -4193,7 +4193,7 @@@ __ATTR(sync_force_parallel, S_IRUGO|S_I
         sync_force_parallel_show, sync_force_parallel_store);
  
  static ssize_t
 -sync_speed_show(mddev_t *mddev, char *page)
 +sync_speed_show(struct mddev *mddev, char *page)
  {
        unsigned long resync, dt, db;
        if (mddev->curr_resync == 0)
  static struct md_sysfs_entry md_sync_speed = __ATTR_RO(sync_speed);
  
  static ssize_t
 -sync_completed_show(mddev_t *mddev, char *page)
 +sync_completed_show(struct mddev *mddev, char *page)
  {
        unsigned long long max_sectors, resync;
  
  static struct md_sysfs_entry md_sync_completed = __ATTR_RO(sync_completed);
  
  static ssize_t
 -min_sync_show(mddev_t *mddev, char *page)
 +min_sync_show(struct mddev *mddev, char *page)
  {
        return sprintf(page, "%llu\n",
                       (unsigned long long)mddev->resync_min);
  }
  static ssize_t
 -min_sync_store(mddev_t *mddev, const char *buf, size_t len)
 +min_sync_store(struct mddev *mddev, const char *buf, size_t len)
  {
        unsigned long long min;
        if (strict_strtoull(buf, 10, &min))
@@@ -4262,7 -4258,7 +4258,7 @@@ static struct md_sysfs_entry md_min_syn
  __ATTR(sync_min, S_IRUGO|S_IWUSR, min_sync_show, min_sync_store);
  
  static ssize_t
 -max_sync_show(mddev_t *mddev, char *page)
 +max_sync_show(struct mddev *mddev, char *page)
  {
        if (mddev->resync_max == MaxSector)
                return sprintf(page, "max\n");
                               (unsigned long long)mddev->resync_max);
  }
  static ssize_t
 -max_sync_store(mddev_t *mddev, const char *buf, size_t len)
 +max_sync_store(struct mddev *mddev, const char *buf, size_t len)
  {
        if (strncmp(buf, "max", 3) == 0)
                mddev->resync_max = MaxSector;
@@@ -4302,13 -4298,13 +4298,13 @@@ static struct md_sysfs_entry md_max_syn
  __ATTR(sync_max, S_IRUGO|S_IWUSR, max_sync_show, max_sync_store);
  
  static ssize_t
 -suspend_lo_show(mddev_t *mddev, char *page)
 +suspend_lo_show(struct mddev *mddev, char *page)
  {
        return sprintf(page, "%llu\n", (unsigned long long)mddev->suspend_lo);
  }
  
  static ssize_t
 -suspend_lo_store(mddev_t *mddev, const char *buf, size_t len)
 +suspend_lo_store(struct mddev *mddev, const char *buf, size_t len)
  {
        char *e;
        unsigned long long new = simple_strtoull(buf, &e, 10);
@@@ -4336,13 -4332,13 +4332,13 @@@ __ATTR(suspend_lo, S_IRUGO|S_IWUSR, sus
  
  
  static ssize_t
 -suspend_hi_show(mddev_t *mddev, char *page)
 +suspend_hi_show(struct mddev *mddev, char *page)
  {
        return sprintf(page, "%llu\n", (unsigned long long)mddev->suspend_hi);
  }
  
  static ssize_t
 -suspend_hi_store(mddev_t *mddev, const char *buf, size_t len)
 +suspend_hi_store(struct mddev *mddev, const char *buf, size_t len)
  {
        char *e;
        unsigned long long new = simple_strtoull(buf, &e, 10);
@@@ -4369,7 -4365,7 +4365,7 @@@ static struct md_sysfs_entry md_suspend
  __ATTR(suspend_hi, S_IRUGO|S_IWUSR, suspend_hi_show, suspend_hi_store);
  
  static ssize_t
 -reshape_position_show(mddev_t *mddev, char *page)
 +reshape_position_show(struct mddev *mddev, char *page)
  {
        if (mddev->reshape_position != MaxSector)
                return sprintf(page, "%llu\n",
  }
  
  static ssize_t
 -reshape_position_store(mddev_t *mddev, const char *buf, size_t len)
 +reshape_position_store(struct mddev *mddev, const char *buf, size_t len)
  {
        char *e;
        unsigned long long new = simple_strtoull(buf, &e, 10);
@@@ -4400,7 -4396,7 +4396,7 @@@ __ATTR(reshape_position, S_IRUGO|S_IWUS
         reshape_position_store);
  
  static ssize_t
 -array_size_show(mddev_t *mddev, char *page)
 +array_size_show(struct mddev *mddev, char *page)
  {
        if (mddev->external_size)
                return sprintf(page, "%llu\n",
  }
  
  static ssize_t
 -array_size_store(mddev_t *mddev, const char *buf, size_t len)
 +array_size_store(struct mddev *mddev, const char *buf, size_t len)
  {
        sector_t sectors;
  
@@@ -4485,7 -4481,7 +4481,7 @@@ static ssize_
  md_attr_show(struct kobject *kobj, struct attribute *attr, char *page)
  {
        struct md_sysfs_entry *entry = container_of(attr, struct md_sysfs_entry, attr);
 -      mddev_t *mddev = container_of(kobj, struct mddev_s, kobj);
 +      struct mddev *mddev = container_of(kobj, struct mddev, kobj);
        ssize_t rv;
  
        if (!entry->show)
@@@ -4503,7 -4499,7 +4499,7 @@@ md_attr_store(struct kobject *kobj, str
              const char *page, size_t length)
  {
        struct md_sysfs_entry *entry = container_of(attr, struct md_sysfs_entry, attr);
 -      mddev_t *mddev = container_of(kobj, struct mddev_s, kobj);
 +      struct mddev *mddev = container_of(kobj, struct mddev, kobj);
        ssize_t rv;
  
        if (!entry->store)
  
  static void md_free(struct kobject *ko)
  {
 -      mddev_t *mddev = container_of(ko, mddev_t, kobj);
 +      struct mddev *mddev = container_of(ko, struct mddev, kobj);
  
        if (mddev->sysfs_state)
                sysfs_put(mddev->sysfs_state);
@@@ -4551,7 -4547,7 +4547,7 @@@ int mdp_major = 0
  
  static void mddev_delayed_delete(struct work_struct *ws)
  {
 -      mddev_t *mddev = container_of(ws, mddev_t, del_work);
 +      struct mddev *mddev = container_of(ws, struct mddev, del_work);
  
        sysfs_remove_group(&mddev->kobj, &md_bitmap_group);
        kobject_del(&mddev->kobj);
  static int md_alloc(dev_t dev, char *name)
  {
        static DEFINE_MUTEX(disks_mutex);
 -      mddev_t *mddev = mddev_find(dev);
 +      struct mddev *mddev = mddev_find(dev);
        struct gendisk *disk;
        int partitioned;
        int shift;
        if (name) {
                /* Need to ensure that 'name' is not a duplicate.
                 */
 -              mddev_t *mddev2;
 +              struct mddev *mddev2;
                spin_lock(&all_mddevs_lock);
  
                list_for_each_entry(mddev2, &all_mddevs, all_mddevs)
@@@ -4689,7 -4685,7 +4685,7 @@@ static int add_named_array(const char *
  
  static void md_safemode_timeout(unsigned long data)
  {
 -      mddev_t *mddev = (mddev_t *) data;
 +      struct mddev *mddev = (struct mddev *) data;
  
        if (!atomic_read(&mddev->writes_pending)) {
                mddev->safemode = 1;
  
  static int start_dirty_degraded;
  
 -int md_run(mddev_t *mddev)
 +int md_run(struct mddev *mddev)
  {
        int err;
 -      mdk_rdev_t *rdev;
 -      struct mdk_personality *pers;
 +      struct md_rdev *rdev;
 +      struct md_personality *pers;
  
        if (list_empty(&mddev->disks))
                /* cannot run an array with no devices.. */
  
        if (mddev->bio_set == NULL)
                mddev->bio_set = bioset_create(BIO_POOL_SIZE,
 -                                             sizeof(mddev_t *));
 +                                             sizeof(struct mddev *));
  
        spin_lock(&pers_lock);
        pers = find_pers(mddev->level, mddev->clevel);
                 * configuration.
                 */
                char b[BDEVNAME_SIZE], b2[BDEVNAME_SIZE];
 -              mdk_rdev_t *rdev2;
 +              struct md_rdev *rdev2;
                int warned = 0;
  
                list_for_each_entry(rdev, &mddev->disks, same_set)
  }
  EXPORT_SYMBOL_GPL(md_run);
  
 -static int do_md_run(mddev_t *mddev)
 +static int do_md_run(struct mddev *mddev)
  {
        int err;
  
@@@ -4927,7 -4923,7 +4923,7 @@@ out
        return err;
  }
  
 -static int restart_array(mddev_t *mddev)
 +static int restart_array(struct mddev *mddev)
  {
        struct gendisk *disk = mddev->gendisk;
  
@@@ -4977,7 -4973,7 +4973,7 @@@ void restore_bitmap_write_access(struc
        spin_unlock(&inode->i_lock);
  }
  
 -static void md_clean(mddev_t *mddev)
 +static void md_clean(struct mddev *mddev)
  {
        mddev->array_sectors = 0;
        mddev->external_size = 0;
        mddev->bitmap_info.max_write_behind = 0;
  }
  
 -static void __md_stop_writes(mddev_t *mddev)
 +static void __md_stop_writes(struct mddev *mddev)
  {
        if (mddev->sync_thread) {
                set_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
        }
  }
  
 -void md_stop_writes(mddev_t *mddev)
 +void md_stop_writes(struct mddev *mddev)
  {
        mddev_lock(mddev);
        __md_stop_writes(mddev);
  }
  EXPORT_SYMBOL_GPL(md_stop_writes);
  
 -void md_stop(mddev_t *mddev)
 +void md_stop(struct mddev *mddev)
  {
        mddev->ready = 0;
        mddev->pers->stop(mddev);
  }
  EXPORT_SYMBOL_GPL(md_stop);
  
 -static int md_set_readonly(mddev_t *mddev, int is_open)
 +static int md_set_readonly(struct mddev *mddev, int is_open)
  {
        int err = 0;
        mutex_lock(&mddev->open_mutex);
   *   0 - completely stop and dis-assemble array
   *   2 - stop but do not disassemble array
   */
 -static int do_md_stop(mddev_t * mddev, int mode, int is_open)
 +static int do_md_stop(struct mddev * mddev, int mode, int is_open)
  {
        struct gendisk *disk = mddev->gendisk;
 -      mdk_rdev_t *rdev;
 +      struct md_rdev *rdev;
  
        mutex_lock(&mddev->open_mutex);
        if (atomic_read(&mddev->openers) > is_open ||
  }
  
  #ifndef MODULE
 -static void autorun_array(mddev_t *mddev)
 +static void autorun_array(struct mddev *mddev)
  {
 -      mdk_rdev_t *rdev;
 +      struct md_rdev *rdev;
        int err;
  
        if (list_empty(&mddev->disks))
   */
  static void autorun_devices(int part)
  {
 -      mdk_rdev_t *rdev0, *rdev, *tmp;
 -      mddev_t *mddev;
 +      struct md_rdev *rdev0, *rdev, *tmp;
 +      struct mddev *mddev;
        char b[BDEVNAME_SIZE];
  
        printk(KERN_INFO "md: autorun ...\n");
                dev_t dev;
                LIST_HEAD(candidates);
                rdev0 = list_entry(pending_raid_disks.next,
 -                                       mdk_rdev_t, same_set);
 +                                       struct md_rdev, same_set);
  
                printk(KERN_INFO "md: considering %s ...\n",
                        bdevname(rdev0->bdev,b));
@@@ -5289,11 -5285,11 +5285,11 @@@ static int get_version(void __user * ar
        return 0;
  }
  
 -static int get_array_info(mddev_t * mddev, void __user * arg)
 +static int get_array_info(struct mddev * mddev, void __user * arg)
  {
        mdu_array_info_t info;
        int nr,working,insync,failed,spare;
 -      mdk_rdev_t *rdev;
 +      struct md_rdev *rdev;
  
        nr=working=insync=failed=spare=0;
        list_for_each_entry(rdev, &mddev->disks, same_set) {
        return 0;
  }
  
 -static int get_bitmap_file(mddev_t * mddev, void __user * arg)
 +static int get_bitmap_file(struct mddev * mddev, void __user * arg)
  {
        mdu_bitmap_file_t *file = NULL; /* too big for stack allocation */
        char *ptr, *buf = NULL;
        return err;
  }
  
 -static int get_disk_info(mddev_t * mddev, void __user * arg)
 +static int get_disk_info(struct mddev * mddev, void __user * arg)
  {
        mdu_disk_info_t info;
 -      mdk_rdev_t *rdev;
 +      struct md_rdev *rdev;
  
        if (copy_from_user(&info, arg, sizeof(info)))
                return -EFAULT;
        return 0;
  }
  
 -static int add_new_disk(mddev_t * mddev, mdu_disk_info_t *info)
 +static int add_new_disk(struct mddev * mddev, mdu_disk_info_t *info)
  {
        char b[BDEVNAME_SIZE], b2[BDEVNAME_SIZE];
 -      mdk_rdev_t *rdev;
 +      struct md_rdev *rdev;
        dev_t dev = MKDEV(info->major,info->minor);
  
        if (info->major != MAJOR(dev) || info->minor != MINOR(dev))
                        return PTR_ERR(rdev);
                }
                if (!list_empty(&mddev->disks)) {
 -                      mdk_rdev_t *rdev0 = list_entry(mddev->disks.next,
 -                                                      mdk_rdev_t, same_set);
 +                      struct md_rdev *rdev0
 +                              = list_entry(mddev->disks.next,
 +                                           struct md_rdev, same_set);
                        err = super_types[mddev->major_version]
                                .load_super(rdev, rdev0, mddev->minor_version);
                        if (err < 0) {
        return 0;
  }
  
 -static int hot_remove_disk(mddev_t * mddev, dev_t dev)
 +static int hot_remove_disk(struct mddev * mddev, dev_t dev)
  {
        char b[BDEVNAME_SIZE];
 -      mdk_rdev_t *rdev;
 +      struct md_rdev *rdev;
  
        rdev = find_rdev(mddev, dev);
        if (!rdev)
@@@ -5611,11 -5606,11 +5607,11 @@@ busy
        return -EBUSY;
  }
  
 -static int hot_add_disk(mddev_t * mddev, dev_t dev)
 +static int hot_add_disk(struct mddev * mddev, dev_t dev)
  {
        char b[BDEVNAME_SIZE];
        int err;
 -      mdk_rdev_t *rdev;
 +      struct md_rdev *rdev;
  
        if (!mddev->pers)
                return -ENODEV;
@@@ -5685,7 -5680,7 +5681,7 @@@ abort_export
        return err;
  }
  
 -static int set_bitmap_file(mddev_t *mddev, int fd)
 +static int set_bitmap_file(struct mddev *mddev, int fd)
  {
        int err;
  
   *  The minor and patch _version numbers are also kept incase the
   *  super_block handler wishes to interpret them.
   */
 -static int set_array_info(mddev_t * mddev, mdu_array_info_t *info)
 +static int set_array_info(struct mddev * mddev, mdu_array_info_t *info)
  {
  
        if (info->raid_disks == 0) {
        return 0;
  }
  
 -void md_set_array_sectors(mddev_t *mddev, sector_t array_sectors)
 +void md_set_array_sectors(struct mddev *mddev, sector_t array_sectors)
  {
        WARN(!mddev_is_locked(mddev), "%s: unlocked mddev!\n", __func__);
  
  }
  EXPORT_SYMBOL(md_set_array_sectors);
  
 -static int update_size(mddev_t *mddev, sector_t num_sectors)
 +static int update_size(struct mddev *mddev, sector_t num_sectors)
  {
 -      mdk_rdev_t *rdev;
 +      struct md_rdev *rdev;
        int rv;
        int fit = (num_sectors == 0);
  
        return rv;
  }
  
 -static int update_raid_disks(mddev_t *mddev, int raid_disks)
 +static int update_raid_disks(struct mddev *mddev, int raid_disks)
  {
        int rv;
        /* change the number of raid disks */
   * Any differences that cannot be handled will cause an error.
   * Normally, only one change can be managed at a time.
   */
 -static int update_array_info(mddev_t *mddev, mdu_array_info_t *info)
 +static int update_array_info(struct mddev *mddev, mdu_array_info_t *info)
  {
        int rv = 0;
        int cnt = 0;
        return rv;
  }
  
 -static int set_disk_faulty(mddev_t *mddev, dev_t dev)
 +static int set_disk_faulty(struct mddev *mddev, dev_t dev)
  {
 -      mdk_rdev_t *rdev;
 +      struct md_rdev *rdev;
  
        if (mddev->pers == NULL)
                return -ENODEV;
   */
  static int md_getgeo(struct block_device *bdev, struct hd_geometry *geo)
  {
 -      mddev_t *mddev = bdev->bd_disk->private_data;
 +      struct mddev *mddev = bdev->bd_disk->private_data;
  
        geo->heads = 2;
        geo->sectors = 4;
@@@ -6036,7 -6031,7 +6032,7 @@@ static int md_ioctl(struct block_devic
  {
        int err = 0;
        void __user *argp = (void __user *)arg;
 -      mddev_t *mddev = NULL;
 +      struct mddev *mddev = NULL;
        int ro;
  
        if (!capable(CAP_SYS_ADMIN))
@@@ -6299,7 -6294,7 +6295,7 @@@ static int md_open(struct block_device 
         * Succeed if we can lock the mddev, which confirms that
         * it isn't being stopped right now.
         */
 -      mddev_t *mddev = mddev_find(bdev->bd_dev);
 +      struct mddev *mddev = mddev_find(bdev->bd_dev);
        int err;
  
        if (mddev->gendisk != bdev->bd_disk) {
  
  static int md_release(struct gendisk *disk, fmode_t mode)
  {
 -      mddev_t *mddev = disk->private_data;
 +      struct mddev *mddev = disk->private_data;
  
        BUG_ON(!mddev);
        atomic_dec(&mddev->openers);
  
  static int md_media_changed(struct gendisk *disk)
  {
 -      mddev_t *mddev = disk->private_data;
 +      struct mddev *mddev = disk->private_data;
  
        return mddev->changed;
  }
  
  static int md_revalidate(struct gendisk *disk)
  {
 -      mddev_t *mddev = disk->private_data;
 +      struct mddev *mddev = disk->private_data;
  
        mddev->changed = 0;
        return 0;
@@@ -6367,7 -6362,7 +6363,7 @@@ static const struct block_device_operat
  
  static int md_thread(void * arg)
  {
 -      mdk_thread_t *thread = arg;
 +      struct md_thread *thread = arg;
  
        /*
         * md_thread is a 'system-thread', it's priority should be very
        return 0;
  }
  
 -void md_wakeup_thread(mdk_thread_t *thread)
 +void md_wakeup_thread(struct md_thread *thread)
  {
        if (thread) {
 -              dprintk("md: waking up MD thread %s.\n", thread->tsk->comm);
 +              pr_debug("md: waking up MD thread %s.\n", thread->tsk->comm);
                set_bit(THREAD_WAKEUP, &thread->flags);
                wake_up(&thread->wqueue);
        }
  }
  
 -mdk_thread_t *md_register_thread(void (*run) (mddev_t *), mddev_t *mddev,
 +struct md_thread *md_register_thread(void (*run) (struct mddev *), struct mddev *mddev,
                                 const char *name)
  {
 -      mdk_thread_t *thread;
 +      struct md_thread *thread;
  
 -      thread = kzalloc(sizeof(mdk_thread_t), GFP_KERNEL);
 +      thread = kzalloc(sizeof(struct md_thread), GFP_KERNEL);
        if (!thread)
                return NULL;
  
        return thread;
  }
  
 -void md_unregister_thread(mdk_thread_t **threadp)
 +void md_unregister_thread(struct md_thread **threadp)
  {
 -      mdk_thread_t *thread = *threadp;
 +      struct md_thread *thread = *threadp;
        if (!thread)
                return;
 -      dprintk("interrupting MD-thread pid %d\n", task_pid_nr(thread->tsk));
 +      pr_debug("interrupting MD-thread pid %d\n", task_pid_nr(thread->tsk));
        /* Locking ensures that mddev_unlock does not wake_up a
         * non-existent thread
         */
        kfree(thread);
  }
  
 -void md_error(mddev_t *mddev, mdk_rdev_t *rdev)
 +void md_error(struct mddev *mddev, struct md_rdev *rdev)
  {
        if (!mddev) {
                MD_BUG();
  static void status_unused(struct seq_file *seq)
  {
        int i = 0;
 -      mdk_rdev_t *rdev;
 +      struct md_rdev *rdev;
  
        seq_printf(seq, "unused devices: ");
  
  }
  
  
 -static void status_resync(struct seq_file *seq, mddev_t * mddev)
 +static void status_resync(struct seq_file *seq, struct mddev * mddev)
  {
        sector_t max_sectors, resync, res;
        unsigned long dt, db;
@@@ -6594,7 -6589,7 +6590,7 @@@ static void *md_seq_start(struct seq_fi
  {
        struct list_head *tmp;
        loff_t l = *pos;
 -      mddev_t *mddev;
 +      struct mddev *mddev;
  
        if (l >= 0x10000)
                return NULL;
        spin_lock(&all_mddevs_lock);
        list_for_each(tmp,&all_mddevs)
                if (!l--) {
 -                      mddev = list_entry(tmp, mddev_t, all_mddevs);
 +                      mddev = list_entry(tmp, struct mddev, all_mddevs);
                        mddev_get(mddev);
                        spin_unlock(&all_mddevs_lock);
                        return mddev;
  static void *md_seq_next(struct seq_file *seq, void *v, loff_t *pos)
  {
        struct list_head *tmp;
 -      mddev_t *next_mddev, *mddev = v;
 +      struct mddev *next_mddev, *mddev = v;
        
        ++*pos;
        if (v == (void*)2)
        else
                tmp = mddev->all_mddevs.next;
        if (tmp != &all_mddevs)
 -              next_mddev = mddev_get(list_entry(tmp,mddev_t,all_mddevs));
 +              next_mddev = mddev_get(list_entry(tmp,struct mddev,all_mddevs));
        else {
                next_mddev = (void*)2;
                *pos = 0x10000;
  
  static void md_seq_stop(struct seq_file *seq, void *v)
  {
 -      mddev_t *mddev = v;
 +      struct mddev *mddev = v;
  
        if (mddev && v != (void*)1 && v != (void*)2)
                mddev_put(mddev);
  
  static int md_seq_show(struct seq_file *seq, void *v)
  {
 -      mddev_t *mddev = v;
 +      struct mddev *mddev = v;
        sector_t sectors;
 -      mdk_rdev_t *rdev;
 +      struct md_rdev *rdev;
        struct bitmap *bitmap;
  
        if (v == (void*)1) {
 -              struct mdk_personality *pers;
 +              struct md_personality *pers;
                seq_printf(seq, "Personalities : ");
                spin_lock(&pers_lock);
                list_for_each_entry(pers, &pers_list, list)
@@@ -6816,7 -6811,7 +6812,7 @@@ static const struct file_operations md_
        .poll           = mdstat_poll,
  };
  
 -int register_md_personality(struct mdk_personality *p)
 +int register_md_personality(struct md_personality *p)
  {
        spin_lock(&pers_lock);
        list_add_tail(&p->list, &pers_list);
        return 0;
  }
  
 -int unregister_md_personality(struct mdk_personality *p)
 +int unregister_md_personality(struct md_personality *p)
  {
        printk(KERN_INFO "md: %s personality unregistered\n", p->name);
        spin_lock(&pers_lock);
        return 0;
  }
  
 -static int is_mddev_idle(mddev_t *mddev, int init)
 +static int is_mddev_idle(struct mddev *mddev, int init)
  {
 -      mdk_rdev_t * rdev;
 +      struct md_rdev * rdev;
        int idle;
        int curr_events;
  
        return idle;
  }
  
 -void md_done_sync(mddev_t *mddev, int blocks, int ok)
 +void md_done_sync(struct mddev *mddev, int blocks, int ok)
  {
        /* another "blocks" (512byte) blocks have been synced */
        atomic_sub(blocks, &mddev->recovery_active);
   * in superblock) before writing, schedule a superblock update
   * and wait for it to complete.
   */
 -void md_write_start(mddev_t *mddev, struct bio *bi)
 +void md_write_start(struct mddev *mddev, struct bio *bi)
  {
        int did_change = 0;
        if (bio_data_dir(bi) != WRITE)
                   !test_bit(MD_CHANGE_PENDING, &mddev->flags));
  }
  
 -void md_write_end(mddev_t *mddev)
 +void md_write_end(struct mddev *mddev)
  {
        if (atomic_dec_and_test(&mddev->writes_pending)) {
                if (mddev->safemode == 2)
   * In the ->external case MD_CHANGE_CLEAN can not be cleared until mddev->lock
   * is dropped, so return -EAGAIN after notifying userspace.
   */
 -int md_allow_write(mddev_t *mddev)
 +int md_allow_write(struct mddev *mddev)
  {
        if (!mddev->pers)
                return 0;
@@@ -6982,9 -6977,9 +6978,9 @@@ EXPORT_SYMBOL_GPL(md_allow_write)
  
  #define SYNC_MARKS    10
  #define       SYNC_MARK_STEP  (3*HZ)
 -void md_do_sync(mddev_t *mddev)
 +void md_do_sync(struct mddev *mddev)
  {
 -      mddev_t *mddev2;
 +      struct mddev *mddev2;
        unsigned int currspeed = 0,
                 window;
        sector_t max_sectors,j, io_sectors;
        struct list_head *tmp;
        sector_t last_check;
        int skipped = 0;
 -      mdk_rdev_t *rdev;
 +      struct md_rdev *rdev;
        char *desc;
  
        /* just incase thread restarts... */
  }
  EXPORT_SYMBOL_GPL(md_do_sync);
  
 -static int remove_and_add_spares(mddev_t *mddev)
 +static int remove_and_add_spares(struct mddev *mddev)
  {
 -      mdk_rdev_t *rdev;
 +      struct md_rdev *rdev;
        int spares = 0;
  
        mddev->curr_resync_completed = 0;
        return spares;
  }
  
 -static void reap_sync_thread(mddev_t *mddev)
 +static void reap_sync_thread(struct mddev *mddev)
  {
 -      mdk_rdev_t *rdev;
 +      struct md_rdev *rdev;
  
        /* resync has finished, collect result */
        md_unregister_thread(&mddev->sync_thread);
        if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) &&
            mddev->pers->finish_reshape)
                mddev->pers->finish_reshape(mddev);
 -      md_update_sb(mddev, 1);
  
 -      /* if array is no-longer degraded, then any saved_raid_disk
 -       * information must be scrapped
 +      /* If array is no-longer degraded, then any saved_raid_disk
 +       * information must be scrapped.  Also if any device is now
 +       * In_sync we must scrape the saved_raid_disk for that device
 +       * do the superblock for an incrementally recovered device
 +       * written out.
         */
 -      if (!mddev->degraded)
 -              list_for_each_entry(rdev, &mddev->disks, same_set)
 +      list_for_each_entry(rdev, &mddev->disks, same_set)
 +              if (!mddev->degraded ||
 +                  test_bit(In_sync, &rdev->flags))
                        rdev->saved_raid_disk = -1;
  
 +      md_update_sb(mddev, 1);
        clear_bit(MD_RECOVERY_RUNNING, &mddev->recovery);
        clear_bit(MD_RECOVERY_SYNC, &mddev->recovery);
        clear_bit(MD_RECOVERY_RESHAPE, &mddev->recovery);
   *  5/ If array is degraded, try to add spares devices
   *  6/ If array has spares or is not in-sync, start a resync thread.
   */
 -void md_check_recovery(mddev_t *mddev)
 +void md_check_recovery(struct mddev *mddev)
  {
        if (mddev->suspended)
                return;
                        /* Only thing we do on a ro array is remove
                         * failed devices.
                         */
 -                      mdk_rdev_t *rdev;
 +                      struct md_rdev *rdev;
                        list_for_each_entry(rdev, &mddev->disks, same_set)
                                if (rdev->raid_disk >= 0 &&
                                    !test_bit(Blocked, &rdev->flags) &&
        }
  }
  
 -void md_wait_for_blocked_rdev(mdk_rdev_t *rdev, mddev_t *mddev)
 +void md_wait_for_blocked_rdev(struct md_rdev *rdev, struct mddev *mddev)
  {
        sysfs_notify_dirent_safe(rdev->sysfs_state);
        wait_event_timeout(rdev->blocked_wait,
@@@ -7836,7 -7827,7 +7832,7 @@@ static int md_set_badblocks(struct badb
        return rv;
  }
  
 -int rdev_set_badblocks(mdk_rdev_t *rdev, sector_t s, int sectors,
 +int rdev_set_badblocks(struct md_rdev *rdev, sector_t s, int sectors,
                       int acknowledged)
  {
        int rv = md_set_badblocks(&rdev->badblocks,
@@@ -7945,7 -7936,7 +7941,7 @@@ out
        return rv;
  }
  
 -int rdev_clear_badblocks(mdk_rdev_t *rdev, sector_t s, int sectors)
 +int rdev_clear_badblocks(struct md_rdev *rdev, sector_t s, int sectors)
  {
        return md_clear_badblocks(&rdev->badblocks,
                                  s + rdev->data_offset,
@@@ -8079,14 -8070,13 +8075,14 @@@ static int md_notify_reboot(struct noti
                            unsigned long code, void *x)
  {
        struct list_head *tmp;
 -      mddev_t *mddev;
 +      struct mddev *mddev;
 +      int need_delay = 0;
  
        if ((code == SYS_DOWN) || (code == SYS_HALT) || (code == SYS_POWER_OFF)) {
  
                printk(KERN_INFO "md: stopping all md devices.\n");
  
 -              for_each_mddev(mddev, tmp)
 +              for_each_mddev(mddev, tmp) {
                        if (mddev_trylock(mddev)) {
                                /* Force a switch to readonly even array
                                 * appears to still be in use.  Hence
                                md_set_readonly(mddev, 100);
                                mddev_unlock(mddev);
                        }
 +                      need_delay = 1;
 +              }
                /*
                 * certain more exotic SCSI devices are known to be
                 * volatile wrt too early system reboots. While the
                 * right place to handle this issue is the given
                 * driver, we do want to have a safe RAID driver ...
                 */
 -              mdelay(1000*1);
 +              if (need_delay)
 +                      mdelay(1000*1);
        }
        return NOTIFY_DONE;
  }
@@@ -8117,7 -8104,7 +8113,7 @@@ static struct notifier_block md_notifie
  
  static void md_geninit(void)
  {
 -      dprintk("md: sizeof(mdp_super_t) = %d\n", (int)sizeof(mdp_super_t));
 +      pr_debug("md: sizeof(mdp_super_t) = %d\n", (int)sizeof(mdp_super_t));
  
        proc_create("mdstat", S_IRUGO, NULL, &md_seq_fops);
  }
@@@ -8192,7 -8179,7 +8188,7 @@@ void md_autodetect_dev(dev_t dev
  
  static void autostart_arrays(int part)
  {
 -      mdk_rdev_t *rdev;
 +      struct md_rdev *rdev;
        struct detected_devices_node *node_detected_dev;
        dev_t dev;
        int i_scanned, i_passed;
  
  static __exit void md_exit(void)
  {
 -      mddev_t *mddev;
 +      struct mddev *mddev;
        struct list_head *tmp;
  
        blk_unregister_region(MKDEV(MD_MAJOR,0), 1U << MINORBITS);
diff --combined drivers/md/md.h
@@@ -1,5 -1,5 +1,5 @@@
  /*
 -   md_k.h : kernel internal structure of the Linux MD driver
 +   md.h : kernel internal structure of the Linux MD driver
            Copyright (C) 1996-98 Ingo Molnar, Gadi Oxman
          
     This program is free software; you can redistribute it and/or modify
@@@ -26,6 -26,9 +26,6 @@@
  
  #define MaxSector (~(sector_t)0)
  
 -typedef struct mddev_s mddev_t;
 -typedef struct mdk_rdev_s mdk_rdev_t;
 -
  /* Bad block numbers are stored sorted in a single page.
   * 64bits is used for each block or extent.
   * 54 bits are sector number, 9 bits are extent size,
  /*
   * MD's 'extended' device
   */
 -struct mdk_rdev_s
 -{
 +struct md_rdev {
        struct list_head same_set;      /* RAID devices within the same set */
  
        sector_t sectors;               /* Device size (in 512bytes sectors) */
 -      mddev_t *mddev;                 /* RAID array if running */
 +      struct mddev *mddev;            /* RAID array if running */
        int last_events;                /* IO event timestamp */
  
        /*
  
  extern int md_is_badblock(struct badblocks *bb, sector_t s, int sectors,
                          sector_t *first_bad, int *bad_sectors);
 -static inline int is_badblock(mdk_rdev_t *rdev, sector_t s, int sectors,
 +static inline int is_badblock(struct md_rdev *rdev, sector_t s, int sectors,
                              sector_t *first_bad, int *bad_sectors)
  {
        if (unlikely(rdev->badblocks.count)) {
        }
        return 0;
  }
 -extern int rdev_set_badblocks(mdk_rdev_t *rdev, sector_t s, int sectors,
 +extern int rdev_set_badblocks(struct md_rdev *rdev, sector_t s, int sectors,
                              int acknowledged);
 -extern int rdev_clear_badblocks(mdk_rdev_t *rdev, sector_t s, int sectors);
 +extern int rdev_clear_badblocks(struct md_rdev *rdev, sector_t s, int sectors);
  extern void md_ack_all_badblocks(struct badblocks *bb);
  
 -struct mddev_s
 -{
 +struct mddev {
        void                            *private;
 -      struct mdk_personality          *pers;
 +      struct md_personality           *pers;
        dev_t                           unit;
        int                             md_minor;
        struct list_head                disks;
        atomic_t                        plug_cnt;       /* If device is expecting
                                                         * more bios soon.
                                                         */
 -      struct mdk_thread_s             *thread;        /* management thread */
 -      struct mdk_thread_s             *sync_thread;   /* doing resync or reconstruct */
 +      struct md_thread                *thread;        /* management thread */
 +      struct md_thread                *sync_thread;   /* doing resync or reconstruct */
        sector_t                        curr_resync;    /* last block scheduled */
        /* As resync requests can complete out of order, we cannot easily track
         * how much resync has been completed.  So we occasionally pause until
        atomic_t flush_pending;
        struct work_struct flush_work;
        struct work_struct event_work;  /* used by dm to report failure event */
 -      void (*sync_super)(mddev_t *mddev, mdk_rdev_t *rdev);
 +      void (*sync_super)(struct mddev *mddev, struct md_rdev *rdev);
  };
  
  
 -static inline void rdev_dec_pending(mdk_rdev_t *rdev, mddev_t *mddev)
 +static inline void rdev_dec_pending(struct md_rdev *rdev, struct mddev *mddev)
  {
        int faulty = test_bit(Faulty, &rdev->flags);
        if (atomic_dec_and_test(&rdev->nr_pending) && faulty)
@@@ -413,35 -418,35 +413,35 @@@ static inline void md_sync_acct(struct 
          atomic_add(nr_sectors, &bdev->bd_contains->bd_disk->sync_io);
  }
  
 -struct mdk_personality
 +struct md_personality
  {
        char *name;
        int level;
        struct list_head list;
        struct module *owner;
-       int (*make_request)(struct mddev *mddev, struct bio *bio);
 -      void (*make_request)(mddev_t *mddev, struct bio *bio);
 -      int (*run)(mddev_t *mddev);
 -      int (*stop)(mddev_t *mddev);
 -      void (*status)(struct seq_file *seq, mddev_t *mddev);
++      void (*make_request)(struct mddev *mddev, struct bio *bio);
 +      int (*run)(struct mddev *mddev);
 +      int (*stop)(struct mddev *mddev);
 +      void (*status)(struct seq_file *seq, struct mddev *mddev);
        /* error_handler must set ->faulty and clear ->in_sync
         * if appropriate, and should abort recovery if needed 
         */
 -      void (*error_handler)(mddev_t *mddev, mdk_rdev_t *rdev);
 -      int (*hot_add_disk) (mddev_t *mddev, mdk_rdev_t *rdev);
 -      int (*hot_remove_disk) (mddev_t *mddev, int number);
 -      int (*spare_active) (mddev_t *mddev);
 -      sector_t (*sync_request)(mddev_t *mddev, sector_t sector_nr, int *skipped, int go_faster);
 -      int (*resize) (mddev_t *mddev, sector_t sectors);
 -      sector_t (*size) (mddev_t *mddev, sector_t sectors, int raid_disks);
 -      int (*check_reshape) (mddev_t *mddev);
 -      int (*start_reshape) (mddev_t *mddev);
 -      void (*finish_reshape) (mddev_t *mddev);
 +      void (*error_handler)(struct mddev *mddev, struct md_rdev *rdev);
 +      int (*hot_add_disk) (struct mddev *mddev, struct md_rdev *rdev);
 +      int (*hot_remove_disk) (struct mddev *mddev, int number);
 +      int (*spare_active) (struct mddev *mddev);
 +      sector_t (*sync_request)(struct mddev *mddev, sector_t sector_nr, int *skipped, int go_faster);
 +      int (*resize) (struct mddev *mddev, sector_t sectors);
 +      sector_t (*size) (struct mddev *mddev, sector_t sectors, int raid_disks);
 +      int (*check_reshape) (struct mddev *mddev);
 +      int (*start_reshape) (struct mddev *mddev);
 +      void (*finish_reshape) (struct mddev *mddev);
        /* quiesce moves between quiescence states
         * 0 - fully active
         * 1 - no new requests allowed
         * others - reserved
         */
 -      void (*quiesce) (mddev_t *mddev, int state);
 +      void (*quiesce) (struct mddev *mddev, int state);
        /* takeover is used to transition an array from one
         * personality to another.  The new personality must be able
         * to handle the data in the current layout.
         * This needs to be installed and then ->run used to activate the
         * array.
         */
 -      void *(*takeover) (mddev_t *mddev);
 +      void *(*takeover) (struct mddev *mddev);
  };
  
  
  struct md_sysfs_entry {
        struct attribute attr;
 -      ssize_t (*show)(mddev_t *, char *);
 -      ssize_t (*store)(mddev_t *, const char *, size_t);
 +      ssize_t (*show)(struct mddev *, char *);
 +      ssize_t (*store)(struct mddev *, const char *, size_t);
  };
  extern struct attribute_group md_bitmap_group;
  
@@@ -474,19 -479,19 +474,19 @@@ static inline void sysfs_notify_dirent_
                sysfs_notify_dirent(sd);
  }
  
 -static inline char * mdname (mddev_t * mddev)
 +static inline char * mdname (struct mddev * mddev)
  {
        return mddev->gendisk ? mddev->gendisk->disk_name : "mdX";
  }
  
 -static inline int sysfs_link_rdev(mddev_t *mddev, mdk_rdev_t *rdev)
 +static inline int sysfs_link_rdev(struct mddev *mddev, struct md_rdev *rdev)
  {
        char nm[20];
        sprintf(nm, "rd%d", rdev->raid_disk);
        return sysfs_create_link(&mddev->kobj, &rdev->kobj, nm);
  }
  
 -static inline void sysfs_unlink_rdev(mddev_t *mddev, mdk_rdev_t *rdev)
 +static inline void sysfs_unlink_rdev(struct mddev *mddev, struct md_rdev *rdev)
  {
        char nm[20];
        sprintf(nm, "rd%d", rdev->raid_disk);
  #define rdev_for_each_rcu(rdev, mddev)                                \
        list_for_each_entry_rcu(rdev, &((mddev)->disks), same_set)
  
 -typedef struct mdk_thread_s {
 -      void                    (*run) (mddev_t *mddev);
 -      mddev_t                 *mddev;
 +struct md_thread {
 +      void                    (*run) (struct mddev *mddev);
 +      struct mddev            *mddev;
        wait_queue_head_t       wqueue;
        unsigned long           flags;
        struct task_struct      *tsk;
        unsigned long           timeout;
 -} mdk_thread_t;
 +};
  
  #define THREAD_WAKEUP  0
  
@@@ -551,50 -556,48 +551,50 @@@ static inline void safe_put_page(struc
        if (p) put_page(p);
  }
  
 -extern int register_md_personality(struct mdk_personality *p);
 -extern int unregister_md_personality(struct mdk_personality *p);
 -extern mdk_thread_t * md_register_thread(void (*run) (mddev_t *mddev),
 -                              mddev_t *mddev, const char *name);
 -extern void md_unregister_thread(mdk_thread_t **threadp);
 -extern void md_wakeup_thread(mdk_thread_t *thread);
 -extern void md_check_recovery(mddev_t *mddev);
 -extern void md_write_start(mddev_t *mddev, struct bio *bi);
 -extern void md_write_end(mddev_t *mddev);
 -extern void md_done_sync(mddev_t *mddev, int blocks, int ok);
 -extern void md_error(mddev_t *mddev, mdk_rdev_t *rdev);
 -
 -extern int mddev_congested(mddev_t *mddev, int bits);
 -extern void md_flush_request(mddev_t *mddev, struct bio *bio);
 -extern void md_super_write(mddev_t *mddev, mdk_rdev_t *rdev,
 +extern int register_md_personality(struct md_personality *p);
 +extern int unregister_md_personality(struct md_personality *p);
 +extern struct md_thread *md_register_thread(
 +      void (*run)(struct mddev *mddev),
 +      struct mddev *mddev,
 +      const char *name);
 +extern void md_unregister_thread(struct md_thread **threadp);
 +extern void md_wakeup_thread(struct md_thread *thread);
 +extern void md_check_recovery(struct mddev *mddev);
 +extern void md_write_start(struct mddev *mddev, struct bio *bi);
 +extern void md_write_end(struct mddev *mddev);
 +extern void md_done_sync(struct mddev *mddev, int blocks, int ok);
 +extern void md_error(struct mddev *mddev, struct md_rdev *rdev);
 +
 +extern int mddev_congested(struct mddev *mddev, int bits);
 +extern void md_flush_request(struct mddev *mddev, struct bio *bio);
 +extern void md_super_write(struct mddev *mddev, struct md_rdev *rdev,
                           sector_t sector, int size, struct page *page);
 -extern void md_super_wait(mddev_t *mddev);
 -extern int sync_page_io(mdk_rdev_t *rdev, sector_t sector, int size, 
 +extern void md_super_wait(struct mddev *mddev);
 +extern int sync_page_io(struct md_rdev *rdev, sector_t sector, int size, 
                        struct page *page, int rw, bool metadata_op);
 -extern void md_do_sync(mddev_t *mddev);
 -extern void md_new_event(mddev_t *mddev);
 -extern int md_allow_write(mddev_t *mddev);
 -extern void md_wait_for_blocked_rdev(mdk_rdev_t *rdev, mddev_t *mddev);
 -extern void md_set_array_sectors(mddev_t *mddev, sector_t array_sectors);
 -extern int md_check_no_bitmap(mddev_t *mddev);
 -extern int md_integrity_register(mddev_t *mddev);
 -extern void md_integrity_add_rdev(mdk_rdev_t *rdev, mddev_t *mddev);
 +extern void md_do_sync(struct mddev *mddev);
 +extern void md_new_event(struct mddev *mddev);
 +extern int md_allow_write(struct mddev *mddev);
 +extern void md_wait_for_blocked_rdev(struct md_rdev *rdev, struct mddev *mddev);
 +extern void md_set_array_sectors(struct mddev *mddev, sector_t array_sectors);
 +extern int md_check_no_bitmap(struct mddev *mddev);
 +extern int md_integrity_register(struct mddev *mddev);
 +extern void md_integrity_add_rdev(struct md_rdev *rdev, struct mddev *mddev);
  extern int strict_strtoul_scaled(const char *cp, unsigned long *res, int scale);
  extern void restore_bitmap_write_access(struct file *file);
  
 -extern void mddev_init(mddev_t *mddev);
 -extern int md_run(mddev_t *mddev);
 -extern void md_stop(mddev_t *mddev);
 -extern void md_stop_writes(mddev_t *mddev);
 -extern int md_rdev_init(mdk_rdev_t *rdev);
 +extern void mddev_init(struct mddev *mddev);
 +extern int md_run(struct mddev *mddev);
 +extern void md_stop(struct mddev *mddev);
 +extern void md_stop_writes(struct mddev *mddev);
 +extern int md_rdev_init(struct md_rdev *rdev);
  
 -extern void mddev_suspend(mddev_t *mddev);
 -extern void mddev_resume(mddev_t *mddev);
 +extern void mddev_suspend(struct mddev *mddev);
 +extern void mddev_resume(struct mddev *mddev);
  extern struct bio *bio_clone_mddev(struct bio *bio, gfp_t gfp_mask,
 -                                 mddev_t *mddev);
 +                                 struct mddev *mddev);
  extern struct bio *bio_alloc_mddev(gfp_t gfp_mask, int nr_iovecs,
 -                                 mddev_t *mddev);
 -extern int mddev_check_plugged(mddev_t *mddev);
 +                                 struct mddev *mddev);
 +extern int mddev_check_plugged(struct mddev *mddev);
  extern void md_trim_bio(struct bio *bio, int offset, int size);
  #endif /* _MD_MD_H */
diff --combined drivers/md/multipath.c
@@@ -31,7 -31,7 +31,7 @@@
  #define       NR_RESERVED_BUFS        32
  
  
 -static int multipath_map (multipath_conf_t *conf)
 +static int multipath_map (struct mpconf *conf)
  {
        int i, disks = conf->raid_disks;
  
@@@ -42,7 -42,7 +42,7 @@@
  
        rcu_read_lock();
        for (i = 0; i < disks; i++) {
 -              mdk_rdev_t *rdev = rcu_dereference(conf->multipaths[i].rdev);
 +              struct md_rdev *rdev = rcu_dereference(conf->multipaths[i].rdev);
                if (rdev && test_bit(In_sync, &rdev->flags)) {
                        atomic_inc(&rdev->nr_pending);
                        rcu_read_unlock();
@@@ -58,8 -58,8 +58,8 @@@
  static void multipath_reschedule_retry (struct multipath_bh *mp_bh)
  {
        unsigned long flags;
 -      mddev_t *mddev = mp_bh->mddev;
 -      multipath_conf_t *conf = mddev->private;
 +      struct mddev *mddev = mp_bh->mddev;
 +      struct mpconf *conf = mddev->private;
  
        spin_lock_irqsave(&conf->device_lock, flags);
        list_add(&mp_bh->retry_list, &conf->retry_list);
@@@ -76,7 -76,7 +76,7 @@@
  static void multipath_end_bh_io (struct multipath_bh *mp_bh, int err)
  {
        struct bio *bio = mp_bh->master_bio;
 -      multipath_conf_t *conf = mp_bh->mddev->private;
 +      struct mpconf *conf = mp_bh->mddev->private;
  
        bio_endio(bio, err);
        mempool_free(mp_bh, conf->pool);
@@@ -86,8 -86,8 +86,8 @@@ static void multipath_end_request(struc
  {
        int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags);
        struct multipath_bh *mp_bh = bio->bi_private;
 -      multipath_conf_t *conf = mp_bh->mddev->private;
 -      mdk_rdev_t *rdev = conf->multipaths[mp_bh->path].rdev;
 +      struct mpconf *conf = mp_bh->mddev->private;
 +      struct md_rdev *rdev = conf->multipaths[mp_bh->path].rdev;
  
        if (uptodate)
                multipath_end_bh_io(mp_bh, 0);
        rdev_dec_pending(rdev, conf->mddev);
  }
  
- static int multipath_make_request(struct mddev *mddev, struct bio * bio)
 -static void multipath_make_request(mddev_t *mddev, struct bio * bio)
++static void multipath_make_request(struct mddev *mddev, struct bio * bio)
  {
 -      multipath_conf_t *conf = mddev->private;
 +      struct mpconf *conf = mddev->private;
        struct multipath_bh * mp_bh;
        struct multipath_info *multipath;
  
        if (unlikely(bio->bi_rw & REQ_FLUSH)) {
                md_flush_request(mddev, bio);
-               return 0;
+               return;
        }
  
        mp_bh = mempool_alloc(conf->pool, GFP_NOIO);
        if (mp_bh->path < 0) {
                bio_endio(bio, -EIO);
                mempool_free(mp_bh, conf->pool);
-               return 0;
+               return;
        }
        multipath = conf->multipaths + mp_bh->path;
  
        mp_bh->bio.bi_end_io = multipath_end_request;
        mp_bh->bio.bi_private = mp_bh;
        generic_make_request(&mp_bh->bio);
-       return 0;
+       return;
  }
  
 -static void multipath_status (struct seq_file *seq, mddev_t *mddev)
 +static void multipath_status (struct seq_file *seq, struct mddev *mddev)
  {
 -      multipath_conf_t *conf = mddev->private;
 +      struct mpconf *conf = mddev->private;
        int i;
        
        seq_printf (seq, " [%d/%d] [", conf->raid_disks,
  
  static int multipath_congested(void *data, int bits)
  {
 -      mddev_t *mddev = data;
 -      multipath_conf_t *conf = mddev->private;
 +      struct mddev *mddev = data;
 +      struct mpconf *conf = mddev->private;
        int i, ret = 0;
  
        if (mddev_congested(mddev, bits))
  
        rcu_read_lock();
        for (i = 0; i < mddev->raid_disks ; i++) {
 -              mdk_rdev_t *rdev = rcu_dereference(conf->multipaths[i].rdev);
 +              struct md_rdev *rdev = rcu_dereference(conf->multipaths[i].rdev);
                if (rdev && !test_bit(Faulty, &rdev->flags)) {
                        struct request_queue *q = bdev_get_queue(rdev->bdev);
  
  /*
   * Careful, this can execute in IRQ contexts as well!
   */
 -static void multipath_error (mddev_t *mddev, mdk_rdev_t *rdev)
 +static void multipath_error (struct mddev *mddev, struct md_rdev *rdev)
  {
 -      multipath_conf_t *conf = mddev->private;
 +      struct mpconf *conf = mddev->private;
        char b[BDEVNAME_SIZE];
  
        if (conf->raid_disks - mddev->degraded <= 1) {
               conf->raid_disks - mddev->degraded);
  }
  
 -static void print_multipath_conf (multipath_conf_t *conf)
 +static void print_multipath_conf (struct mpconf *conf)
  {
        int i;
        struct multipath_info *tmp;
  }
  
  
 -static int multipath_add_disk(mddev_t *mddev, mdk_rdev_t *rdev)
 +static int multipath_add_disk(struct mddev *mddev, struct md_rdev *rdev)
  {
 -      multipath_conf_t *conf = mddev->private;
 +      struct mpconf *conf = mddev->private;
        struct request_queue *q;
        int err = -EEXIST;
        int path;
        return err;
  }
  
 -static int multipath_remove_disk(mddev_t *mddev, int number)
 +static int multipath_remove_disk(struct mddev *mddev, int number)
  {
 -      multipath_conf_t *conf = mddev->private;
 +      struct mpconf *conf = mddev->private;
        int err = 0;
 -      mdk_rdev_t *rdev;
 +      struct md_rdev *rdev;
        struct multipath_info *p = conf->multipaths + number;
  
        print_multipath_conf(conf);
@@@ -335,12 -335,12 +335,12 @@@ abort
   *    3.      Performs writes following reads for array syncronising.
   */
  
 -static void multipathd (mddev_t *mddev)
 +static void multipathd (struct mddev *mddev)
  {
        struct multipath_bh *mp_bh;
        struct bio *bio;
        unsigned long flags;
 -      multipath_conf_t *conf = mddev->private;
 +      struct mpconf *conf = mddev->private;
        struct list_head *head = &conf->retry_list;
  
        md_check_recovery(mddev);
        spin_unlock_irqrestore(&conf->device_lock, flags);
  }
  
 -static sector_t multipath_size(mddev_t *mddev, sector_t sectors, int raid_disks)
 +static sector_t multipath_size(struct mddev *mddev, sector_t sectors, int raid_disks)
  {
        WARN_ONCE(sectors || raid_disks,
                  "%s does not support generic reshape\n", __func__);
        return mddev->dev_sectors;
  }
  
 -static int multipath_run (mddev_t *mddev)
 +static int multipath_run (struct mddev *mddev)
  {
 -      multipath_conf_t *conf;
 +      struct mpconf *conf;
        int disk_idx;
        struct multipath_info *disk;
 -      mdk_rdev_t *rdev;
 +      struct md_rdev *rdev;
        int working_disks;
  
        if (md_check_no_bitmap(mddev))
         * should be freed in multipath_stop()]
         */
  
 -      conf = kzalloc(sizeof(multipath_conf_t), GFP_KERNEL);
 +      conf = kzalloc(sizeof(struct mpconf), GFP_KERNEL);
        mddev->private = conf;
        if (!conf) {
                printk(KERN_ERR 
@@@ -510,9 -510,9 +510,9 @@@ out
  }
  
  
 -static int multipath_stop (mddev_t *mddev)
 +static int multipath_stop (struct mddev *mddev)
  {
 -      multipath_conf_t *conf = mddev->private;
 +      struct mpconf *conf = mddev->private;
  
        md_unregister_thread(&mddev->thread);
        blk_sync_queue(mddev->queue); /* the unplug fn references 'conf'*/
        return 0;
  }
  
 -static struct mdk_personality multipath_personality =
 +static struct md_personality multipath_personality =
  {
        .name           = "multipath",
        .level          = LEVEL_MULTIPATH,
diff --combined drivers/md/raid0.c
@@@ -27,9 -27,9 +27,9 @@@
  
  static int raid0_congested(void *data, int bits)
  {
 -      mddev_t *mddev = data;
 -      raid0_conf_t *conf = mddev->private;
 -      mdk_rdev_t **devlist = conf->devlist;
 +      struct mddev *mddev = data;
 +      struct r0conf *conf = mddev->private;
 +      struct md_rdev **devlist = conf->devlist;
        int raid_disks = conf->strip_zone[0].nb_dev;
        int i, ret = 0;
  
  /*
   * inform the user of the raid configuration
  */
 -static void dump_zones(mddev_t *mddev)
 +static void dump_zones(struct mddev *mddev)
  {
 -      int j, k, h;
 +      int j, k;
        sector_t zone_size = 0;
        sector_t zone_start = 0;
        char b[BDEVNAME_SIZE];
 -      raid0_conf_t *conf = mddev->private;
 +      struct r0conf *conf = mddev->private;
        int raid_disks = conf->strip_zone[0].nb_dev;
 -      printk(KERN_INFO "******* %s configuration *********\n",
 -              mdname(mddev));
 -      h = 0;
 +      printk(KERN_INFO "md: RAID0 configuration for %s - %d zone%s\n",
 +             mdname(mddev),
 +             conf->nr_strip_zones, conf->nr_strip_zones==1?"":"s");
        for (j = 0; j < conf->nr_strip_zones; j++) {
 -              printk(KERN_INFO "zone%d=[", j);
 +              printk(KERN_INFO "md: zone%d=[", j);
                for (k = 0; k < conf->strip_zone[j].nb_dev; k++)
 -                      printk(KERN_CONT "%s/",
 +                      printk(KERN_CONT "%s%s", k?"/":"",
                        bdevname(conf->devlist[j*raid_disks
                                                + k]->bdev, b));
                printk(KERN_CONT "]\n");
  
                zone_size  = conf->strip_zone[j].zone_end - zone_start;
 -              printk(KERN_INFO "        zone offset=%llukb "
 -                              "device offset=%llukb size=%llukb\n",
 +              printk(KERN_INFO "      zone-offset=%10lluKB, "
 +                              "device-offset=%10lluKB, size=%10lluKB\n",
                        (unsigned long long)zone_start>>1,
                        (unsigned long long)conf->strip_zone[j].dev_start>>1,
                        (unsigned long long)zone_size>>1);
                zone_start = conf->strip_zone[j].zone_end;
        }
 -      printk(KERN_INFO "**********************************\n\n");
 +      printk(KERN_INFO "\n");
  }
  
 -static int create_strip_zones(mddev_t *mddev, raid0_conf_t **private_conf)
 +static int create_strip_zones(struct mddev *mddev, struct r0conf **private_conf)
  {
        int i, c, err;
        sector_t curr_zone_end, sectors;
 -      mdk_rdev_t *smallest, *rdev1, *rdev2, *rdev, **dev;
 +      struct md_rdev *smallest, *rdev1, *rdev2, *rdev, **dev;
        struct strip_zone *zone;
        int cnt;
        char b[BDEVNAME_SIZE];
 -      raid0_conf_t *conf = kzalloc(sizeof(*conf), GFP_KERNEL);
 +      char b2[BDEVNAME_SIZE];
 +      struct r0conf *conf = kzalloc(sizeof(*conf), GFP_KERNEL);
  
        if (!conf)
                return -ENOMEM;
        list_for_each_entry(rdev1, &mddev->disks, same_set) {
 -              printk(KERN_INFO "md/raid0:%s: looking at %s\n",
 -                     mdname(mddev),
 -                     bdevname(rdev1->bdev, b));
 +              pr_debug("md/raid0:%s: looking at %s\n",
 +                       mdname(mddev),
 +                       bdevname(rdev1->bdev, b));
                c = 0;
  
                /* round size to chunk_size */
                rdev1->sectors = sectors * mddev->chunk_sectors;
  
                list_for_each_entry(rdev2, &mddev->disks, same_set) {
 -                      printk(KERN_INFO "md/raid0:%s:   comparing %s(%llu)",
 -                             mdname(mddev),
 -                             bdevname(rdev1->bdev,b),
 -                             (unsigned long long)rdev1->sectors);
 -                      printk(KERN_CONT " with %s(%llu)\n",
 -                             bdevname(rdev2->bdev,b),
 -                             (unsigned long long)rdev2->sectors);
 +                      pr_debug("md/raid0:%s:   comparing %s(%llu)"
 +                               " with %s(%llu)\n",
 +                               mdname(mddev),
 +                               bdevname(rdev1->bdev,b),
 +                               (unsigned long long)rdev1->sectors,
 +                               bdevname(rdev2->bdev,b2),
 +                               (unsigned long long)rdev2->sectors);
                        if (rdev2 == rdev1) {
 -                              printk(KERN_INFO "md/raid0:%s:   END\n",
 -                                     mdname(mddev));
 +                              pr_debug("md/raid0:%s:   END\n",
 +                                       mdname(mddev));
                                break;
                        }
                        if (rdev2->sectors == rdev1->sectors) {
                                 * Not unique, don't count it as a new
                                 * group
                                 */
 -                              printk(KERN_INFO "md/raid0:%s:   EQUAL\n",
 -                                     mdname(mddev));
 +                              pr_debug("md/raid0:%s:   EQUAL\n",
 +                                       mdname(mddev));
                                c = 1;
                                break;
                        }
 -                      printk(KERN_INFO "md/raid0:%s:   NOT EQUAL\n",
 -                             mdname(mddev));
 +                      pr_debug("md/raid0:%s:   NOT EQUAL\n",
 +                               mdname(mddev));
                }
                if (!c) {
 -                      printk(KERN_INFO "md/raid0:%s:   ==> UNIQUE\n",
 -                             mdname(mddev));
 +                      pr_debug("md/raid0:%s:   ==> UNIQUE\n",
 +                               mdname(mddev));
                        conf->nr_strip_zones++;
 -                      printk(KERN_INFO "md/raid0:%s: %d zones\n",
 -                             mdname(mddev), conf->nr_strip_zones);
 +                      pr_debug("md/raid0:%s: %d zones\n",
 +                               mdname(mddev), conf->nr_strip_zones);
                }
        }
 -      printk(KERN_INFO "md/raid0:%s: FINAL %d zones\n",
 -             mdname(mddev), conf->nr_strip_zones);
 +      pr_debug("md/raid0:%s: FINAL %d zones\n",
 +               mdname(mddev), conf->nr_strip_zones);
        err = -ENOMEM;
        conf->strip_zone = kzalloc(sizeof(struct strip_zone)*
                                conf->nr_strip_zones, GFP_KERNEL);
        if (!conf->strip_zone)
                goto abort;
 -      conf->devlist = kzalloc(sizeof(mdk_rdev_t*)*
 +      conf->devlist = kzalloc(sizeof(struct md_rdev*)*
                                conf->nr_strip_zones*mddev->raid_disks,
                                GFP_KERNEL);
        if (!conf->devlist)
                zone = conf->strip_zone + i;
                dev = conf->devlist + i * mddev->raid_disks;
  
 -              printk(KERN_INFO "md/raid0:%s: zone %d\n",
 -                     mdname(mddev), i);
 +              pr_debug("md/raid0:%s: zone %d\n", mdname(mddev), i);
                zone->dev_start = smallest->sectors;
                smallest = NULL;
                c = 0;
  
                for (j=0; j<cnt; j++) {
                        rdev = conf->devlist[j];
 -                      printk(KERN_INFO "md/raid0:%s: checking %s ...",
 -                             mdname(mddev),
 -                             bdevname(rdev->bdev, b));
                        if (rdev->sectors <= zone->dev_start) {
 -                              printk(KERN_CONT " nope.\n");
 +                              pr_debug("md/raid0:%s: checking %s ... nope\n",
 +                                       mdname(mddev),
 +                                       bdevname(rdev->bdev, b));
                                continue;
                        }
 -                      printk(KERN_CONT " contained as device %d\n", c);
 +                      pr_debug("md/raid0:%s: checking %s ..."
 +                               " contained as device %d\n",
 +                               mdname(mddev),
 +                               bdevname(rdev->bdev, b), c);
                        dev[c] = rdev;
                        c++;
                        if (!smallest || rdev->sectors < smallest->sectors) {
                                smallest = rdev;
 -                              printk(KERN_INFO "md/raid0:%s:  (%llu) is smallest!.\n",
 -                                     mdname(mddev),
 -                                     (unsigned long long)rdev->sectors);
 +                              pr_debug("md/raid0:%s:  (%llu) is smallest!.\n",
 +                                       mdname(mddev),
 +                                       (unsigned long long)rdev->sectors);
                        }
                }
  
                zone->nb_dev = c;
                sectors = (smallest->sectors - zone->dev_start) * c;
 -              printk(KERN_INFO "md/raid0:%s: zone->nb_dev: %d, sectors: %llu\n",
 -                     mdname(mddev),
 -                     zone->nb_dev, (unsigned long long)sectors);
 +              pr_debug("md/raid0:%s: zone->nb_dev: %d, sectors: %llu\n",
 +                       mdname(mddev),
 +                       zone->nb_dev, (unsigned long long)sectors);
  
                curr_zone_end += sectors;
                zone->zone_end = curr_zone_end;
  
 -              printk(KERN_INFO "md/raid0:%s: current zone start: %llu\n",
 -                     mdname(mddev),
 -                     (unsigned long long)smallest->sectors);
 +              pr_debug("md/raid0:%s: current zone start: %llu\n",
 +                       mdname(mddev),
 +                       (unsigned long long)smallest->sectors);
        }
        mddev->queue->backing_dev_info.congested_fn = raid0_congested;
        mddev->queue->backing_dev_info.congested_data = mddev;
        blk_queue_io_opt(mddev->queue,
                         (mddev->chunk_sectors << 9) * mddev->raid_disks);
  
 -      printk(KERN_INFO "md/raid0:%s: done.\n", mdname(mddev));
 +      pr_debug("md/raid0:%s: done.\n", mdname(mddev));
        *private_conf = conf;
  
        return 0;
@@@ -301,7 -299,7 +301,7 @@@ static int raid0_mergeable_bvec(struct 
                                struct bvec_merge_data *bvm,
                                struct bio_vec *biovec)
  {
 -      mddev_t *mddev = q->queuedata;
 +      struct mddev *mddev = q->queuedata;
        sector_t sector = bvm->bi_sector + get_start_sect(bvm->bi_bdev);
        int max;
        unsigned int chunk_sectors = mddev->chunk_sectors;
                return max;
  }
  
 -static sector_t raid0_size(mddev_t *mddev, sector_t sectors, int raid_disks)
 +static sector_t raid0_size(struct mddev *mddev, sector_t sectors, int raid_disks)
  {
        sector_t array_sectors = 0;
 -      mdk_rdev_t *rdev;
 +      struct md_rdev *rdev;
  
        WARN_ONCE(sectors || raid_disks,
                  "%s does not support generic reshape\n", __func__);
        return array_sectors;
  }
  
 -static int raid0_run(mddev_t *mddev)
 +static int raid0_run(struct mddev *mddev)
  {
 -      raid0_conf_t *conf;
 +      struct r0conf *conf;
        int ret;
  
        if (mddev->chunk_sectors == 0) {
        return md_integrity_register(mddev);
  }
  
 -static int raid0_stop(mddev_t *mddev)
 +static int raid0_stop(struct mddev *mddev)
  {
 -      raid0_conf_t *conf = mddev->private;
 +      struct r0conf *conf = mddev->private;
  
        blk_sync_queue(mddev->queue); /* the unplug fn references 'conf'*/
        kfree(conf->strip_zone);
  /* Find the zone which holds a particular offset
   * Update *sectorp to be an offset in that zone
   */
 -static struct strip_zone *find_zone(struct raid0_private_data *conf,
 +static struct strip_zone *find_zone(struct r0conf *conf,
                                    sector_t *sectorp)
  {
        int i;
   * remaps the bio to the target device. we separate two flows.
   * power 2 flow and a general flow for the sake of perfromance
  */
 -static mdk_rdev_t *map_sector(mddev_t *mddev, struct strip_zone *zone,
 +static struct md_rdev *map_sector(struct mddev *mddev, struct strip_zone *zone,
                                sector_t sector, sector_t *sector_offset)
  {
        unsigned int sect_in_chunk;
        sector_t chunk;
 -      raid0_conf_t *conf = mddev->private;
 +      struct r0conf *conf = mddev->private;
        int raid_disks = conf->strip_zone[0].nb_dev;
        unsigned int chunk_sects = mddev->chunk_sectors;
  
  /*
   * Is io distribute over 1 or more chunks ?
  */
 -static inline int is_io_in_chunk_boundary(mddev_t *mddev,
 +static inline int is_io_in_chunk_boundary(struct mddev *mddev,
                        unsigned int chunk_sects, struct bio *bio)
  {
        if (likely(is_power_of_2(chunk_sects))) {
        }
  }
  
- static int raid0_make_request(struct mddev *mddev, struct bio *bio)
 -static void raid0_make_request(mddev_t *mddev, struct bio *bio)
++static void raid0_make_request(struct mddev *mddev, struct bio *bio)
  {
        unsigned int chunk_sects;
        sector_t sector_offset;
        struct strip_zone *zone;
 -      mdk_rdev_t *tmp_dev;
 +      struct md_rdev *tmp_dev;
  
        if (unlikely(bio->bi_rw & REQ_FLUSH)) {
                md_flush_request(mddev, bio);
-               return 0;
+               return;
        }
  
        chunk_sects = mddev->chunk_sectors;
                else
                        bp = bio_split(bio, chunk_sects -
                                       sector_div(sector, chunk_sects));
-               if (raid0_make_request(mddev, &bp->bio1))
-                       generic_make_request(&bp->bio1);
-               if (raid0_make_request(mddev, &bp->bio2))
-                       generic_make_request(&bp->bio2);
+               raid0_make_request(mddev, &bp->bio1);
+               raid0_make_request(mddev, &bp->bio2);
                bio_pair_release(bp);
-               return 0;
+               return;
        }
  
        sector_offset = bio->bi_sector;
        bio->bi_bdev = tmp_dev->bdev;
        bio->bi_sector = sector_offset + zone->dev_start +
                tmp_dev->data_offset;
-       /*
-        * Let the main block layer submit the IO and resolve recursion:
-        */
-       return 1;
+       generic_make_request(bio);
+       return;
  
  bad_map:
        printk("md/raid0:%s: make_request bug: can't convert block across chunks"
               (unsigned long long)bio->bi_sector, bio->bi_size >> 10);
  
        bio_io_error(bio);
-       return 0;
+       return;
  }
  
 -static void raid0_status(struct seq_file *seq, mddev_t *mddev)
 +static void raid0_status(struct seq_file *seq, struct mddev *mddev)
  {
 -#undef MD_DEBUG
 -#ifdef MD_DEBUG
 -      int j, k, h;
 -      char b[BDEVNAME_SIZE];
 -      raid0_conf_t *conf = mddev->private;
 -      int raid_disks = conf->strip_zone[0].nb_dev;
 -
 -      sector_t zone_size;
 -      sector_t zone_start = 0;
 -      h = 0;
 -
 -      for (j = 0; j < conf->nr_strip_zones; j++) {
 -              seq_printf(seq, "      z%d", j);
 -              seq_printf(seq, "=[");
 -              for (k = 0; k < conf->strip_zone[j].nb_dev; k++)
 -                      seq_printf(seq, "%s/", bdevname(
 -                              conf->devlist[j*raid_disks + k]
 -                                              ->bdev, b));
 -
 -              zone_size  = conf->strip_zone[j].zone_end - zone_start;
 -              seq_printf(seq, "] ze=%lld ds=%lld s=%lld\n",
 -                      (unsigned long long)zone_start>>1,
 -                      (unsigned long long)conf->strip_zone[j].dev_start>>1,
 -                      (unsigned long long)zone_size>>1);
 -              zone_start = conf->strip_zone[j].zone_end;
 -      }
 -#endif
        seq_printf(seq, " %dk chunks", mddev->chunk_sectors / 2);
        return;
  }
  
 -static void *raid0_takeover_raid45(mddev_t *mddev)
 +static void *raid0_takeover_raid45(struct mddev *mddev)
  {
 -      mdk_rdev_t *rdev;
 -      raid0_conf_t *priv_conf;
 +      struct md_rdev *rdev;
 +      struct r0conf *priv_conf;
  
        if (mddev->degraded != 1) {
                printk(KERN_ERR "md/raid0:%s: raid5 must be degraded! Degraded disks: %d\n",
        return priv_conf;
  }
  
 -static void *raid0_takeover_raid10(mddev_t *mddev)
 +static void *raid0_takeover_raid10(struct mddev *mddev)
  {
 -      raid0_conf_t *priv_conf;
 +      struct r0conf *priv_conf;
  
        /* Check layout:
         *  - far_copies must be 1
        return priv_conf;
  }
  
 -static void *raid0_takeover_raid1(mddev_t *mddev)
 +static void *raid0_takeover_raid1(struct mddev *mddev)
  {
 -      raid0_conf_t *priv_conf;
 +      struct r0conf *priv_conf;
  
        /* Check layout:
         *  - (N - 1) mirror drives must be already faulty
        return priv_conf;
  }
  
 -static void *raid0_takeover(mddev_t *mddev)
 +static void *raid0_takeover(struct mddev *mddev)
  {
        /* raid0 can take over:
         *  raid4 - if all data disks are active.
        return ERR_PTR(-EINVAL);
  }
  
 -static void raid0_quiesce(mddev_t *mddev, int state)
 +static void raid0_quiesce(struct mddev *mddev, int state)
  {
  }
  
 -static struct mdk_personality raid0_personality=
 +static struct md_personality raid0_personality=
  {
        .name           = "raid0",
        .level          = 0,
diff --combined drivers/md/raid1.c
  #include "raid1.h"
  #include "bitmap.h"
  
 -#define DEBUG 0
 -#define PRINTK(x...) do { if (DEBUG) printk(x); } while (0)
 -
  /*
   * Number of guaranteed r1bios in case of extreme VM load:
   */
  #define       NR_RAID1_BIOS 256
  
 +/* When there are this many requests queue to be written by
 + * the raid1 thread, we become 'congested' to provide back-pressure
 + * for writeback.
 + */
 +static int max_queued_requests = 1024;
  
 -static void allow_barrier(conf_t *conf);
 -static void lower_barrier(conf_t *conf);
 +static void allow_barrier(struct r1conf *conf);
 +static void lower_barrier(struct r1conf *conf);
  
  static void * r1bio_pool_alloc(gfp_t gfp_flags, void *data)
  {
        struct pool_info *pi = data;
 -      int size = offsetof(r1bio_t, bios[pi->raid_disks]);
 +      int size = offsetof(struct r1bio, bios[pi->raid_disks]);
  
        /* allocate a r1bio with room for raid_disks entries in the bios array */
        return kzalloc(size, gfp_flags);
@@@ -78,7 -76,7 +78,7 @@@ static void * r1buf_pool_alloc(gfp_t gf
  {
        struct pool_info *pi = data;
        struct page *page;
 -      r1bio_t *r1_bio;
 +      struct r1bio *r1_bio;
        struct bio *bio;
        int i, j;
  
@@@ -144,7 -142,7 +144,7 @@@ static void r1buf_pool_free(void *__r1_
  {
        struct pool_info *pi = data;
        int i,j;
 -      r1bio_t *r1bio = __r1_bio;
 +      struct r1bio *r1bio = __r1_bio;
  
        for (i = 0; i < RESYNC_PAGES; i++)
                for (j = pi->raid_disks; j-- ;) {
        r1bio_pool_free(r1bio, data);
  }
  
 -static void put_all_bios(conf_t *conf, r1bio_t *r1_bio)
 +static void put_all_bios(struct r1conf *conf, struct r1bio *r1_bio)
  {
        int i;
  
        }
  }
  
 -static void free_r1bio(r1bio_t *r1_bio)
 +static void free_r1bio(struct r1bio *r1_bio)
  {
 -      conf_t *conf = r1_bio->mddev->private;
 +      struct r1conf *conf = r1_bio->mddev->private;
  
        put_all_bios(conf, r1_bio);
        mempool_free(r1_bio, conf->r1bio_pool);
  }
  
 -static void put_buf(r1bio_t *r1_bio)
 +static void put_buf(struct r1bio *r1_bio)
  {
 -      conf_t *conf = r1_bio->mddev->private;
 +      struct r1conf *conf = r1_bio->mddev->private;
        int i;
  
        for (i=0; i<conf->raid_disks; i++) {
        lower_barrier(conf);
  }
  
 -static void reschedule_retry(r1bio_t *r1_bio)
 +static void reschedule_retry(struct r1bio *r1_bio)
  {
        unsigned long flags;
 -      mddev_t *mddev = r1_bio->mddev;
 -      conf_t *conf = mddev->private;
 +      struct mddev *mddev = r1_bio->mddev;
 +      struct r1conf *conf = mddev->private;
  
        spin_lock_irqsave(&conf->device_lock, flags);
        list_add(&r1_bio->retry_list, &conf->retry_list);
   * operation and are ready to return a success/failure code to the buffer
   * cache layer.
   */
 -static void call_bio_endio(r1bio_t *r1_bio)
 +static void call_bio_endio(struct r1bio *r1_bio)
  {
        struct bio *bio = r1_bio->master_bio;
        int done;
 -      conf_t *conf = r1_bio->mddev->private;
 +      struct r1conf *conf = r1_bio->mddev->private;
  
        if (bio->bi_phys_segments) {
                unsigned long flags;
        }
  }
  
 -static void raid_end_bio_io(r1bio_t *r1_bio)
 +static void raid_end_bio_io(struct r1bio *r1_bio)
  {
        struct bio *bio = r1_bio->master_bio;
  
        /* if nobody has done the final endio yet, do it now */
        if (!test_and_set_bit(R1BIO_Returned, &r1_bio->state)) {
 -              PRINTK(KERN_DEBUG "raid1: sync end %s on sectors %llu-%llu\n",
 -                      (bio_data_dir(bio) == WRITE) ? "write" : "read",
 -                      (unsigned long long) bio->bi_sector,
 -                      (unsigned long long) bio->bi_sector +
 -                              (bio->bi_size >> 9) - 1);
 +              pr_debug("raid1: sync end %s on sectors %llu-%llu\n",
 +                       (bio_data_dir(bio) == WRITE) ? "write" : "read",
 +                       (unsigned long long) bio->bi_sector,
 +                       (unsigned long long) bio->bi_sector +
 +                       (bio->bi_size >> 9) - 1);
  
                call_bio_endio(r1_bio);
        }
  /*
   * Update disk head position estimator based on IRQ completion info.
   */
 -static inline void update_head_pos(int disk, r1bio_t *r1_bio)
 +static inline void update_head_pos(int disk, struct r1bio *r1_bio)
  {
 -      conf_t *conf = r1_bio->mddev->private;
 +      struct r1conf *conf = r1_bio->mddev->private;
  
        conf->mirrors[disk].head_position =
                r1_bio->sector + (r1_bio->sectors);
  }
  
 +/*
 + * Find the disk number which triggered given bio
 + */
 +static int find_bio_disk(struct r1bio *r1_bio, struct bio *bio)
 +{
 +      int mirror;
 +      int raid_disks = r1_bio->mddev->raid_disks;
 +
 +      for (mirror = 0; mirror < raid_disks; mirror++)
 +              if (r1_bio->bios[mirror] == bio)
 +                      break;
 +
 +      BUG_ON(mirror == raid_disks);
 +      update_head_pos(mirror, r1_bio);
 +
 +      return mirror;
 +}
 +
  static void raid1_end_read_request(struct bio *bio, int error)
  {
        int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags);
 -      r1bio_t *r1_bio = bio->bi_private;
 +      struct r1bio *r1_bio = bio->bi_private;
        int mirror;
 -      conf_t *conf = r1_bio->mddev->private;
 +      struct r1conf *conf = r1_bio->mddev->private;
  
        mirror = r1_bio->read_disk;
        /*
        rdev_dec_pending(conf->mirrors[mirror].rdev, conf->mddev);
  }
  
 -static void close_write(r1bio_t *r1_bio)
 +static void close_write(struct r1bio *r1_bio)
  {
        /* it really is the end of this request */
        if (test_bit(R1BIO_BehindIO, &r1_bio->state)) {
        md_write_end(r1_bio->mddev);
  }
  
 -static void r1_bio_write_done(r1bio_t *r1_bio)
 +static void r1_bio_write_done(struct r1bio *r1_bio)
  {
        if (!atomic_dec_and_test(&r1_bio->remaining))
                return;
  static void raid1_end_write_request(struct bio *bio, int error)
  {
        int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags);
 -      r1bio_t *r1_bio = bio->bi_private;
 +      struct r1bio *r1_bio = bio->bi_private;
        int mirror, behind = test_bit(R1BIO_BehindIO, &r1_bio->state);
 -      conf_t *conf = r1_bio->mddev->private;
 +      struct r1conf *conf = r1_bio->mddev->private;
        struct bio *to_put = NULL;
  
 -
 -      for (mirror = 0; mirror < conf->raid_disks; mirror++)
 -              if (r1_bio->bios[mirror] == bio)
 -                      break;
 +      mirror = find_bio_disk(r1_bio, bio);
  
        /*
         * 'one mirror IO has finished' event handler:
                }
        }
  
 -      update_head_pos(mirror, r1_bio);
 -
        if (behind) {
                if (test_bit(WriteMostly, &conf->mirrors[mirror].rdev->flags))
                        atomic_dec(&r1_bio->behind_remaining);
                        /* Maybe we can return now */
                        if (!test_and_set_bit(R1BIO_Returned, &r1_bio->state)) {
                                struct bio *mbio = r1_bio->master_bio;
 -                              PRINTK(KERN_DEBUG "raid1: behind end write sectors %llu-%llu\n",
 -                                     (unsigned long long) mbio->bi_sector,
 -                                     (unsigned long long) mbio->bi_sector +
 -                                     (mbio->bi_size >> 9) - 1);
 +                              pr_debug("raid1: behind end write sectors"
 +                                       " %llu-%llu\n",
 +                                       (unsigned long long) mbio->bi_sector,
 +                                       (unsigned long long) mbio->bi_sector +
 +                                       (mbio->bi_size >> 9) - 1);
                                call_bio_endio(r1_bio);
                        }
                }
   *
   * The rdev for the device selected will have nr_pending incremented.
   */
 -static int read_balance(conf_t *conf, r1bio_t *r1_bio, int *max_sectors)
 +static int read_balance(struct r1conf *conf, struct r1bio *r1_bio, int *max_sectors)
  {
        const sector_t this_sector = r1_bio->sector;
        int sectors;
        int best_disk;
        int i;
        sector_t best_dist;
 -      mdk_rdev_t *rdev;
 +      struct md_rdev *rdev;
        int choose_first;
  
        rcu_read_lock();
        return best_disk;
  }
  
 -int md_raid1_congested(mddev_t *mddev, int bits)
 +int md_raid1_congested(struct mddev *mddev, int bits)
  {
 -      conf_t *conf = mddev->private;
 +      struct r1conf *conf = mddev->private;
        int i, ret = 0;
  
 +      if ((bits & (1 << BDI_async_congested)) &&
 +          conf->pending_count >= max_queued_requests)
 +              return 1;
 +
        rcu_read_lock();
        for (i = 0; i < mddev->raid_disks; i++) {
 -              mdk_rdev_t *rdev = rcu_dereference(conf->mirrors[i].rdev);
 +              struct md_rdev *rdev = rcu_dereference(conf->mirrors[i].rdev);
                if (rdev && !test_bit(Faulty, &rdev->flags)) {
                        struct request_queue *q = bdev_get_queue(rdev->bdev);
  
@@@ -631,13 -611,13 +631,13 @@@ EXPORT_SYMBOL_GPL(md_raid1_congested)
  
  static int raid1_congested(void *data, int bits)
  {
 -      mddev_t *mddev = data;
 +      struct mddev *mddev = data;
  
        return mddev_congested(mddev, bits) ||
                md_raid1_congested(mddev, bits);
  }
  
 -static void flush_pending_writes(conf_t *conf)
 +static void flush_pending_writes(struct r1conf *conf)
  {
        /* Any writes that have been queued but are awaiting
         * bitmap updates get flushed here.
        if (conf->pending_bio_list.head) {
                struct bio *bio;
                bio = bio_list_get(&conf->pending_bio_list);
 +              conf->pending_count = 0;
                spin_unlock_irq(&conf->device_lock);
                /* flush any pending bitmap writes to
                 * disk before proceeding w/ I/O */
                bitmap_unplug(conf->mddev->bitmap);
 +              wake_up(&conf->wait_barrier);
  
                while (bio) { /* submit pending writes */
                        struct bio *next = bio->bi_next;
   */
  #define RESYNC_DEPTH 32
  
 -static void raise_barrier(conf_t *conf)
 +static void raise_barrier(struct r1conf *conf)
  {
        spin_lock_irq(&conf->resync_lock);
  
        spin_unlock_irq(&conf->resync_lock);
  }
  
 -static void lower_barrier(conf_t *conf)
 +static void lower_barrier(struct r1conf *conf)
  {
        unsigned long flags;
        BUG_ON(conf->barrier <= 0);
        wake_up(&conf->wait_barrier);
  }
  
 -static void wait_barrier(conf_t *conf)
 +static void wait_barrier(struct r1conf *conf)
  {
        spin_lock_irq(&conf->resync_lock);
        if (conf->barrier) {
        spin_unlock_irq(&conf->resync_lock);
  }
  
 -static void allow_barrier(conf_t *conf)
 +static void allow_barrier(struct r1conf *conf)
  {
        unsigned long flags;
        spin_lock_irqsave(&conf->resync_lock, flags);
        wake_up(&conf->wait_barrier);
  }
  
 -static void freeze_array(conf_t *conf)
 +static void freeze_array(struct r1conf *conf)
  {
        /* stop syncio and normal IO and wait for everything to
         * go quite.
                            flush_pending_writes(conf));
        spin_unlock_irq(&conf->resync_lock);
  }
 -static void unfreeze_array(conf_t *conf)
 +static void unfreeze_array(struct r1conf *conf)
  {
        /* reverse the effect of the freeze */
        spin_lock_irq(&conf->resync_lock);
  
  /* duplicate the data pages for behind I/O 
   */
 -static void alloc_behind_pages(struct bio *bio, r1bio_t *r1_bio)
 +static void alloc_behind_pages(struct bio *bio, struct r1bio *r1_bio)
  {
        int i;
        struct bio_vec *bvec;
@@@ -804,14 -782,14 +804,14 @@@ do_sync_io
                if (bvecs[i].bv_page)
                        put_page(bvecs[i].bv_page);
        kfree(bvecs);
 -      PRINTK("%dB behind alloc failed, doing sync I/O\n", bio->bi_size);
 +      pr_debug("%dB behind alloc failed, doing sync I/O\n", bio->bi_size);
  }
  
- static int make_request(struct mddev *mddev, struct bio * bio)
 -static void make_request(mddev_t *mddev, struct bio * bio)
++static void make_request(struct mddev *mddev, struct bio * bio)
  {
 -      conf_t *conf = mddev->private;
 -      mirror_info_t *mirror;
 -      r1bio_t *r1_bio;
 +      struct r1conf *conf = mddev->private;
 +      struct mirror_info *mirror;
 +      struct r1bio *r1_bio;
        struct bio *read_bio;
        int i, disks;
        struct bitmap *bitmap;
        const int rw = bio_data_dir(bio);
        const unsigned long do_sync = (bio->bi_rw & REQ_SYNC);
        const unsigned long do_flush_fua = (bio->bi_rw & (REQ_FLUSH | REQ_FUA));
 -      mdk_rdev_t *blocked_rdev;
 +      struct md_rdev *blocked_rdev;
        int plugged;
        int first_clone;
        int sectors_handled;
@@@ -892,7 -870,7 +892,7 @@@ read_again
                if (rdisk < 0) {
                        /* couldn't find anywhere to read from */
                        raid_end_bio_io(r1_bio);
-                       return 0;
+                       return;
                }
                mirror = conf->mirrors + rdisk;
  
                        goto read_again;
                } else
                        generic_make_request(read_bio);
-               return 0;
+               return;
        }
  
        /*
         * WRITE:
         */
 +      if (conf->pending_count >= max_queued_requests) {
 +              md_wakeup_thread(mddev->thread);
 +              wait_event(conf->wait_barrier,
 +                         conf->pending_count < max_queued_requests);
 +      }
        /* first select target devices under rcu_lock and
         * inc refcount on their rdev.  Record them by setting
         * bios[x] to bio
        rcu_read_lock();
        max_sectors = r1_bio->sectors;
        for (i = 0;  i < disks; i++) {
 -              mdk_rdev_t *rdev = rcu_dereference(conf->mirrors[i].rdev);
 +              struct md_rdev *rdev = rcu_dereference(conf->mirrors[i].rdev);
                if (rdev && unlikely(test_bit(Blocked, &rdev->flags))) {
                        atomic_inc(&rdev->nr_pending);
                        blocked_rdev = rdev;
                atomic_inc(&r1_bio->remaining);
                spin_lock_irqsave(&conf->device_lock, flags);
                bio_list_add(&conf->pending_bio_list, mbio);
 +              conf->pending_count++;
                spin_unlock_irqrestore(&conf->device_lock, flags);
        }
        /* Mustn't call r1_bio_write_done before this next test,
  
        if (do_sync || !bitmap || !plugged)
                md_wakeup_thread(mddev->thread);
-       return 0;
  }
  
 -static void status(struct seq_file *seq, mddev_t *mddev)
 +static void status(struct seq_file *seq, struct mddev *mddev)
  {
 -      conf_t *conf = mddev->private;
 +      struct r1conf *conf = mddev->private;
        int i;
  
        seq_printf(seq, " [%d/%d] [", conf->raid_disks,
                   conf->raid_disks - mddev->degraded);
        rcu_read_lock();
        for (i = 0; i < conf->raid_disks; i++) {
 -              mdk_rdev_t *rdev = rcu_dereference(conf->mirrors[i].rdev);
 +              struct md_rdev *rdev = rcu_dereference(conf->mirrors[i].rdev);
                seq_printf(seq, "%s",
                           rdev && test_bit(In_sync, &rdev->flags) ? "U" : "_");
        }
  }
  
  
 -static void error(mddev_t *mddev, mdk_rdev_t *rdev)
 +static void error(struct mddev *mddev, struct md_rdev *rdev)
  {
        char b[BDEVNAME_SIZE];
 -      conf_t *conf = mddev->private;
 +      struct r1conf *conf = mddev->private;
  
        /*
         * If it is not operational, then we have already marked it as dead
               mdname(mddev), conf->raid_disks - mddev->degraded);
  }
  
 -static void print_conf(conf_t *conf)
 +static void print_conf(struct r1conf *conf)
  {
        int i;
  
        rcu_read_lock();
        for (i = 0; i < conf->raid_disks; i++) {
                char b[BDEVNAME_SIZE];
 -              mdk_rdev_t *rdev = rcu_dereference(conf->mirrors[i].rdev);
 +              struct md_rdev *rdev = rcu_dereference(conf->mirrors[i].rdev);
                if (rdev)
                        printk(KERN_DEBUG " disk %d, wo:%d, o:%d, dev:%s\n",
                               i, !test_bit(In_sync, &rdev->flags),
        rcu_read_unlock();
  }
  
 -static void close_sync(conf_t *conf)
 +static void close_sync(struct r1conf *conf)
  {
        wait_barrier(conf);
        allow_barrier(conf);
        conf->r1buf_pool = NULL;
  }
  
 -static int raid1_spare_active(mddev_t *mddev)
 +static int raid1_spare_active(struct mddev *mddev)
  {
        int i;
 -      conf_t *conf = mddev->private;
 +      struct r1conf *conf = mddev->private;
        int count = 0;
        unsigned long flags;
  
         * Called under mddev lock, so rcu protection not needed.
         */
        for (i = 0; i < conf->raid_disks; i++) {
 -              mdk_rdev_t *rdev = conf->mirrors[i].rdev;
 +              struct md_rdev *rdev = conf->mirrors[i].rdev;
                if (rdev
                    && !test_bit(Faulty, &rdev->flags)
                    && !test_and_set_bit(In_sync, &rdev->flags)) {
  }
  
  
 -static int raid1_add_disk(mddev_t *mddev, mdk_rdev_t *rdev)
 +static int raid1_add_disk(struct mddev *mddev, struct md_rdev *rdev)
  {
 -      conf_t *conf = mddev->private;
 +      struct r1conf *conf = mddev->private;
        int err = -EEXIST;
        int mirror = 0;
 -      mirror_info_t *p;
 +      struct mirror_info *p;
        int first = 0;
        int last = mddev->raid_disks - 1;
  
        return err;
  }
  
 -static int raid1_remove_disk(mddev_t *mddev, int number)
 +static int raid1_remove_disk(struct mddev *mddev, int number)
  {
 -      conf_t *conf = mddev->private;
 +      struct r1conf *conf = mddev->private;
        int err = 0;
 -      mdk_rdev_t *rdev;
 -      mirror_info_t *p = conf->mirrors+ number;
 +      struct md_rdev *rdev;
 +      struct mirror_info *p = conf->mirrors+ number;
  
        print_conf(conf);
        rdev = p->rdev;
@@@ -1371,10 -1341,14 +1369,10 @@@ abort
  
  static void end_sync_read(struct bio *bio, int error)
  {
 -      r1bio_t *r1_bio = bio->bi_private;
 -      int i;
 +      struct r1bio *r1_bio = bio->bi_private;
 +
 +      update_head_pos(r1_bio->read_disk, r1_bio);
  
 -      for (i=r1_bio->mddev->raid_disks; i--; )
 -              if (r1_bio->bios[i] == bio)
 -                      break;
 -      BUG_ON(i < 0);
 -      update_head_pos(i, r1_bio);
        /*
         * we have read a block, now it needs to be re-written,
         * or re-read if the read failed.
  static void end_sync_write(struct bio *bio, int error)
  {
        int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags);
 -      r1bio_t *r1_bio = bio->bi_private;
 -      mddev_t *mddev = r1_bio->mddev;
 -      conf_t *conf = mddev->private;
 -      int i;
 +      struct r1bio *r1_bio = bio->bi_private;
 +      struct mddev *mddev = r1_bio->mddev;
 +      struct r1conf *conf = mddev->private;
        int mirror=0;
        sector_t first_bad;
        int bad_sectors;
  
 -      for (i = 0; i < conf->raid_disks; i++)
 -              if (r1_bio->bios[i] == bio) {
 -                      mirror = i;
 -                      break;
 -              }
 +      mirror = find_bio_disk(r1_bio, bio);
 +
        if (!uptodate) {
                sector_t sync_blocks = 0;
                sector_t s = r1_bio->sector;
                )
                set_bit(R1BIO_MadeGood, &r1_bio->state);
  
 -      update_head_pos(mirror, r1_bio);
 -
        if (atomic_dec_and_test(&r1_bio->remaining)) {
                int s = r1_bio->sectors;
                if (test_bit(R1BIO_MadeGood, &r1_bio->state) ||
        }
  }
  
 -static int r1_sync_page_io(mdk_rdev_t *rdev, sector_t sector,
 +static int r1_sync_page_io(struct md_rdev *rdev, sector_t sector,
                            int sectors, struct page *page, int rw)
  {
        if (sync_page_io(rdev, sector, sectors << 9, page, rw, false))
        return 0;
  }
  
 -static int fix_sync_read_error(r1bio_t *r1_bio)
 +static int fix_sync_read_error(struct r1bio *r1_bio)
  {
        /* Try some synchronous reads of other devices to get
         * good data, much like with normal read errors.  Only
         * made sure that anything with a bad block in range
         * will have bi_end_io clear.
         */
 -      mddev_t *mddev = r1_bio->mddev;
 -      conf_t *conf = mddev->private;
 +      struct mddev *mddev = r1_bio->mddev;
 +      struct r1conf *conf = mddev->private;
        struct bio *bio = r1_bio->bios[r1_bio->read_disk];
        sector_t sect = r1_bio->sector;
        int sectors = r1_bio->sectors;
                int s = sectors;
                int d = r1_bio->read_disk;
                int success = 0;
 -              mdk_rdev_t *rdev;
 +              struct md_rdev *rdev;
                int start;
  
                if (s > (PAGE_SIZE>>9))
                                        abort = 1;
                        }
                        if (abort) {
 -                              mddev->recovery_disabled = 1;
 +                              conf->recovery_disabled =
 +                                      mddev->recovery_disabled;
                                set_bit(MD_RECOVERY_INTR, &mddev->recovery);
                                md_done_sync(mddev, r1_bio->sectors, 0);
                                put_buf(r1_bio);
        return 1;
  }
  
 -static int process_checks(r1bio_t *r1_bio)
 +static int process_checks(struct r1bio *r1_bio)
  {
        /* We have read all readable devices.  If we haven't
         * got the block, then there is no hope left.
         * If any blocks failed to read, then we need to
         * attempt an over-write
         */
 -      mddev_t *mddev = r1_bio->mddev;
 -      conf_t *conf = mddev->private;
 +      struct mddev *mddev = r1_bio->mddev;
 +      struct r1conf *conf = mddev->private;
        int primary;
        int i;
  
        return 0;
  }
  
 -static void sync_request_write(mddev_t *mddev, r1bio_t *r1_bio)
 +static void sync_request_write(struct mddev *mddev, struct r1bio *r1_bio)
  {
 -      conf_t *conf = mddev->private;
 +      struct r1conf *conf = mddev->private;
        int i;
        int disks = conf->raid_disks;
        struct bio *bio, *wbio;
   *    3.      Performs writes following reads for array synchronising.
   */
  
 -static void fix_read_error(conf_t *conf, int read_disk,
 +static void fix_read_error(struct r1conf *conf, int read_disk,
                           sector_t sect, int sectors)
  {
 -      mddev_t *mddev = conf->mddev;
 +      struct mddev *mddev = conf->mddev;
        while(sectors) {
                int s = sectors;
                int d = read_disk;
                int success = 0;
                int start;
 -              mdk_rdev_t *rdev;
 +              struct md_rdev *rdev;
  
                if (s > (PAGE_SIZE>>9))
                        s = PAGE_SIZE >> 9;
  
                if (!success) {
                        /* Cannot read from anywhere - mark it bad */
 -                      mdk_rdev_t *rdev = conf->mirrors[read_disk].rdev;
 +                      struct md_rdev *rdev = conf->mirrors[read_disk].rdev;
                        if (!rdev_set_badblocks(rdev, sect, s, 0))
                                md_error(mddev, rdev);
                        break;
@@@ -1808,11 -1787,11 +1806,11 @@@ static int submit_bio_wait(int rw, stru
        return test_bit(BIO_UPTODATE, &bio->bi_flags);
  }
  
 -static int narrow_write_error(r1bio_t *r1_bio, int i)
 +static int narrow_write_error(struct r1bio *r1_bio, int i)
  {
 -      mddev_t *mddev = r1_bio->mddev;
 -      conf_t *conf = mddev->private;
 -      mdk_rdev_t *rdev = conf->mirrors[i].rdev;
 +      struct mddev *mddev = r1_bio->mddev;
 +      struct r1conf *conf = mddev->private;
 +      struct md_rdev *rdev = conf->mirrors[i].rdev;
        int vcnt, idx;
        struct bio_vec *vec;
  
        return ok;
  }
  
 -static void handle_sync_write_finished(conf_t *conf, r1bio_t *r1_bio)
 +static void handle_sync_write_finished(struct r1conf *conf, struct r1bio *r1_bio)
  {
        int m;
        int s = r1_bio->sectors;
        for (m = 0; m < conf->raid_disks ; m++) {
 -              mdk_rdev_t *rdev = conf->mirrors[m].rdev;
 +              struct md_rdev *rdev = conf->mirrors[m].rdev;
                struct bio *bio = r1_bio->bios[m];
                if (bio->bi_end_io == NULL)
                        continue;
        md_done_sync(conf->mddev, s, 1);
  }
  
 -static void handle_write_finished(conf_t *conf, r1bio_t *r1_bio)
 +static void handle_write_finished(struct r1conf *conf, struct r1bio *r1_bio)
  {
        int m;
        for (m = 0; m < conf->raid_disks ; m++)
                if (r1_bio->bios[m] == IO_MADE_GOOD) {
 -                      mdk_rdev_t *rdev = conf->mirrors[m].rdev;
 +                      struct md_rdev *rdev = conf->mirrors[m].rdev;
                        rdev_clear_badblocks(rdev,
                                             r1_bio->sector,
                                             r1_bio->sectors);
        raid_end_bio_io(r1_bio);
  }
  
 -static void handle_read_error(conf_t *conf, r1bio_t *r1_bio)
 +static void handle_read_error(struct r1conf *conf, struct r1bio *r1_bio)
  {
        int disk;
        int max_sectors;
 -      mddev_t *mddev = conf->mddev;
 +      struct mddev *mddev = conf->mddev;
        struct bio *bio;
        char b[BDEVNAME_SIZE];
 -      mdk_rdev_t *rdev;
 +      struct md_rdev *rdev;
  
        clear_bit(R1BIO_ReadError, &r1_bio->state);
        /* we got a read error. Maybe the drive is bad.  Maybe just
@@@ -2026,11 -2005,11 +2024,11 @@@ read_more
        }
  }
  
 -static void raid1d(mddev_t *mddev)
 +static void raid1d(struct mddev *mddev)
  {
 -      r1bio_t *r1_bio;
 +      struct r1bio *r1_bio;
        unsigned long flags;
 -      conf_t *conf = mddev->private;
 +      struct r1conf *conf = mddev->private;
        struct list_head *head = &conf->retry_list;
        struct blk_plug plug;
  
                        spin_unlock_irqrestore(&conf->device_lock, flags);
                        break;
                }
 -              r1_bio = list_entry(head->prev, r1bio_t, retry_list);
 +              r1_bio = list_entry(head->prev, struct r1bio, retry_list);
                list_del(head->prev);
                conf->nr_queued--;
                spin_unlock_irqrestore(&conf->device_lock, flags);
  }
  
  
 -static int init_resync(conf_t *conf)
 +static int init_resync(struct r1conf *conf)
  {
        int buffs;
  
   * that can be installed to exclude normal IO requests.
   */
  
 -static sector_t sync_request(mddev_t *mddev, sector_t sector_nr, int *skipped, int go_faster)
 +static sector_t sync_request(struct mddev *mddev, sector_t sector_nr, int *skipped, int go_faster)
  {
 -      conf_t *conf = mddev->private;
 -      r1bio_t *r1_bio;
 +      struct r1conf *conf = mddev->private;
 +      struct r1bio *r1_bio;
        struct bio *bio;
        sector_t max_sector, nr_sectors;
        int disk = -1;
        set_bit(R1BIO_IsSync, &r1_bio->state);
  
        for (i=0; i < conf->raid_disks; i++) {
 -              mdk_rdev_t *rdev;
 +              struct md_rdev *rdev;
                bio = r1_bio->bios[i];
  
                /* take from bio_init */
                bio->bi_next = NULL;
                bio->bi_flags &= ~(BIO_POOL_MASK-1);
                bio->bi_flags |= 1 << BIO_UPTODATE;
-               bio->bi_comp_cpu = -1;
                bio->bi_rw = READ;
                bio->bi_vcnt = 0;
                bio->bi_idx = 0;
                int ok = 1;
                for (i = 0 ; i < conf->raid_disks ; i++)
                        if (r1_bio->bios[i]->bi_end_io == end_sync_write) {
 -                              mdk_rdev_t *rdev =
 +                              struct md_rdev *rdev =
                                        rcu_dereference(conf->mirrors[i].rdev);
                                ok = rdev_set_badblocks(rdev, sector_nr,
                                                        min_bad, 0
        return nr_sectors;
  }
  
 -static sector_t raid1_size(mddev_t *mddev, sector_t sectors, int raid_disks)
 +static sector_t raid1_size(struct mddev *mddev, sector_t sectors, int raid_disks)
  {
        if (sectors)
                return sectors;
        return mddev->dev_sectors;
  }
  
 -static conf_t *setup_conf(mddev_t *mddev)
 +static struct r1conf *setup_conf(struct mddev *mddev)
  {
 -      conf_t *conf;
 +      struct r1conf *conf;
        int i;
 -      mirror_info_t *disk;
 -      mdk_rdev_t *rdev;
 +      struct mirror_info *disk;
 +      struct md_rdev *rdev;
        int err = -ENOMEM;
  
 -      conf = kzalloc(sizeof(conf_t), GFP_KERNEL);
 +      conf = kzalloc(sizeof(struct r1conf), GFP_KERNEL);
        if (!conf)
                goto abort;
  
        init_waitqueue_head(&conf->wait_barrier);
  
        bio_list_init(&conf->pending_bio_list);
 +      conf->pending_count = 0;
 +      conf->recovery_disabled = mddev->recovery_disabled - 1;
  
        conf->last_used = -1;
        for (i = 0; i < conf->raid_disks; i++) {
        return ERR_PTR(err);
  }
  
 -static int run(mddev_t *mddev)
 +static int run(struct mddev *mddev)
  {
 -      conf_t *conf;
 +      struct r1conf *conf;
        int i;
 -      mdk_rdev_t *rdev;
 +      struct md_rdev *rdev;
  
        if (mddev->level != 1) {
                printk(KERN_ERR "md/raid1:%s: raid level not set to mirroring (%d)\n",
        return md_integrity_register(mddev);
  }
  
 -static int stop(mddev_t *mddev)
 +static int stop(struct mddev *mddev)
  {
 -      conf_t *conf = mddev->private;
 +      struct r1conf *conf = mddev->private;
        struct bitmap *bitmap = mddev->bitmap;
  
        /* wait for behind writes to complete */
        return 0;
  }
  
 -static int raid1_resize(mddev_t *mddev, sector_t sectors)
 +static int raid1_resize(struct mddev *mddev, sector_t sectors)
  {
        /* no resync is happening, and there is enough space
         * on all devices, so we can resize.
        return 0;
  }
  
 -static int raid1_reshape(mddev_t *mddev)
 +static int raid1_reshape(struct mddev *mddev)
  {
        /* We need to:
         * 1/ resize the r1bio_pool
         */
        mempool_t *newpool, *oldpool;
        struct pool_info *newpoolinfo;
 -      mirror_info_t *newmirrors;
 -      conf_t *conf = mddev->private;
 +      struct mirror_info *newmirrors;
 +      struct r1conf *conf = mddev->private;
        int cnt, raid_disks;
        unsigned long flags;
        int d, d2, err;
        conf->r1bio_pool = newpool;
  
        for (d = d2 = 0; d < conf->raid_disks; d++) {
 -              mdk_rdev_t *rdev = conf->mirrors[d].rdev;
 +              struct md_rdev *rdev = conf->mirrors[d].rdev;
                if (rdev && rdev->raid_disk != d2) {
                        sysfs_unlink_rdev(mddev, rdev);
                        rdev->raid_disk = d2;
        return 0;
  }
  
 -static void raid1_quiesce(mddev_t *mddev, int state)
 +static void raid1_quiesce(struct mddev *mddev, int state)
  {
 -      conf_t *conf = mddev->private;
 +      struct r1conf *conf = mddev->private;
  
        switch(state) {
        case 2: /* wake for suspend */
        }
  }
  
 -static void *raid1_takeover(mddev_t *mddev)
 +static void *raid1_takeover(struct mddev *mddev)
  {
        /* raid1 can take over:
         *  raid5 with 2 devices, any layout or chunk size
         */
        if (mddev->level == 5 && mddev->raid_disks == 2) {
 -              conf_t *conf;
 +              struct r1conf *conf;
                mddev->new_level = 1;
                mddev->new_layout = 0;
                mddev->new_chunk_sectors = 0;
        return ERR_PTR(-EINVAL);
  }
  
 -static struct mdk_personality raid1_personality =
 +static struct md_personality raid1_personality =
  {
        .name           = "raid1",
        .level          = 1,
@@@ -2796,5 -2772,3 +2793,5 @@@ MODULE_DESCRIPTION("RAID1 (mirroring) p
  MODULE_ALIAS("md-personality-3"); /* RAID1 */
  MODULE_ALIAS("md-raid1");
  MODULE_ALIAS("md-level-1");
 +
 +module_param(max_queued_requests, int, S_IRUGO|S_IWUSR);
diff --combined drivers/md/raid10.c
   */
  #define       NR_RAID10_BIOS 256
  
 -static void allow_barrier(conf_t *conf);
 -static void lower_barrier(conf_t *conf);
 +/* When there are this many requests queue to be written by
 + * the raid10 thread, we become 'congested' to provide back-pressure
 + * for writeback.
 + */
 +static int max_queued_requests = 1024;
 +
 +static void allow_barrier(struct r10conf *conf);
 +static void lower_barrier(struct r10conf *conf);
  
  static void * r10bio_pool_alloc(gfp_t gfp_flags, void *data)
  {
 -      conf_t *conf = data;
 -      int size = offsetof(struct r10bio_s, devs[conf->copies]);
 +      struct r10conf *conf = data;
 +      int size = offsetof(struct r10bio, devs[conf->copies]);
  
        /* allocate a r10bio with room for raid_disks entries in the bios array */
        return kzalloc(size, gfp_flags);
@@@ -98,9 -92,9 +98,9 @@@ static void r10bio_pool_free(void *r10_
   */
  static void * r10buf_pool_alloc(gfp_t gfp_flags, void *data)
  {
 -      conf_t *conf = data;
 +      struct r10conf *conf = data;
        struct page *page;
 -      r10bio_t *r10_bio;
 +      struct r10bio *r10_bio;
        struct bio *bio;
        int i, j;
        int nalloc;
@@@ -164,8 -158,8 +164,8 @@@ out_free_bio
  static void r10buf_pool_free(void *__r10_bio, void *data)
  {
        int i;
 -      conf_t *conf = data;
 -      r10bio_t *r10bio = __r10_bio;
 +      struct r10conf *conf = data;
 +      struct r10bio *r10bio = __r10_bio;
        int j;
  
        for (j=0; j < conf->copies; j++) {
        r10bio_pool_free(r10bio, conf);
  }
  
 -static void put_all_bios(conf_t *conf, r10bio_t *r10_bio)
 +static void put_all_bios(struct r10conf *conf, struct r10bio *r10_bio)
  {
        int i;
  
        }
  }
  
 -static void free_r10bio(r10bio_t *r10_bio)
 +static void free_r10bio(struct r10bio *r10_bio)
  {
 -      conf_t *conf = r10_bio->mddev->private;
 +      struct r10conf *conf = r10_bio->mddev->private;
  
        put_all_bios(conf, r10_bio);
        mempool_free(r10_bio, conf->r10bio_pool);
  }
  
 -static void put_buf(r10bio_t *r10_bio)
 +static void put_buf(struct r10bio *r10_bio)
  {
 -      conf_t *conf = r10_bio->mddev->private;
 +      struct r10conf *conf = r10_bio->mddev->private;
  
        mempool_free(r10_bio, conf->r10buf_pool);
  
        lower_barrier(conf);
  }
  
 -static void reschedule_retry(r10bio_t *r10_bio)
 +static void reschedule_retry(struct r10bio *r10_bio)
  {
        unsigned long flags;
 -      mddev_t *mddev = r10_bio->mddev;
 -      conf_t *conf = mddev->private;
 +      struct mddev *mddev = r10_bio->mddev;
 +      struct r10conf *conf = mddev->private;
  
        spin_lock_irqsave(&conf->device_lock, flags);
        list_add(&r10_bio->retry_list, &conf->retry_list);
   * operation and are ready to return a success/failure code to the buffer
   * cache layer.
   */
 -static void raid_end_bio_io(r10bio_t *r10_bio)
 +static void raid_end_bio_io(struct r10bio *r10_bio)
  {
        struct bio *bio = r10_bio->master_bio;
        int done;
 -      conf_t *conf = r10_bio->mddev->private;
 +      struct r10conf *conf = r10_bio->mddev->private;
  
        if (bio->bi_phys_segments) {
                unsigned long flags;
  /*
   * Update disk head position estimator based on IRQ completion info.
   */
 -static inline void update_head_pos(int slot, r10bio_t *r10_bio)
 +static inline void update_head_pos(int slot, struct r10bio *r10_bio)
  {
 -      conf_t *conf = r10_bio->mddev->private;
 +      struct r10conf *conf = r10_bio->mddev->private;
  
        conf->mirrors[r10_bio->devs[slot].devnum].head_position =
                r10_bio->devs[slot].addr + (r10_bio->sectors);
  /*
   * Find the disk number which triggered given bio
   */
 -static int find_bio_disk(conf_t *conf, r10bio_t *r10_bio,
 +static int find_bio_disk(struct r10conf *conf, struct r10bio *r10_bio,
                         struct bio *bio, int *slotp)
  {
        int slot;
  static void raid10_end_read_request(struct bio *bio, int error)
  {
        int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags);
 -      r10bio_t *r10_bio = bio->bi_private;
 +      struct r10bio *r10_bio = bio->bi_private;
        int slot, dev;
 -      conf_t *conf = r10_bio->mddev->private;
 +      struct r10conf *conf = r10_bio->mddev->private;
  
  
        slot = r10_bio->read_slot;
        }
  }
  
 -static void close_write(r10bio_t *r10_bio)
 +static void close_write(struct r10bio *r10_bio)
  {
        /* clear the bitmap if all writes complete successfully */
        bitmap_endwrite(r10_bio->mddev->bitmap, r10_bio->sector,
        md_write_end(r10_bio->mddev);
  }
  
 -static void one_write_done(r10bio_t *r10_bio)
 +static void one_write_done(struct r10bio *r10_bio)
  {
        if (atomic_dec_and_test(&r10_bio->remaining)) {
                if (test_bit(R10BIO_WriteError, &r10_bio->state))
  static void raid10_end_write_request(struct bio *bio, int error)
  {
        int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags);
 -      r10bio_t *r10_bio = bio->bi_private;
 +      struct r10bio *r10_bio = bio->bi_private;
        int dev;
        int dec_rdev = 1;
 -      conf_t *conf = r10_bio->mddev->private;
 +      struct r10conf *conf = r10_bio->mddev->private;
        int slot;
  
        dev = find_bio_disk(conf, r10_bio, bio, &slot);
   * sector offset to a virtual address
   */
  
 -static void raid10_find_phys(conf_t *conf, r10bio_t *r10bio)
 +static void raid10_find_phys(struct r10conf *conf, struct r10bio *r10bio)
  {
        int n,f;
        sector_t sector;
        BUG_ON(slot != conf->copies);
  }
  
 -static sector_t raid10_find_virt(conf_t *conf, sector_t sector, int dev)
 +static sector_t raid10_find_virt(struct r10conf *conf, sector_t sector, int dev)
  {
        sector_t offset, chunk, vchunk;
  
@@@ -528,7 -522,7 +528,7 @@@ static int raid10_mergeable_bvec(struc
                                 struct bvec_merge_data *bvm,
                                 struct bio_vec *biovec)
  {
 -      mddev_t *mddev = q->queuedata;
 +      struct mddev *mddev = q->queuedata;
        sector_t sector = bvm->bi_sector + get_start_sect(bvm->bi_bdev);
        int max;
        unsigned int chunk_sectors = mddev->chunk_sectors;
   * FIXME: possibly should rethink readbalancing and do it differently
   * depending on near_copies / far_copies geometry.
   */
 -static int read_balance(conf_t *conf, r10bio_t *r10_bio, int *max_sectors)
 +static int read_balance(struct r10conf *conf, struct r10bio *r10_bio, int *max_sectors)
  {
        const sector_t this_sector = r10_bio->sector;
        int disk, slot;
        int sectors = r10_bio->sectors;
        int best_good_sectors;
        sector_t new_distance, best_dist;
 -      mdk_rdev_t *rdev;
 +      struct md_rdev *rdev;
        int do_balance;
        int best_slot;
  
@@@ -683,19 -677,15 +683,19 @@@ retry
  
  static int raid10_congested(void *data, int bits)
  {
 -      mddev_t *mddev = data;
 -      conf_t *conf = mddev->private;
 +      struct mddev *mddev = data;
 +      struct r10conf *conf = mddev->private;
        int i, ret = 0;
  
 +      if ((bits & (1 << BDI_async_congested)) &&
 +          conf->pending_count >= max_queued_requests)
 +              return 1;
 +
        if (mddev_congested(mddev, bits))
                return 1;
        rcu_read_lock();
        for (i = 0; i < conf->raid_disks && ret == 0; i++) {
 -              mdk_rdev_t *rdev = rcu_dereference(conf->mirrors[i].rdev);
 +              struct md_rdev *rdev = rcu_dereference(conf->mirrors[i].rdev);
                if (rdev && !test_bit(Faulty, &rdev->flags)) {
                        struct request_queue *q = bdev_get_queue(rdev->bdev);
  
        return ret;
  }
  
 -static void flush_pending_writes(conf_t *conf)
 +static void flush_pending_writes(struct r10conf *conf)
  {
        /* Any writes that have been queued but are awaiting
         * bitmap updates get flushed here.
        if (conf->pending_bio_list.head) {
                struct bio *bio;
                bio = bio_list_get(&conf->pending_bio_list);
 +              conf->pending_count = 0;
                spin_unlock_irq(&conf->device_lock);
                /* flush any pending bitmap writes to disk
                 * before proceeding w/ I/O */
                bitmap_unplug(conf->mddev->bitmap);
 +              wake_up(&conf->wait_barrier);
  
                while (bio) { /* submit pending writes */
                        struct bio *next = bio->bi_next;
   *    lower_barrier when the particular background IO completes.
   */
  
 -static void raise_barrier(conf_t *conf, int force)
 +static void raise_barrier(struct r10conf *conf, int force)
  {
        BUG_ON(force && !conf->barrier);
        spin_lock_irq(&conf->resync_lock);
        spin_unlock_irq(&conf->resync_lock);
  }
  
 -static void lower_barrier(conf_t *conf)
 +static void lower_barrier(struct r10conf *conf)
  {
        unsigned long flags;
        spin_lock_irqsave(&conf->resync_lock, flags);
        wake_up(&conf->wait_barrier);
  }
  
 -static void wait_barrier(conf_t *conf)
 +static void wait_barrier(struct r10conf *conf)
  {
        spin_lock_irq(&conf->resync_lock);
        if (conf->barrier) {
        spin_unlock_irq(&conf->resync_lock);
  }
  
 -static void allow_barrier(conf_t *conf)
 +static void allow_barrier(struct r10conf *conf)
  {
        unsigned long flags;
        spin_lock_irqsave(&conf->resync_lock, flags);
        wake_up(&conf->wait_barrier);
  }
  
 -static void freeze_array(conf_t *conf)
 +static void freeze_array(struct r10conf *conf)
  {
        /* stop syncio and normal IO and wait for everything to
         * go quiet.
        spin_unlock_irq(&conf->resync_lock);
  }
  
 -static void unfreeze_array(conf_t *conf)
 +static void unfreeze_array(struct r10conf *conf)
  {
        /* reverse the effect of the freeze */
        spin_lock_irq(&conf->resync_lock);
        spin_unlock_irq(&conf->resync_lock);
  }
  
- static int make_request(struct mddev *mddev, struct bio * bio)
 -static void make_request(mddev_t *mddev, struct bio * bio)
++static void make_request(struct mddev *mddev, struct bio * bio)
  {
 -      conf_t *conf = mddev->private;
 -      mirror_info_t *mirror;
 -      r10bio_t *r10_bio;
 +      struct r10conf *conf = mddev->private;
 +      struct mirror_info *mirror;
 +      struct r10bio *r10_bio;
        struct bio *read_bio;
        int i;
        int chunk_sects = conf->chunk_mask + 1;
        const unsigned long do_sync = (bio->bi_rw & REQ_SYNC);
        const unsigned long do_fua = (bio->bi_rw & REQ_FUA);
        unsigned long flags;
 -      mdk_rdev_t *blocked_rdev;
 +      struct md_rdev *blocked_rdev;
        int plugged;
        int sectors_handled;
        int max_sectors;
  
        if (unlikely(bio->bi_rw & REQ_FLUSH)) {
                md_flush_request(mddev, bio);
-               return 0;
+               return;
        }
  
        /* If this request crosses a chunk boundary, we need to
                conf->nr_waiting++;
                spin_unlock_irq(&conf->resync_lock);
  
-               if (make_request(mddev, &bp->bio1))
-                       generic_make_request(&bp->bio1);
-               if (make_request(mddev, &bp->bio2))
-                       generic_make_request(&bp->bio2);
+               make_request(mddev, &bp->bio1);
+               make_request(mddev, &bp->bio2);
  
                spin_lock_irq(&conf->resync_lock);
                conf->nr_waiting--;
                spin_unlock_irq(&conf->resync_lock);
  
                bio_pair_release(bp);
-               return 0;
+               return;
        bad_map:
                printk("md/raid10:%s: make_request bug: can't convert block across chunks"
                       " or bigger than %dk %llu %d\n", mdname(mddev), chunk_sects/2,
                       (unsigned long long)bio->bi_sector, bio->bi_size >> 10);
  
                bio_io_error(bio);
-               return 0;
+               return;
        }
  
        md_write_start(mddev, bio);
@@@ -954,7 -940,7 +952,7 @@@ read_again
                slot = r10_bio->read_slot;
                if (disk < 0) {
                        raid_end_bio_io(r10_bio);
-                       return 0;
+                       return;
                }
                mirror = conf->mirrors + disk;
  
                        goto read_again;
                } else
                        generic_make_request(read_bio);
-               return 0;
+               return;
        }
  
        /*
         * WRITE:
         */
 +      if (conf->pending_count >= max_queued_requests) {
 +              md_wakeup_thread(mddev->thread);
 +              wait_event(conf->wait_barrier,
 +                         conf->pending_count < max_queued_requests);
 +      }
        /* first select target devices under rcu_lock and
         * inc refcount on their rdev.  Record them by setting
         * bios[x] to bio
@@@ -1034,7 -1015,7 +1032,7 @@@ retry_write
  
        for (i = 0;  i < conf->copies; i++) {
                int d = r10_bio->devs[i].devnum;
 -              mdk_rdev_t *rdev = rcu_dereference(conf->mirrors[d].rdev);
 +              struct md_rdev *rdev = rcu_dereference(conf->mirrors[d].rdev);
                if (rdev && unlikely(test_bit(Blocked, &rdev->flags))) {
                        atomic_inc(&rdev->nr_pending);
                        blocked_rdev = rdev;
                atomic_inc(&r10_bio->remaining);
                spin_lock_irqsave(&conf->device_lock, flags);
                bio_list_add(&conf->pending_bio_list, mbio);
 +              conf->pending_count++;
                spin_unlock_irqrestore(&conf->device_lock, flags);
        }
  
  
        if (do_sync || !mddev->bitmap || !plugged)
                md_wakeup_thread(mddev->thread);
-       return 0;
  }
  
 -static void status(struct seq_file *seq, mddev_t *mddev)
 +static void status(struct seq_file *seq, struct mddev *mddev)
  {
 -      conf_t *conf = mddev->private;
 +      struct r10conf *conf = mddev->private;
        int i;
  
        if (conf->near_copies < conf->raid_disks)
   * Don't consider the device numbered 'ignore'
   * as we might be about to remove it.
   */
 -static int enough(conf_t *conf, int ignore)
 +static int enough(struct r10conf *conf, int ignore)
  {
        int first = 0;
  
        return 1;
  }
  
 -static void error(mddev_t *mddev, mdk_rdev_t *rdev)
 +static void error(struct mddev *mddev, struct md_rdev *rdev)
  {
        char b[BDEVNAME_SIZE];
 -      conf_t *conf = mddev->private;
 +      struct r10conf *conf = mddev->private;
  
        /*
         * If it is not operational, then we have already marked it as dead
               mdname(mddev), conf->raid_disks - mddev->degraded);
  }
  
 -static void print_conf(conf_t *conf)
 +static void print_conf(struct r10conf *conf)
  {
        int i;
 -      mirror_info_t *tmp;
 +      struct mirror_info *tmp;
  
        printk(KERN_DEBUG "RAID10 conf printout:\n");
        if (!conf) {
        }
  }
  
 -static void close_sync(conf_t *conf)
 +static void close_sync(struct r10conf *conf)
  {
        wait_barrier(conf);
        allow_barrier(conf);
        conf->r10buf_pool = NULL;
  }
  
 -static int raid10_spare_active(mddev_t *mddev)
 +static int raid10_spare_active(struct mddev *mddev)
  {
        int i;
 -      conf_t *conf = mddev->private;
 -      mirror_info_t *tmp;
 +      struct r10conf *conf = mddev->private;
 +      struct mirror_info *tmp;
        int count = 0;
        unsigned long flags;
  
  }
  
  
 -static int raid10_add_disk(mddev_t *mddev, mdk_rdev_t *rdev)
 +static int raid10_add_disk(struct mddev *mddev, struct md_rdev *rdev)
  {
 -      conf_t *conf = mddev->private;
 +      struct r10conf *conf = mddev->private;
        int err = -EEXIST;
        int mirror;
        int first = 0;
        else
                mirror = first;
        for ( ; mirror <= last ; mirror++) {
 -              mirror_info_t *p = &conf->mirrors[mirror];
 +              struct mirror_info *p = &conf->mirrors[mirror];
                if (p->recovery_disabled == mddev->recovery_disabled)
                        continue;
 -              if (!p->rdev)
 +              if (p->rdev)
                        continue;
  
                disk_stack_limits(mddev->gendisk, rdev->bdev,
                }
  
                p->head_position = 0;
 +              p->recovery_disabled = mddev->recovery_disabled - 1;
                rdev->raid_disk = mirror;
                err = 0;
                if (rdev->saved_raid_disk != mirror)
        return err;
  }
  
 -static int raid10_remove_disk(mddev_t *mddev, int number)
 +static int raid10_remove_disk(struct mddev *mddev, int number)
  {
 -      conf_t *conf = mddev->private;
 +      struct r10conf *conf = mddev->private;
        int err = 0;
 -      mdk_rdev_t *rdev;
 -      mirror_info_t *p = conf->mirrors+ number;
 +      struct md_rdev *rdev;
 +      struct mirror_info *p = conf->mirrors+ number;
  
        print_conf(conf);
        rdev = p->rdev;
@@@ -1430,8 -1408,8 +1427,8 @@@ abort
  
  static void end_sync_read(struct bio *bio, int error)
  {
 -      r10bio_t *r10_bio = bio->bi_private;
 -      conf_t *conf = r10_bio->mddev->private;
 +      struct r10bio *r10_bio = bio->bi_private;
 +      struct r10conf *conf = r10_bio->mddev->private;
        int d;
  
        d = find_bio_disk(conf, r10_bio, bio, NULL);
        }
  }
  
 -static void end_sync_request(r10bio_t *r10_bio)
 +static void end_sync_request(struct r10bio *r10_bio)
  {
 -      mddev_t *mddev = r10_bio->mddev;
 +      struct mddev *mddev = r10_bio->mddev;
  
        while (atomic_dec_and_test(&r10_bio->remaining)) {
                if (r10_bio->master_bio == NULL) {
                        md_done_sync(mddev, s, 1);
                        break;
                } else {
 -                      r10bio_t *r10_bio2 = (r10bio_t *)r10_bio->master_bio;
 +                      struct r10bio *r10_bio2 = (struct r10bio *)r10_bio->master_bio;
                        if (test_bit(R10BIO_MadeGood, &r10_bio->state) ||
                            test_bit(R10BIO_WriteError, &r10_bio->state))
                                reschedule_retry(r10_bio);
  static void end_sync_write(struct bio *bio, int error)
  {
        int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags);
 -      r10bio_t *r10_bio = bio->bi_private;
 -      mddev_t *mddev = r10_bio->mddev;
 -      conf_t *conf = mddev->private;
 +      struct r10bio *r10_bio = bio->bi_private;
 +      struct mddev *mddev = r10_bio->mddev;
 +      struct r10conf *conf = mddev->private;
        int d;
        sector_t first_bad;
        int bad_sectors;
   * We check if all blocks are in-sync and only write to blocks that
   * aren't in sync
   */
 -static void sync_request_write(mddev_t *mddev, r10bio_t *r10_bio)
 +static void sync_request_write(struct mddev *mddev, struct r10bio *r10_bio)
  {
 -      conf_t *conf = mddev->private;
 +      struct r10conf *conf = mddev->private;
        int i, first;
        struct bio *tbio, *fbio;
  
@@@ -1628,7 -1606,7 +1625,7 @@@ done
   * The second for writing.
   *
   */
 -static void fix_recovery_read_error(r10bio_t *r10_bio)
 +static void fix_recovery_read_error(struct r10bio *r10_bio)
  {
        /* We got a read error during recovery.
         * We repeat the read in smaller page-sized sections.
         * If a read fails, record a bad block on both old and
         * new devices.
         */
 -      mddev_t *mddev = r10_bio->mddev;
 -      conf_t *conf = mddev->private;
 +      struct mddev *mddev = r10_bio->mddev;
 +      struct r10conf *conf = mddev->private;
        struct bio *bio = r10_bio->devs[0].bio;
        sector_t sect = 0;
        int sectors = r10_bio->sectors;
  
        while (sectors) {
                int s = sectors;
 -              mdk_rdev_t *rdev;
 +              struct md_rdev *rdev;
                sector_t addr;
                int ok;
  
  
                        if (rdev != conf->mirrors[dw].rdev) {
                                /* need bad block on destination too */
 -                              mdk_rdev_t *rdev2 = conf->mirrors[dw].rdev;
 +                              struct md_rdev *rdev2 = conf->mirrors[dw].rdev;
                                addr = r10_bio->devs[1].addr + sect;
                                ok = rdev_set_badblocks(rdev2, addr, s, 0);
                                if (!ok) {
        }
  }
  
 -static void recovery_request_write(mddev_t *mddev, r10bio_t *r10_bio)
 +static void recovery_request_write(struct mddev *mddev, struct r10bio *r10_bio)
  {
 -      conf_t *conf = mddev->private;
 +      struct r10conf *conf = mddev->private;
        int d;
        struct bio *wbio;
  
   * since the last recorded read error.
   *
   */
 -static void check_decay_read_errors(mddev_t *mddev, mdk_rdev_t *rdev)
 +static void check_decay_read_errors(struct mddev *mddev, struct md_rdev *rdev)
  {
        struct timespec cur_time_mon;
        unsigned long hours_since_last;
                atomic_set(&rdev->read_errors, read_errors >> hours_since_last);
  }
  
 -static int r10_sync_page_io(mdk_rdev_t *rdev, sector_t sector,
 +static int r10_sync_page_io(struct md_rdev *rdev, sector_t sector,
                            int sectors, struct page *page, int rw)
  {
        sector_t first_bad;
   *    3.      Performs writes following reads for array synchronising.
   */
  
 -static void fix_read_error(conf_t *conf, mddev_t *mddev, r10bio_t *r10_bio)
 +static void fix_read_error(struct r10conf *conf, struct mddev *mddev, struct r10bio *r10_bio)
  {
        int sect = 0; /* Offset from r10_bio->sector */
        int sectors = r10_bio->sectors;
 -      mdk_rdev_t*rdev;
 +      struct md_rdev*rdev;
        int max_read_errors = atomic_read(&mddev->max_corr_read_errors);
        int d = r10_bio->devs[r10_bio->read_slot].devnum;
  
@@@ -2002,12 -1980,12 +1999,12 @@@ static int submit_bio_wait(int rw, stru
        return test_bit(BIO_UPTODATE, &bio->bi_flags);
  }
  
 -static int narrow_write_error(r10bio_t *r10_bio, int i)
 +static int narrow_write_error(struct r10bio *r10_bio, int i)
  {
        struct bio *bio = r10_bio->master_bio;
 -      mddev_t *mddev = r10_bio->mddev;
 -      conf_t *conf = mddev->private;
 -      mdk_rdev_t *rdev = conf->mirrors[r10_bio->devs[i].devnum].rdev;
 +      struct mddev *mddev = r10_bio->mddev;
 +      struct r10conf *conf = mddev->private;
 +      struct md_rdev *rdev = conf->mirrors[r10_bio->devs[i].devnum].rdev;
        /* bio has the data to be written to slot 'i' where
         * we just recently had a write error.
         * We repeatedly clone the bio and trim down to one block,
        return ok;
  }
  
 -static void handle_read_error(mddev_t *mddev, r10bio_t *r10_bio)
 +static void handle_read_error(struct mddev *mddev, struct r10bio *r10_bio)
  {
        int slot = r10_bio->read_slot;
        int mirror = r10_bio->devs[slot].devnum;
        struct bio *bio;
 -      conf_t *conf = mddev->private;
 -      mdk_rdev_t *rdev;
 +      struct r10conf *conf = mddev->private;
 +      struct md_rdev *rdev;
        char b[BDEVNAME_SIZE];
        unsigned long do_sync;
        int max_sectors;
@@@ -2158,7 -2136,7 +2155,7 @@@ read_more
                generic_make_request(bio);
  }
  
 -static void handle_write_completed(conf_t *conf, r10bio_t *r10_bio)
 +static void handle_write_completed(struct r10conf *conf, struct r10bio *r10_bio)
  {
        /* Some sort of write request has finished and it
         * succeeded in writing where we thought there was a
         * a bad block.
         */
        int m;
 -      mdk_rdev_t *rdev;
 +      struct md_rdev *rdev;
  
        if (test_bit(R10BIO_IsSync, &r10_bio->state) ||
            test_bit(R10BIO_IsRecover, &r10_bio->state)) {
        }
  }
  
 -static void raid10d(mddev_t *mddev)
 +static void raid10d(struct mddev *mddev)
  {
 -      r10bio_t *r10_bio;
 +      struct r10bio *r10_bio;
        unsigned long flags;
 -      conf_t *conf = mddev->private;
 +      struct r10conf *conf = mddev->private;
        struct list_head *head = &conf->retry_list;
        struct blk_plug plug;
  
                        spin_unlock_irqrestore(&conf->device_lock, flags);
                        break;
                }
 -              r10_bio = list_entry(head->prev, r10bio_t, retry_list);
 +              r10_bio = list_entry(head->prev, struct r10bio, retry_list);
                list_del(head->prev);
                conf->nr_queued--;
                spin_unlock_irqrestore(&conf->device_lock, flags);
  }
  
  
 -static int init_resync(conf_t *conf)
 +static int init_resync(struct r10conf *conf)
  {
        int buffs;
  
   *
   */
  
 -static sector_t sync_request(mddev_t *mddev, sector_t sector_nr,
 +static sector_t sync_request(struct mddev *mddev, sector_t sector_nr,
                             int *skipped, int go_faster)
  {
 -      conf_t *conf = mddev->private;
 -      r10bio_t *r10_bio;
 +      struct r10conf *conf = mddev->private;
 +      struct r10bio *r10_bio;
        struct bio *biolist = NULL, *bio;
        sector_t max_sector, nr_sectors;
        int i;
  
                for (i=0 ; i<conf->raid_disks; i++) {
                        int still_degraded;
 -                      r10bio_t *rb2;
 +                      struct r10bio *rb2;
                        sector_t sect;
                        int must_sync;
                        int any_working;
                                int k;
                                int d = r10_bio->devs[j].devnum;
                                sector_t from_addr, to_addr;
 -                              mdk_rdev_t *rdev;
 +                              struct md_rdev *rdev;
                                sector_t sector, first_bad;
                                int bad_sectors;
                                if (!conf->mirrors[d].rdev ||
                }
                if (biolist == NULL) {
                        while (r10_bio) {
 -                              r10bio_t *rb2 = r10_bio;
 -                              r10_bio = (r10bio_t*) rb2->master_bio;
 +                              struct r10bio *rb2 = r10_bio;
 +                              r10_bio = (struct r10bio*) rb2->master_bio;
                                rb2->master_bio = NULL;
                                put_buf(rb2);
                        }
  }
  
  static sector_t
 -raid10_size(mddev_t *mddev, sector_t sectors, int raid_disks)
 +raid10_size(struct mddev *mddev, sector_t sectors, int raid_disks)
  {
        sector_t size;
 -      conf_t *conf = mddev->private;
 +      struct r10conf *conf = mddev->private;
  
        if (!raid_disks)
                raid_disks = conf->raid_disks;
  }
  
  
 -static conf_t *setup_conf(mddev_t *mddev)
 +static struct r10conf *setup_conf(struct mddev *mddev)
  {
 -      conf_t *conf = NULL;
 +      struct r10conf *conf = NULL;
        int nc, fc, fo;
        sector_t stride, size;
        int err = -EINVAL;
        }
  
        err = -ENOMEM;
 -      conf = kzalloc(sizeof(conf_t), GFP_KERNEL);
 +      conf = kzalloc(sizeof(struct r10conf), GFP_KERNEL);
        if (!conf)
                goto out;
  
        return ERR_PTR(err);
  }
  
 -static int run(mddev_t *mddev)
 +static int run(struct mddev *mddev)
  {
 -      conf_t *conf;
 +      struct r10conf *conf;
        int i, disk_idx, chunk_size;
 -      mirror_info_t *disk;
 -      mdk_rdev_t *rdev;
 +      struct mirror_info *disk;
 +      struct md_rdev *rdev;
        sector_t size;
  
        /*
                        if (disk->rdev)
                                conf->fullsync = 1;
                }
 +              disk->recovery_disabled = mddev->recovery_disabled - 1;
        }
  
        if (mddev->recovery_cp != MaxSector)
@@@ -2986,9 -2963,9 +2983,9 @@@ out
        return -EIO;
  }
  
 -static int stop(mddev_t *mddev)
 +static int stop(struct mddev *mddev)
  {
 -      conf_t *conf = mddev->private;
 +      struct r10conf *conf = mddev->private;
  
        raise_barrier(conf, 0);
        lower_barrier(conf);
        return 0;
  }
  
 -static void raid10_quiesce(mddev_t *mddev, int state)
 +static void raid10_quiesce(struct mddev *mddev, int state)
  {
 -      conf_t *conf = mddev->private;
 +      struct r10conf *conf = mddev->private;
  
        switch(state) {
        case 1:
        }
  }
  
 -static void *raid10_takeover_raid0(mddev_t *mddev)
 +static void *raid10_takeover_raid0(struct mddev *mddev)
  {
 -      mdk_rdev_t *rdev;
 -      conf_t *conf;
 +      struct md_rdev *rdev;
 +      struct r10conf *conf;
  
        if (mddev->degraded > 0) {
                printk(KERN_ERR "md/raid10:%s: Error: degraded raid0!\n",
        return conf;
  }
  
 -static void *raid10_takeover(mddev_t *mddev)
 +static void *raid10_takeover(struct mddev *mddev)
  {
 -      struct raid0_private_data *raid0_priv;
 +      struct r0conf *raid0_conf;
  
        /* raid10 can take over:
         *  raid0 - providing it has only two drives
         */
        if (mddev->level == 0) {
                /* for raid0 takeover only one zone is supported */
 -              raid0_priv = mddev->private;
 -              if (raid0_priv->nr_strip_zones > 1) {
 +              raid0_conf = mddev->private;
 +              if (raid0_conf->nr_strip_zones > 1) {
                        printk(KERN_ERR "md/raid10:%s: cannot takeover raid 0"
                               " with more than one zone.\n",
                               mdname(mddev));
        return ERR_PTR(-EINVAL);
  }
  
 -static struct mdk_personality raid10_personality =
 +static struct md_personality raid10_personality =
  {
        .name           = "raid10",
        .level          = 10,
@@@ -3106,5 -3083,3 +3103,5 @@@ MODULE_DESCRIPTION("RAID10 (striped mir
  MODULE_ALIAS("md-personality-9"); /* RAID10 */
  MODULE_ALIAS("md-raid10");
  MODULE_ALIAS("md-level-10");
 +
 +module_param(max_queued_requests, int, S_IRUGO|S_IWUSR);
diff --combined drivers/md/raid5.c
  #define NR_HASH                       (PAGE_SIZE / sizeof(struct hlist_head))
  #define HASH_MASK             (NR_HASH - 1)
  
 -#define stripe_hash(conf, sect)       (&((conf)->stripe_hashtbl[((sect) >> STRIPE_SHIFT) & HASH_MASK]))
 +static inline struct hlist_head *stripe_hash(struct r5conf *conf, sector_t sect)
 +{
 +      int hash = (sect >> STRIPE_SHIFT) & HASH_MASK;
 +      return &conf->stripe_hashtbl[hash];
 +}
  
  /* bio's attached to a stripe+device for I/O are linked together in bi_sector
   * order without overlap.  There may be several bio's per stripe+device, and
   * When walking this list for a particular stripe+device, we must never proceed
   * beyond a bio that extends past this device, as the next bio might no longer
   * be valid.
 - * This macro is used to determine the 'next' bio in the list, given the sector
 + * This function is used to determine the 'next' bio in the list, given the sector
   * of the current stripe+device
   */
 -#define r5_next_bio(bio, sect) ( ( (bio)->bi_sector + ((bio)->bi_size>>9) < sect + STRIPE_SECTORS) ? (bio)->bi_next : NULL)
 -/*
 - * The following can be used to debug the driver
 - */
 -#define RAID5_PARANOIA        1
 -#if RAID5_PARANOIA && defined(CONFIG_SMP)
 -# define CHECK_DEVLOCK() assert_spin_locked(&conf->device_lock)
 -#else
 -# define CHECK_DEVLOCK()
 -#endif
 -
 -#ifdef DEBUG
 -#define inline
 -#define __inline__
 -#endif
 +static inline struct bio *r5_next_bio(struct bio *bio, sector_t sector)
 +{
 +      int sectors = bio->bi_size >> 9;
 +      if (bio->bi_sector + sectors < sector + STRIPE_SECTORS)
 +              return bio->bi_next;
 +      else
 +              return NULL;
 +}
  
  /*
   * We maintain a biased count of active stripes in the bottom 16 bits of
@@@ -180,7 -183,7 +180,7 @@@ static void return_io(struct bio *retur
        }
  }
  
 -static void print_raid5_conf (raid5_conf_t *conf);
 +static void print_raid5_conf (struct r5conf *conf);
  
  static int stripe_operations_active(struct stripe_head *sh)
  {
               test_bit(STRIPE_COMPUTE_RUN, &sh->state);
  }
  
 -static void __release_stripe(raid5_conf_t *conf, struct stripe_head *sh)
 +static void __release_stripe(struct r5conf *conf, struct stripe_head *sh)
  {
        if (atomic_dec_and_test(&sh->count)) {
                BUG_ON(!list_empty(&sh->lru));
  
  static void release_stripe(struct stripe_head *sh)
  {
 -      raid5_conf_t *conf = sh->raid_conf;
 +      struct r5conf *conf = sh->raid_conf;
        unsigned long flags;
  
        spin_lock_irqsave(&conf->device_lock, flags);
@@@ -241,23 -244,25 +241,23 @@@ static inline void remove_hash(struct s
        hlist_del_init(&sh->hash);
  }
  
 -static inline void insert_hash(raid5_conf_t *conf, struct stripe_head *sh)
 +static inline void insert_hash(struct r5conf *conf, struct stripe_head *sh)
  {
        struct hlist_head *hp = stripe_hash(conf, sh->sector);
  
        pr_debug("insert_hash(), stripe %llu\n",
                (unsigned long long)sh->sector);
  
 -      CHECK_DEVLOCK();
        hlist_add_head(&sh->hash, hp);
  }
  
  
  /* find an idle stripe, make sure it is unhashed, and return it. */
 -static struct stripe_head *get_free_stripe(raid5_conf_t *conf)
 +static struct stripe_head *get_free_stripe(struct r5conf *conf)
  {
        struct stripe_head *sh = NULL;
        struct list_head *first;
  
 -      CHECK_DEVLOCK();
        if (list_empty(&conf->inactive_list))
                goto out;
        first = conf->inactive_list.next;
@@@ -301,18 -306,19 +301,18 @@@ static int grow_buffers(struct stripe_h
  }
  
  static void raid5_build_block(struct stripe_head *sh, int i, int previous);
 -static void stripe_set_idx(sector_t stripe, raid5_conf_t *conf, int previous,
 +static void stripe_set_idx(sector_t stripe, struct r5conf *conf, int previous,
                            struct stripe_head *sh);
  
  static void init_stripe(struct stripe_head *sh, sector_t sector, int previous)
  {
 -      raid5_conf_t *conf = sh->raid_conf;
 +      struct r5conf *conf = sh->raid_conf;
        int i;
  
        BUG_ON(atomic_read(&sh->count) != 0);
        BUG_ON(test_bit(STRIPE_HANDLE, &sh->state));
        BUG_ON(stripe_operations_active(sh));
  
 -      CHECK_DEVLOCK();
        pr_debug("init_stripe called, stripe %llu\n",
                (unsigned long long)sh->sector);
  
        insert_hash(conf, sh);
  }
  
 -static struct stripe_head *__find_stripe(raid5_conf_t *conf, sector_t sector,
 +static struct stripe_head *__find_stripe(struct r5conf *conf, sector_t sector,
                                         short generation)
  {
        struct stripe_head *sh;
        struct hlist_node *hn;
  
 -      CHECK_DEVLOCK();
        pr_debug("__find_stripe, sector %llu\n", (unsigned long long)sector);
        hlist_for_each_entry(sh, hn, stripe_hash(conf, sector), hash)
                if (sh->sector == sector && sh->generation == generation)
   * of the two sections, and some non-in_sync devices may
   * be insync in the section most affected by failed devices.
   */
 -static int has_failed(raid5_conf_t *conf)
 +static int has_failed(struct r5conf *conf)
  {
        int degraded;
        int i;
        rcu_read_lock();
        degraded = 0;
        for (i = 0; i < conf->previous_raid_disks; i++) {
 -              mdk_rdev_t *rdev = rcu_dereference(conf->disks[i].rdev);
 +              struct md_rdev *rdev = rcu_dereference(conf->disks[i].rdev);
                if (!rdev || test_bit(Faulty, &rdev->flags))
                        degraded++;
                else if (test_bit(In_sync, &rdev->flags))
        rcu_read_lock();
        degraded = 0;
        for (i = 0; i < conf->raid_disks; i++) {
 -              mdk_rdev_t *rdev = rcu_dereference(conf->disks[i].rdev);
 +              struct md_rdev *rdev = rcu_dereference(conf->disks[i].rdev);
                if (!rdev || test_bit(Faulty, &rdev->flags))
                        degraded++;
                else if (test_bit(In_sync, &rdev->flags))
  }
  
  static struct stripe_head *
 -get_active_stripe(raid5_conf_t *conf, sector_t sector,
 +get_active_stripe(struct r5conf *conf, sector_t sector,
                  int previous, int noblock, int noquiesce)
  {
        struct stripe_head *sh;
@@@ -484,7 -491,7 +484,7 @@@ raid5_end_write_request(struct bio *bi
  
  static void ops_run_io(struct stripe_head *sh, struct stripe_head_state *s)
  {
 -      raid5_conf_t *conf = sh->raid_conf;
 +      struct r5conf *conf = sh->raid_conf;
        int i, disks = sh->disks;
  
        might_sleep();
        for (i = disks; i--; ) {
                int rw;
                struct bio *bi;
 -              mdk_rdev_t *rdev;
 +              struct md_rdev *rdev;
                if (test_and_clear_bit(R5_Wantwrite, &sh->dev[i].flags)) {
                        if (test_and_clear_bit(R5_WantFUA, &sh->dev[i].flags))
                                rw = WRITE_FUA;
@@@ -643,7 -650,7 +643,7 @@@ static void ops_complete_biofill(void *
  {
        struct stripe_head *sh = stripe_head_ref;
        struct bio *return_bi = NULL;
 -      raid5_conf_t *conf = sh->raid_conf;
 +      struct r5conf *conf = sh->raid_conf;
        int i;
  
        pr_debug("%s: stripe %llu\n", __func__,
  static void ops_run_biofill(struct stripe_head *sh)
  {
        struct dma_async_tx_descriptor *tx = NULL;
 -      raid5_conf_t *conf = sh->raid_conf;
 +      struct r5conf *conf = sh->raid_conf;
        struct async_submit_ctl submit;
        int i;
  
@@@ -1239,7 -1246,7 +1239,7 @@@ static void __raid_run_ops(struct strip
  {
        int overlap_clear = 0, i, disks = sh->disks;
        struct dma_async_tx_descriptor *tx = NULL;
 -      raid5_conf_t *conf = sh->raid_conf;
 +      struct r5conf *conf = sh->raid_conf;
        int level = conf->level;
        struct raid5_percpu *percpu;
        unsigned long cpu;
@@@ -1330,7 -1337,7 +1330,7 @@@ static void raid_run_ops(struct stripe_
  #define raid_run_ops __raid_run_ops
  #endif
  
 -static int grow_one_stripe(raid5_conf_t *conf)
 +static int grow_one_stripe(struct r5conf *conf)
  {
        struct stripe_head *sh;
        sh = kmem_cache_zalloc(conf->slab_cache, GFP_KERNEL);
        return 1;
  }
  
 -static int grow_stripes(raid5_conf_t *conf, int num)
 +static int grow_stripes(struct r5conf *conf, int num)
  {
        struct kmem_cache *sc;
        int devs = max(conf->raid_disks, conf->previous_raid_disks);
@@@ -1404,7 -1411,7 +1404,7 @@@ static size_t scribble_len(int num
        return len;
  }
  
 -static int resize_stripes(raid5_conf_t *conf, int newsize)
 +static int resize_stripes(struct r5conf *conf, int newsize)
  {
        /* Make all the stripes able to hold 'newsize' devices.
         * New slots in each stripe get 'page' set to a new page.
        return err;
  }
  
 -static int drop_one_stripe(raid5_conf_t *conf)
 +static int drop_one_stripe(struct r5conf *conf)
  {
        struct stripe_head *sh;
  
        return 1;
  }
  
 -static void shrink_stripes(raid5_conf_t *conf)
 +static void shrink_stripes(struct r5conf *conf)
  {
        while (drop_one_stripe(conf))
                ;
  static void raid5_end_read_request(struct bio * bi, int error)
  {
        struct stripe_head *sh = bi->bi_private;
 -      raid5_conf_t *conf = sh->raid_conf;
 +      struct r5conf *conf = sh->raid_conf;
        int disks = sh->disks, i;
        int uptodate = test_bit(BIO_UPTODATE, &bi->bi_flags);
        char b[BDEVNAME_SIZE];
 -      mdk_rdev_t *rdev;
 +      struct md_rdev *rdev;
  
  
        for (i=0 ; i<disks; i++)
  static void raid5_end_write_request(struct bio *bi, int error)
  {
        struct stripe_head *sh = bi->bi_private;
 -      raid5_conf_t *conf = sh->raid_conf;
 +      struct r5conf *conf = sh->raid_conf;
        int disks = sh->disks, i;
        int uptodate = test_bit(BIO_UPTODATE, &bi->bi_flags);
        sector_t first_bad;
@@@ -1719,10 -1726,10 +1719,10 @@@ static void raid5_build_block(struct st
        dev->sector = compute_blocknr(sh, i, previous);
  }
  
 -static void error(mddev_t *mddev, mdk_rdev_t *rdev)
 +static void error(struct mddev *mddev, struct md_rdev *rdev)
  {
        char b[BDEVNAME_SIZE];
 -      raid5_conf_t *conf = mddev->private;
 +      struct r5conf *conf = mddev->private;
        pr_debug("raid456: error called\n");
  
        if (test_and_clear_bit(In_sync, &rdev->flags)) {
   * Input: a 'big' sector number,
   * Output: index of the data and parity disk, and the sector # in them.
   */
 -static sector_t raid5_compute_sector(raid5_conf_t *conf, sector_t r_sector,
 +static sector_t raid5_compute_sector(struct r5conf *conf, sector_t r_sector,
                                     int previous, int *dd_idx,
                                     struct stripe_head *sh)
  {
  
  static sector_t compute_blocknr(struct stripe_head *sh, int i, int previous)
  {
 -      raid5_conf_t *conf = sh->raid_conf;
 +      struct r5conf *conf = sh->raid_conf;
        int raid_disks = sh->disks;
        int data_disks = raid_disks - conf->max_degraded;
        sector_t new_sector = sh->sector, check;
@@@ -2081,7 -2088,7 +2081,7 @@@ schedule_reconstruction(struct stripe_h
                         int rcw, int expand)
  {
        int i, pd_idx = sh->pd_idx, disks = sh->disks;
 -      raid5_conf_t *conf = sh->raid_conf;
 +      struct r5conf *conf = sh->raid_conf;
        int level = conf->level;
  
        if (rcw) {
  static int add_stripe_bio(struct stripe_head *sh, struct bio *bi, int dd_idx, int forwrite)
  {
        struct bio **bip;
 -      raid5_conf_t *conf = sh->raid_conf;
 +      struct r5conf *conf = sh->raid_conf;
        int firstwrite=0;
  
        pr_debug("adding bi b#%llu to stripe s#%llu\n",
        return 0;
  }
  
 -static void end_reshape(raid5_conf_t *conf);
 +static void end_reshape(struct r5conf *conf);
  
 -static void stripe_set_idx(sector_t stripe, raid5_conf_t *conf, int previous,
 +static void stripe_set_idx(sector_t stripe, struct r5conf *conf, int previous,
                            struct stripe_head *sh)
  {
        int sectors_per_chunk =
  }
  
  static void
 -handle_failed_stripe(raid5_conf_t *conf, struct stripe_head *sh,
 +handle_failed_stripe(struct r5conf *conf, struct stripe_head *sh,
                                struct stripe_head_state *s, int disks,
                                struct bio **return_bi)
  {
                int bitmap_end = 0;
  
                if (test_bit(R5_ReadError, &sh->dev[i].flags)) {
 -                      mdk_rdev_t *rdev;
 +                      struct md_rdev *rdev;
                        rcu_read_lock();
                        rdev = rcu_dereference(conf->disks[i].rdev);
                        if (rdev && test_bit(In_sync, &rdev->flags))
  }
  
  static void
 -handle_failed_sync(raid5_conf_t *conf, struct stripe_head *sh,
 +handle_failed_sync(struct r5conf *conf, struct stripe_head *sh,
                   struct stripe_head_state *s)
  {
        int abort = 0;
         * refcounting of rdevs is not needed
         */
        for (i = 0; i < conf->raid_disks; i++) {
 -              mdk_rdev_t *rdev = conf->disks[i].rdev;
 +              struct md_rdev *rdev = conf->disks[i].rdev;
                if (!rdev
                    || test_bit(Faulty, &rdev->flags)
                    || test_bit(In_sync, &rdev->flags))
@@@ -2501,7 -2508,7 +2501,7 @@@ static void handle_stripe_fill(struct s
   * Note that if we 'wrote' to a failed drive, it will be UPTODATE, but
   * never LOCKED, so we don't need to test 'failed' directly.
   */
 -static void handle_stripe_clean_event(raid5_conf_t *conf,
 +static void handle_stripe_clean_event(struct r5conf *conf,
        struct stripe_head *sh, int disks, struct bio **return_bi)
  {
        int i;
                        md_wakeup_thread(conf->mddev->thread);
  }
  
 -static void handle_stripe_dirtying(raid5_conf_t *conf,
 +static void handle_stripe_dirtying(struct r5conf *conf,
                                   struct stripe_head *sh,
                                   struct stripe_head_state *s,
                                   int disks)
                schedule_reconstruction(sh, s, rcw == 0, 0);
  }
  
 -static void handle_parity_checks5(raid5_conf_t *conf, struct stripe_head *sh,
 +static void handle_parity_checks5(struct r5conf *conf, struct stripe_head *sh,
                                struct stripe_head_state *s, int disks)
  {
        struct r5dev *dev = NULL;
  }
  
  
 -static void handle_parity_checks6(raid5_conf_t *conf, struct stripe_head *sh,
 +static void handle_parity_checks6(struct r5conf *conf, struct stripe_head *sh,
                                  struct stripe_head_state *s,
                                  int disks)
  {
        }
  }
  
 -static void handle_stripe_expansion(raid5_conf_t *conf, struct stripe_head *sh)
 +static void handle_stripe_expansion(struct r5conf *conf, struct stripe_head *sh)
  {
        int i;
  
  
  static void analyse_stripe(struct stripe_head *sh, struct stripe_head_state *s)
  {
 -      raid5_conf_t *conf = sh->raid_conf;
 +      struct r5conf *conf = sh->raid_conf;
        int disks = sh->disks;
        struct r5dev *dev;
        int i;
        rcu_read_lock();
        spin_lock_irq(&conf->device_lock);
        for (i=disks; i--; ) {
 -              mdk_rdev_t *rdev;
 +              struct md_rdev *rdev;
                sector_t first_bad;
                int bad_sectors;
                int is_bad = 0;
                        }
                } else if (test_bit(In_sync, &rdev->flags))
                        set_bit(R5_Insync, &dev->flags);
 -              else {
 +              else if (!test_bit(Faulty, &rdev->flags)) {
                        /* in sync if before recovery_offset */
                        if (sh->sector + STRIPE_SECTORS <= rdev->recovery_offset)
                                set_bit(R5_Insync, &dev->flags);
  static void handle_stripe(struct stripe_head *sh)
  {
        struct stripe_head_state s;
 -      raid5_conf_t *conf = sh->raid_conf;
 +      struct r5conf *conf = sh->raid_conf;
        int i;
        int prexor;
        int disks = sh->disks;
@@@ -3334,7 -3341,7 +3334,7 @@@ finish
  
        if (s.handle_bad_blocks)
                for (i = disks; i--; ) {
 -                      mdk_rdev_t *rdev;
 +                      struct md_rdev *rdev;
                        struct r5dev *dev = &sh->dev[i];
                        if (test_and_clear_bit(R5_WriteError, &dev->flags)) {
                                /* We own a safe reference to the rdev */
        clear_bit(STRIPE_ACTIVE, &sh->state);
  }
  
 -static void raid5_activate_delayed(raid5_conf_t *conf)
 +static void raid5_activate_delayed(struct r5conf *conf)
  {
        if (atomic_read(&conf->preread_active_stripes) < IO_THRESHOLD) {
                while (!list_empty(&conf->delayed_list)) {
        }
  }
  
 -static void activate_bit_delay(raid5_conf_t *conf)
 +static void activate_bit_delay(struct r5conf *conf)
  {
        /* device_lock is held */
        struct list_head head;
        }
  }
  
 -int md_raid5_congested(mddev_t *mddev, int bits)
 +int md_raid5_congested(struct mddev *mddev, int bits)
  {
 -      raid5_conf_t *conf = mddev->private;
 +      struct r5conf *conf = mddev->private;
  
        /* No difference between reads and writes.  Just check
         * how busy the stripe_cache is
@@@ -3424,7 -3431,7 +3424,7 @@@ EXPORT_SYMBOL_GPL(md_raid5_congested)
  
  static int raid5_congested(void *data, int bits)
  {
 -      mddev_t *mddev = data;
 +      struct mddev *mddev = data;
  
        return mddev_congested(mddev, bits) ||
                md_raid5_congested(mddev, bits);
@@@ -3437,7 -3444,7 +3437,7 @@@ static int raid5_mergeable_bvec(struct 
                                struct bvec_merge_data *bvm,
                                struct bio_vec *biovec)
  {
 -      mddev_t *mddev = q->queuedata;
 +      struct mddev *mddev = q->queuedata;
        sector_t sector = bvm->bi_sector + get_start_sect(bvm->bi_bdev);
        int max;
        unsigned int chunk_sectors = mddev->chunk_sectors;
  }
  
  
 -static int in_chunk_boundary(mddev_t *mddev, struct bio *bio)
 +static int in_chunk_boundary(struct mddev *mddev, struct bio *bio)
  {
        sector_t sector = bio->bi_sector + get_start_sect(bio->bi_bdev);
        unsigned int chunk_sectors = mddev->chunk_sectors;
   *  add bio to the retry LIFO  ( in O(1) ... we are in interrupt )
   *  later sampled by raid5d.
   */
 -static void add_bio_to_retry(struct bio *bi,raid5_conf_t *conf)
 +static void add_bio_to_retry(struct bio *bi,struct r5conf *conf)
  {
        unsigned long flags;
  
  }
  
  
 -static struct bio *remove_bio_from_retry(raid5_conf_t *conf)
 +static struct bio *remove_bio_from_retry(struct r5conf *conf)
  {
        struct bio *bi;
  
  static void raid5_align_endio(struct bio *bi, int error)
  {
        struct bio* raid_bi  = bi->bi_private;
 -      mddev_t *mddev;
 -      raid5_conf_t *conf;
 +      struct mddev *mddev;
 +      struct r5conf *conf;
        int uptodate = test_bit(BIO_UPTODATE, &bi->bi_flags);
 -      mdk_rdev_t *rdev;
 +      struct md_rdev *rdev;
  
        bio_put(bi);
  
@@@ -3567,12 -3574,12 +3567,12 @@@ static int bio_fits_rdev(struct bio *bi
  }
  
  
 -static int chunk_aligned_read(mddev_t *mddev, struct bio * raid_bio)
 +static int chunk_aligned_read(struct mddev *mddev, struct bio * raid_bio)
  {
 -      raid5_conf_t *conf = mddev->private;
 +      struct r5conf *conf = mddev->private;
        int dd_idx;
        struct bio* align_bi;
 -      mdk_rdev_t *rdev;
 +      struct md_rdev *rdev;
  
        if (!in_chunk_boundary(mddev, raid_bio)) {
                pr_debug("chunk_aligned_read : non aligned\n");
   * head of the hold_list has changed, i.e. the head was promoted to the
   * handle_list.
   */
 -static struct stripe_head *__get_priority_stripe(raid5_conf_t *conf)
 +static struct stripe_head *__get_priority_stripe(struct r5conf *conf)
  {
        struct stripe_head *sh;
  
        return sh;
  }
  
- static int make_request(struct mddev *mddev, struct bio * bi)
 -static void make_request(mddev_t *mddev, struct bio * bi)
++static void make_request(struct mddev *mddev, struct bio * bi)
  {
 -      raid5_conf_t *conf = mddev->private;
 +      struct r5conf *conf = mddev->private;
        int dd_idx;
        sector_t new_sector;
        sector_t logical_sector, last_sector;
  
        if (unlikely(bi->bi_rw & REQ_FLUSH)) {
                md_flush_request(mddev, bi);
-               return 0;
+               return;
        }
  
        md_write_start(mddev, bi);
        if (rw == READ &&
             mddev->reshape_position == MaxSector &&
             chunk_aligned_read(mddev,bi))
-               return 0;
+               return;
  
        logical_sector = bi->bi_sector & ~((sector_t)STRIPE_SECTORS-1);
        last_sector = bi->bi_sector + (bi->bi_size>>9);
  
                bio_endio(bi, 0);
        }
-       return 0;
  }
  
 -static sector_t raid5_size(mddev_t *mddev, sector_t sectors, int raid_disks);
 +static sector_t raid5_size(struct mddev *mddev, sector_t sectors, int raid_disks);
  
 -static sector_t reshape_request(mddev_t *mddev, sector_t sector_nr, int *skipped)
 +static sector_t reshape_request(struct mddev *mddev, sector_t sector_nr, int *skipped)
  {
        /* reshaping is quite different to recovery/resync so it is
         * handled quite separately ... here.
         * As the reads complete, handle_stripe will copy the data
         * into the destination stripe and release that stripe.
         */
 -      raid5_conf_t *conf = mddev->private;
 +      struct r5conf *conf = mddev->private;
        struct stripe_head *sh;
        sector_t first_sector, last_sector;
        int raid_disks = conf->previous_raid_disks;
  }
  
  /* FIXME go_faster isn't used */
 -static inline sector_t sync_request(mddev_t *mddev, sector_t sector_nr, int *skipped, int go_faster)
 +static inline sector_t sync_request(struct mddev *mddev, sector_t sector_nr, int *skipped, int go_faster)
  {
 -      raid5_conf_t *conf = mddev->private;
 +      struct r5conf *conf = mddev->private;
        struct stripe_head *sh;
        sector_t max_sector = mddev->dev_sectors;
        sector_t sync_blocks;
        return STRIPE_SECTORS;
  }
  
 -static int  retry_aligned_read(raid5_conf_t *conf, struct bio *raid_bio)
 +static int  retry_aligned_read(struct r5conf *conf, struct bio *raid_bio)
  {
        /* We may not be able to submit a whole bio at once as there
         * may not be enough stripe_heads available.
   * During the scan, completed stripes are saved for us by the interrupt
   * handler, so that they will not have to wait for our next wakeup.
   */
 -static void raid5d(mddev_t *mddev)
 +static void raid5d(struct mddev *mddev)
  {
        struct stripe_head *sh;
 -      raid5_conf_t *conf = mddev->private;
 +      struct r5conf *conf = mddev->private;
        int handled;
        struct blk_plug plug;
  
  }
  
  static ssize_t
 -raid5_show_stripe_cache_size(mddev_t *mddev, char *page)
 +raid5_show_stripe_cache_size(struct mddev *mddev, char *page)
  {
 -      raid5_conf_t *conf = mddev->private;
 +      struct r5conf *conf = mddev->private;
        if (conf)
                return sprintf(page, "%d\n", conf->max_nr_stripes);
        else
  }
  
  int
 -raid5_set_cache_size(mddev_t *mddev, int size)
 +raid5_set_cache_size(struct mddev *mddev, int size)
  {
 -      raid5_conf_t *conf = mddev->private;
 +      struct r5conf *conf = mddev->private;
        int err;
  
        if (size <= 16 || size > 32768)
  EXPORT_SYMBOL(raid5_set_cache_size);
  
  static ssize_t
 -raid5_store_stripe_cache_size(mddev_t *mddev, const char *page, size_t len)
 +raid5_store_stripe_cache_size(struct mddev *mddev, const char *page, size_t len)
  {
 -      raid5_conf_t *conf = mddev->private;
 +      struct r5conf *conf = mddev->private;
        unsigned long new;
        int err;
  
@@@ -4355,9 -4360,9 +4353,9 @@@ raid5_stripecache_size = __ATTR(stripe_
                                raid5_store_stripe_cache_size);
  
  static ssize_t
 -raid5_show_preread_threshold(mddev_t *mddev, char *page)
 +raid5_show_preread_threshold(struct mddev *mddev, char *page)
  {
 -      raid5_conf_t *conf = mddev->private;
 +      struct r5conf *conf = mddev->private;
        if (conf)
                return sprintf(page, "%d\n", conf->bypass_threshold);
        else
  }
  
  static ssize_t
 -raid5_store_preread_threshold(mddev_t *mddev, const char *page, size_t len)
 +raid5_store_preread_threshold(struct mddev *mddev, const char *page, size_t len)
  {
 -      raid5_conf_t *conf = mddev->private;
 +      struct r5conf *conf = mddev->private;
        unsigned long new;
        if (len >= PAGE_SIZE)
                return -EINVAL;
@@@ -4389,9 -4394,9 +4387,9 @@@ raid5_preread_bypass_threshold = __ATTR
                                        raid5_store_preread_threshold);
  
  static ssize_t
 -stripe_cache_active_show(mddev_t *mddev, char *page)
 +stripe_cache_active_show(struct mddev *mddev, char *page)
  {
 -      raid5_conf_t *conf = mddev->private;
 +      struct r5conf *conf = mddev->private;
        if (conf)
                return sprintf(page, "%d\n", atomic_read(&conf->active_stripes));
        else
@@@ -4413,9 -4418,9 +4411,9 @@@ static struct attribute_group raid5_att
  };
  
  static sector_t
 -raid5_size(mddev_t *mddev, sector_t sectors, int raid_disks)
 +raid5_size(struct mddev *mddev, sector_t sectors, int raid_disks)
  {
 -      raid5_conf_t *conf = mddev->private;
 +      struct r5conf *conf = mddev->private;
  
        if (!sectors)
                sectors = mddev->dev_sectors;
        return sectors * (raid_disks - conf->max_degraded);
  }
  
 -static void raid5_free_percpu(raid5_conf_t *conf)
 +static void raid5_free_percpu(struct r5conf *conf)
  {
        struct raid5_percpu *percpu;
        unsigned long cpu;
        free_percpu(conf->percpu);
  }
  
 -static void free_conf(raid5_conf_t *conf)
 +static void free_conf(struct r5conf *conf)
  {
        shrink_stripes(conf);
        raid5_free_percpu(conf);
  static int raid456_cpu_notify(struct notifier_block *nfb, unsigned long action,
                              void *hcpu)
  {
 -      raid5_conf_t *conf = container_of(nfb, raid5_conf_t, cpu_notify);
 +      struct r5conf *conf = container_of(nfb, struct r5conf, cpu_notify);
        long cpu = (long)hcpu;
        struct raid5_percpu *percpu = per_cpu_ptr(conf->percpu, cpu);
  
  }
  #endif
  
 -static int raid5_alloc_percpu(raid5_conf_t *conf)
 +static int raid5_alloc_percpu(struct r5conf *conf)
  {
        unsigned long cpu;
        struct page *spare_page;
        return err;
  }
  
 -static raid5_conf_t *setup_conf(mddev_t *mddev)
 +static struct r5conf *setup_conf(struct mddev *mddev)
  {
 -      raid5_conf_t *conf;
 +      struct r5conf *conf;
        int raid_disk, memory, max_disks;
 -      mdk_rdev_t *rdev;
 +      struct md_rdev *rdev;
        struct disk_info *disk;
  
        if (mddev->new_level != 5
                return ERR_PTR(-EINVAL);
        }
  
 -      conf = kzalloc(sizeof(raid5_conf_t), GFP_KERNEL);
 +      conf = kzalloc(sizeof(struct r5conf), GFP_KERNEL);
        if (conf == NULL)
                goto abort;
        spin_lock_init(&conf->device_lock);
        atomic_set(&conf->preread_active_stripes, 0);
        atomic_set(&conf->active_aligned_reads, 0);
        conf->bypass_threshold = BYPASS_THRESHOLD;
 +      conf->recovery_disabled = mddev->recovery_disabled - 1;
  
        conf->raid_disks = mddev->raid_disks;
        if (mddev->reshape_position == MaxSector)
@@@ -4706,12 -4710,12 +4704,12 @@@ static int only_parity(int raid_disk, i
        return 0;
  }
  
 -static int run(mddev_t *mddev)
 +static int run(struct mddev *mddev)
  {
 -      raid5_conf_t *conf;
 +      struct r5conf *conf;
        int working_disks = 0;
        int dirty_parity_disks = 0;
 -      mdk_rdev_t *rdev;
 +      struct md_rdev *rdev;
        sector_t reshape_offset = 0;
  
        if (mddev->recovery_cp != MaxSector)
        return 0;
  abort:
        md_unregister_thread(&mddev->thread);
 -      if (conf) {
 -              print_raid5_conf(conf);
 -              free_conf(conf);
 -      }
 +      print_raid5_conf(conf);
 +      free_conf(conf);
        mddev->private = NULL;
        printk(KERN_ALERT "md/raid:%s: failed to run raid set.\n", mdname(mddev));
        return -EIO;
  }
  
 -static int stop(mddev_t *mddev)
 +static int stop(struct mddev *mddev)
  {
 -      raid5_conf_t *conf = mddev->private;
 +      struct r5conf *conf = mddev->private;
  
        md_unregister_thread(&mddev->thread);
        if (mddev->queue)
        return 0;
  }
  
 -#ifdef DEBUG
 -static void print_sh(struct seq_file *seq, struct stripe_head *sh)
 -{
 -      int i;
 -
 -      seq_printf(seq, "sh %llu, pd_idx %d, state %ld.\n",
 -                 (unsigned long long)sh->sector, sh->pd_idx, sh->state);
 -      seq_printf(seq, "sh %llu,  count %d.\n",
 -                 (unsigned long long)sh->sector, atomic_read(&sh->count));
 -      seq_printf(seq, "sh %llu, ", (unsigned long long)sh->sector);
 -      for (i = 0; i < sh->disks; i++) {
 -              seq_printf(seq, "(cache%d: %p %ld) ",
 -                         i, sh->dev[i].page, sh->dev[i].flags);
 -      }
 -      seq_printf(seq, "\n");
 -}
 -
 -static void printall(struct seq_file *seq, raid5_conf_t *conf)
 +static void status(struct seq_file *seq, struct mddev *mddev)
  {
 -      struct stripe_head *sh;
 -      struct hlist_node *hn;
 -      int i;
 -
 -      spin_lock_irq(&conf->device_lock);
 -      for (i = 0; i < NR_HASH; i++) {
 -              hlist_for_each_entry(sh, hn, &conf->stripe_hashtbl[i], hash) {
 -                      if (sh->raid_conf != conf)
 -                              continue;
 -                      print_sh(seq, sh);
 -              }
 -      }
 -      spin_unlock_irq(&conf->device_lock);
 -}
 -#endif
 -
 -static void status(struct seq_file *seq, mddev_t *mddev)
 -{
 -      raid5_conf_t *conf = mddev->private;
 +      struct r5conf *conf = mddev->private;
        int i;
  
        seq_printf(seq, " level %d, %dk chunk, algorithm %d", mddev->level,
                               conf->disks[i].rdev &&
                               test_bit(In_sync, &conf->disks[i].rdev->flags) ? "U" : "_");
        seq_printf (seq, "]");
 -#ifdef DEBUG
 -      seq_printf (seq, "\n");
 -      printall(seq, conf);
 -#endif
  }
  
 -static void print_raid5_conf (raid5_conf_t *conf)
 +static void print_raid5_conf (struct r5conf *conf)
  {
        int i;
        struct disk_info *tmp;
        }
  }
  
 -static int raid5_spare_active(mddev_t *mddev)
 +static int raid5_spare_active(struct mddev *mddev)
  {
        int i;
 -      raid5_conf_t *conf = mddev->private;
 +      struct r5conf *conf = mddev->private;
        struct disk_info *tmp;
        int count = 0;
        unsigned long flags;
        return count;
  }
  
 -static int raid5_remove_disk(mddev_t *mddev, int number)
 +static int raid5_remove_disk(struct mddev *mddev, int number)
  {
 -      raid5_conf_t *conf = mddev->private;
 +      struct r5conf *conf = mddev->private;
        int err = 0;
 -      mdk_rdev_t *rdev;
 +      struct md_rdev *rdev;
        struct disk_info *p = conf->disks + number;
  
        print_raid5_conf(conf);
@@@ -5063,9 -5108,9 +5061,9 @@@ abort
        return err;
  }
  
 -static int raid5_add_disk(mddev_t *mddev, mdk_rdev_t *rdev)
 +static int raid5_add_disk(struct mddev *mddev, struct md_rdev *rdev)
  {
 -      raid5_conf_t *conf = mddev->private;
 +      struct r5conf *conf = mddev->private;
        int err = -EEXIST;
        int disk;
        struct disk_info *p;
        return err;
  }
  
 -static int raid5_resize(mddev_t *mddev, sector_t sectors)
 +static int raid5_resize(struct mddev *mddev, sector_t sectors)
  {
        /* no resync is happening, and there is enough space
         * on all devices, so we can resize.
        return 0;
  }
  
 -static int check_stripe_cache(mddev_t *mddev)
 +static int check_stripe_cache(struct mddev *mddev)
  {
        /* Can only proceed if there are plenty of stripe_heads.
         * We need a minimum of one full stripe,, and for sensible progress
         * If the chunk size is greater, user-space should request more
         * stripe_heads first.
         */
 -      raid5_conf_t *conf = mddev->private;
 +      struct r5conf *conf = mddev->private;
        if (((mddev->chunk_sectors << 9) / STRIPE_SIZE) * 4
            > conf->max_nr_stripes ||
            ((mddev->new_chunk_sectors << 9) / STRIPE_SIZE) * 4
        return 1;
  }
  
 -static int check_reshape(mddev_t *mddev)
 +static int check_reshape(struct mddev *mddev)
  {
 -      raid5_conf_t *conf = mddev->private;
 +      struct r5conf *conf = mddev->private;
  
        if (mddev->delta_disks == 0 &&
            mddev->new_layout == mddev->layout &&
        return resize_stripes(conf, conf->raid_disks + mddev->delta_disks);
  }
  
 -static int raid5_start_reshape(mddev_t *mddev)
 +static int raid5_start_reshape(struct mddev *mddev)
  {
 -      raid5_conf_t *conf = mddev->private;
 -      mdk_rdev_t *rdev;
 +      struct r5conf *conf = mddev->private;
 +      struct md_rdev *rdev;
        int spares = 0;
        unsigned long flags;
  
  /* This is called from the reshape thread and should make any
   * changes needed in 'conf'
   */
 -static void end_reshape(raid5_conf_t *conf)
 +static void end_reshape(struct r5conf *conf)
  {
  
        if (!test_bit(MD_RECOVERY_INTR, &conf->mddev->recovery)) {
  /* This is called from the raid5d thread with mddev_lock held.
   * It makes config changes to the device.
   */
 -static void raid5_finish_reshape(mddev_t *mddev)
 +static void raid5_finish_reshape(struct mddev *mddev)
  {
 -      raid5_conf_t *conf = mddev->private;
 +      struct r5conf *conf = mddev->private;
  
        if (!test_bit(MD_RECOVERY_INTR, &mddev->recovery)) {
  
                        for (d = conf->raid_disks ;
                             d < conf->raid_disks - mddev->delta_disks;
                             d++) {
 -                              mdk_rdev_t *rdev = conf->disks[d].rdev;
 +                              struct md_rdev *rdev = conf->disks[d].rdev;
                                if (rdev && raid5_remove_disk(mddev, d) == 0) {
                                        sysfs_unlink_rdev(mddev, rdev);
                                        rdev->raid_disk = -1;
        }
  }
  
 -static void raid5_quiesce(mddev_t *mddev, int state)
 +static void raid5_quiesce(struct mddev *mddev, int state)
  {
 -      raid5_conf_t *conf = mddev->private;
 +      struct r5conf *conf = mddev->private;
  
        switch(state) {
        case 2: /* resume for a suspend */
  }
  
  
 -static void *raid45_takeover_raid0(mddev_t *mddev, int level)
 +static void *raid45_takeover_raid0(struct mddev *mddev, int level)
  {
 -      struct raid0_private_data *raid0_priv = mddev->private;
 +      struct r0conf *raid0_conf = mddev->private;
        sector_t sectors;
  
        /* for raid0 takeover only one zone is supported */
 -      if (raid0_priv->nr_strip_zones > 1) {
 +      if (raid0_conf->nr_strip_zones > 1) {
                printk(KERN_ERR "md/raid:%s: cannot takeover raid0 with more than one zone.\n",
                       mdname(mddev));
                return ERR_PTR(-EINVAL);
        }
  
 -      sectors = raid0_priv->strip_zone[0].zone_end;
 -      sector_div(sectors, raid0_priv->strip_zone[0].nb_dev);
 +      sectors = raid0_conf->strip_zone[0].zone_end;
 +      sector_div(sectors, raid0_conf->strip_zone[0].nb_dev);
        mddev->dev_sectors = sectors;
        mddev->new_level = level;
        mddev->new_layout = ALGORITHM_PARITY_N;
  }
  
  
 -static void *raid5_takeover_raid1(mddev_t *mddev)
 +static void *raid5_takeover_raid1(struct mddev *mddev)
  {
        int chunksect;
  
        return setup_conf(mddev);
  }
  
 -static void *raid5_takeover_raid6(mddev_t *mddev)
 +static void *raid5_takeover_raid6(struct mddev *mddev)
  {
        int new_layout;
  
  }
  
  
 -static int raid5_check_reshape(mddev_t *mddev)
 +static int raid5_check_reshape(struct mddev *mddev)
  {
        /* For a 2-drive array, the layout and chunk size can be changed
         * immediately as not restriping is needed.
         * For larger arrays we record the new value - after validation
         * to be used by a reshape pass.
         */
 -      raid5_conf_t *conf = mddev->private;
 +      struct r5conf *conf = mddev->private;
        int new_chunk = mddev->new_chunk_sectors;
  
        if (mddev->new_layout >= 0 && !algorithm_valid_raid5(mddev->new_layout))
        return check_reshape(mddev);
  }
  
 -static int raid6_check_reshape(mddev_t *mddev)
 +static int raid6_check_reshape(struct mddev *mddev)
  {
        int new_chunk = mddev->new_chunk_sectors;
  
        return check_reshape(mddev);
  }
  
 -static void *raid5_takeover(mddev_t *mddev)
 +static void *raid5_takeover(struct mddev *mddev)
  {
        /* raid5 can take over:
         *  raid0 - if there is only one strip zone - make it a raid4 layout
        return ERR_PTR(-EINVAL);
  }
  
 -static void *raid4_takeover(mddev_t *mddev)
 +static void *raid4_takeover(struct mddev *mddev)
  {
        /* raid4 can take over:
         *  raid0 - if there is only one strip zone
        return ERR_PTR(-EINVAL);
  }
  
 -static struct mdk_personality raid5_personality;
 +static struct md_personality raid5_personality;
  
 -static void *raid6_takeover(mddev_t *mddev)
 +static void *raid6_takeover(struct mddev *mddev)
  {
        /* Currently can only take over a raid5.  We map the
         * personality to an equivalent raid6 personality
  }
  
  
 -static struct mdk_personality raid6_personality =
 +static struct md_personality raid6_personality =
  {
        .name           = "raid6",
        .level          = 6,
        .quiesce        = raid5_quiesce,
        .takeover       = raid6_takeover,
  };
 -static struct mdk_personality raid5_personality =
 +static struct md_personality raid5_personality =
  {
        .name           = "raid5",
        .level          = 5,
        .takeover       = raid5_takeover,
  };
  
 -static struct mdk_personality raid4_personality =
 +static struct md_personality raid4_personality =
  {
        .name           = "raid4",
        .level          = 4,
  
  /* Globals */
  static int zram_major;
 -struct zram *devices;
 +struct zram *zram_devices;
  
  /* Module params (documentation at end) */
 -unsigned int num_devices;
 +unsigned int zram_num_devices;
  
  static void zram_stat_inc(u32 *v)
  {
@@@ -556,38 -556,29 +556,37 @@@ static inline int valid_io_request(stru
  /*
   * Handler function for all zram I/O requests.
   */
- static int zram_make_request(struct request_queue *queue, struct bio *bio)
+ static void zram_make_request(struct request_queue *queue, struct bio *bio)
  {
        struct zram *zram = queue->queuedata;
  
 +      if (unlikely(!zram->init_done) && zram_init_device(zram))
 +              goto error;
 +
 +      down_read(&zram->init_lock);
 +      if (unlikely(!zram->init_done))
 +              goto error_unlock;
 +
        if (!valid_io_request(zram, bio)) {
                zram_stat64_inc(zram, &zram->stats.invalid_io);
 -              bio_io_error(bio);
 -              return;
 -      }
 -
 -      if (unlikely(!zram->init_done) && zram_init_device(zram)) {
 -              bio_io_error(bio);
 -              return;
 +              goto error_unlock;
        }
  
        __zram_make_request(zram, bio, bio_data_dir(bio));
-       return 0;
 +      up_read(&zram->init_lock);
 +
-       return 0;
++      return;
 +
 +error_unlock:
 +      up_read(&zram->init_lock);
 +error:
 +      bio_io_error(bio);
  }
  
 -void zram_reset_device(struct zram *zram)
 +void __zram_reset_device(struct zram *zram)
  {
        size_t index;
  
 -      mutex_lock(&zram->init_lock);
        zram->init_done = 0;
  
        /* Free various per-device buffers */
        memset(&zram->stats, 0, sizeof(zram->stats));
  
        zram->disksize = 0;
 -      mutex_unlock(&zram->init_lock);
 +}
 +
 +void zram_reset_device(struct zram *zram)
 +{
 +      down_write(&zram->init_lock);
 +      __zram_reset_device(zram);
 +      up_write(&zram->init_lock);
  }
  
  int zram_init_device(struct zram *zram)
        int ret;
        size_t num_pages;
  
 -      mutex_lock(&zram->init_lock);
 +      down_write(&zram->init_lock);
  
        if (zram->init_done) {
 -              mutex_unlock(&zram->init_lock);
 +              up_write(&zram->init_lock);
                return 0;
        }
  
        if (!zram->compress_workmem) {
                pr_err("Error allocating compressor working memory!\n");
                ret = -ENOMEM;
 -              goto fail;
 +              goto fail_no_table;
        }
  
        zram->compress_buffer = (void *)__get_free_pages(__GFP_ZERO, 1);
        if (!zram->compress_buffer) {
                pr_err("Error allocating compressor buffer space\n");
                ret = -ENOMEM;
 -              goto fail;
 +              goto fail_no_table;
        }
  
        num_pages = zram->disksize >> PAGE_SHIFT;
        zram->table = vzalloc(num_pages * sizeof(*zram->table));
        if (!zram->table) {
                pr_err("Error allocating zram address table\n");
 -              /* To prevent accessing table entries during cleanup */
 -              zram->disksize = 0;
                ret = -ENOMEM;
 -              goto fail;
 +              goto fail_no_table;
        }
  
        set_capacity(zram->disk, zram->disksize >> SECTOR_SHIFT);
        }
  
        zram->init_done = 1;
 -      mutex_unlock(&zram->init_lock);
 +      up_write(&zram->init_lock);
  
        pr_debug("Initialization done!\n");
        return 0;
  
 +fail_no_table:
 +      /* To prevent accessing table entries during cleanup */
 +      zram->disksize = 0;
  fail:
 -      mutex_unlock(&zram->init_lock);
 -      zram_reset_device(zram);
 -
 +      __zram_reset_device(zram);
 +      up_write(&zram->init_lock);
        pr_err("Initialization failed: err=%d\n", ret);
        return ret;
  }
  
 -void zram_slot_free_notify(struct block_device *bdev, unsigned long index)
 +static void zram_slot_free_notify(struct block_device *bdev,
 +                              unsigned long index)
  {
        struct zram *zram;
  
@@@ -717,7 -701,7 +716,7 @@@ static int create_device(struct zram *z
        int ret = 0;
  
        init_rwsem(&zram->lock);
 -      mutex_init(&zram->init_lock);
 +      init_rwsem(&zram->init_lock);
        spin_lock_init(&zram->stat64_lock);
  
        zram->queue = blk_alloc_queue(GFP_KERNEL);
@@@ -794,9 -778,9 +793,9 @@@ static int __init zram_init(void
  {
        int ret, dev_id;
  
 -      if (num_devices > max_num_devices) {
 +      if (zram_num_devices > max_num_devices) {
                pr_warning("Invalid value for num_devices: %u\n",
 -                              num_devices);
 +                              zram_num_devices);
                ret = -EINVAL;
                goto out;
        }
                goto out;
        }
  
 -      if (!num_devices) {
 +      if (!zram_num_devices) {
                pr_info("num_devices not specified. Using default: 1\n");
 -              num_devices = 1;
 +              zram_num_devices = 1;
        }
  
        /* Allocate the device array and initialize each one */
 -      pr_info("Creating %u devices ...\n", num_devices);
 -      devices = kzalloc(num_devices * sizeof(struct zram), GFP_KERNEL);
 -      if (!devices) {
 +      pr_info("Creating %u devices ...\n", zram_num_devices);
 +      zram_devices = kzalloc(zram_num_devices * sizeof(struct zram), GFP_KERNEL);
 +      if (!zram_devices) {
                ret = -ENOMEM;
                goto unregister;
        }
  
 -      for (dev_id = 0; dev_id < num_devices; dev_id++) {
 -              ret = create_device(&devices[dev_id], dev_id);
 +      for (dev_id = 0; dev_id < zram_num_devices; dev_id++) {
 +              ret = create_device(&zram_devices[dev_id], dev_id);
                if (ret)
                        goto free_devices;
        }
  
  free_devices:
        while (dev_id)
 -              destroy_device(&devices[--dev_id]);
 -      kfree(devices);
 +              destroy_device(&zram_devices[--dev_id]);
 +      kfree(zram_devices);
  unregister:
        unregister_blkdev(zram_major, "zram");
  out:
@@@ -844,8 -828,8 +843,8 @@@ static void __exit zram_exit(void
        int i;
        struct zram *zram;
  
 -      for (i = 0; i < num_devices; i++) {
 -              zram = &devices[i];
 +      for (i = 0; i < zram_num_devices; i++) {
 +              zram = &zram_devices[i];
  
                destroy_device(zram);
                if (zram->init_done)
  
        unregister_blkdev(zram_major, "zram");
  
 -      kfree(devices);
 +      kfree(zram_devices);
        pr_debug("Cleanup done!\n");
  }
  
 -module_param(num_devices, uint, 0);
 -MODULE_PARM_DESC(num_devices, "Number of zram devices");
 +module_param(zram_num_devices, uint, 0);
 +MODULE_PARM_DESC(zram_num_devices, "Number of zram devices");
  
  module_init(zram_init);
  module_exit(zram_exit);