Commit 5f8dbb56 authored by Neil Brown's avatar Neil Brown Committed by Linus Torvalds

[PATCH] md: RAID10 module

This patch adds a 'raid10' module which provides features similar to both
raid0 and raid1 in the one array.  Various combinations of layout are
supported.

This code is still "experimental", but appears to work.
Signed-off-by: default avatarNeil Brown <neilb@cse.unsw.edu.au>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 3cf9857a
......@@ -85,6 +85,24 @@ config MD_RAID1
If unsure, say Y.
config MD_RAID10
tristate "RAID-10 (mirrored striping) mode (EXPERIMENTAL)"
depends on BLK_DEV_MD && EXPERIMENTAL
---help---
RAID-10 provides a combination of striping (RAID-0) and
mirroring (RAID-1) with easier configuration and more flexable
layout.
Unlike RAID-0, but like RAID-1, RAID-10 requires all devices to
be the same size (or atleast, only as much as the smallest device
will be used).
RAID-10 provides a variety of layouts that provide different levels
of redundancy and performance.
RAID-10 requires mdadm-1.7.0 or later, available at:
ftp://ftp.kernel.org/pub/linux/utils/raid/mdadm/
config MD_RAID5
tristate "RAID-4/RAID-5 mode"
depends on BLK_DEV_MD
......
......@@ -20,6 +20,7 @@ hostprogs-y := mktables
obj-$(CONFIG_MD_LINEAR) += linear.o
obj-$(CONFIG_MD_RAID0) += raid0.o
obj-$(CONFIG_MD_RAID1) += raid1.o
obj-$(CONFIG_MD_RAID10) += raid10.o
obj-$(CONFIG_MD_RAID5) += raid5.o xor.o
obj-$(CONFIG_MD_RAID6) += raid6.o xor.o
obj-$(CONFIG_MD_MULTIPATH) += multipath.o
......
This diff is collapsed.
......@@ -24,7 +24,8 @@
#define HSM 6UL
#define MULTIPATH 7UL
#define RAID6 8UL
#define MAX_PERSONALITY 9UL
#define RAID10 9UL
#define MAX_PERSONALITY 10UL
#define LEVEL_MULTIPATH (-4)
#define LEVEL_LINEAR (-1)
......@@ -43,6 +44,7 @@ static inline int pers_to_level (int pers)
case RAID1: return 1;
case RAID5: return 5;
case RAID6: return 6;
case RAID10: return 10;
}
BUG();
return MD_RESERVED;
......@@ -60,6 +62,7 @@ static inline int level_to_pers (int level)
case 4:
case 5: return RAID5;
case 6: return RAID6;
case 10: return RAID10;
}
return MD_RESERVED;
}
......
#ifndef _RAID10_H
#define _RAID10_H
#include <linux/raid/md.h>
typedef struct mirror_info mirror_info_t;
struct mirror_info {
mdk_rdev_t *rdev;
sector_t head_position;
};
typedef struct r10bio_s r10bio_t;
struct r10_private_data_s {
mddev_t *mddev;
mirror_info_t *mirrors;
int raid_disks;
int working_disks;
spinlock_t device_lock;
/* geometry */
int near_copies; /* number of copies layed out raid0 style */
int far_copies; /* number of copies layed out
* at large strides across drives
*/
int copies; /* near_copies * far_copies.
* must be <= raid_disks
*/
sector_t stride; /* distance between far copies.
* This is size / far_copies
*/
int chunk_shift; /* shift from chunks to sectors */
sector_t chunk_mask;
struct list_head retry_list;
/* for use when syncing mirrors: */
spinlock_t resync_lock;
int nr_pending;
int barrier;
sector_t next_resync;
wait_queue_head_t wait_idle;
wait_queue_head_t wait_resume;
mempool_t *r10bio_pool;
mempool_t *r10buf_pool;
};
typedef struct r10_private_data_s conf_t;
/*
* this is the only point in the RAID code where we violate
* C type safety. mddev->private is an 'opaque' pointer.
*/
#define mddev_to_conf(mddev) ((conf_t *) mddev->private)
/*
* this is our 'private' RAID10 bio.
*
* it contains information about what kind of IO operations were started
* for this RAID10 operation, and about their status:
*/
struct r10bio_s {
atomic_t remaining; /* 'have we finished' count,
* used from IRQ handlers
*/
sector_t sector; /* virtual sector number */
int sectors;
unsigned long state;
mddev_t *mddev;
/*
* original bio going to /dev/mdx
*/
struct bio *master_bio;
/*
* if the IO is in READ direction, then this is where we read
*/
int read_slot;
struct list_head retry_list;
/*
* if the IO is in WRITE direction, then multiple bios are used,
* one for each copy.
* When resyncing we also use one for each copy.
* When reconstructing, we use 2 bios, one for read, one for write.
* We choose the number when they are allocated.
*/
struct {
struct bio *bio;
sector_t addr;
int devnum;
} devs[0];
};
/* bits for r10bio.state */
#define R10BIO_Uptodate 0
#define R10BIO_IsSync 1
#define R10BIO_IsRecover 2
#endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment