summaryrefslogtreecommitdiffstats
path: root/drivers/md/dm-raid1.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/md/dm-raid1.c')
-rw-r--r--drivers/md/dm-raid1.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/drivers/md/dm-raid1.c b/drivers/md/dm-raid1.c
index 580c49cc8079..5903e492bb34 100644
--- a/drivers/md/dm-raid1.c
+++ b/drivers/md/dm-raid1.c
@@ -23,6 +23,8 @@
23 23
24#define MAX_RECOVERY 1 /* Maximum number of regions recovered in parallel. */ 24#define MAX_RECOVERY 1 /* Maximum number of regions recovered in parallel. */
25 25
26#define MAX_NR_MIRRORS (DM_KCOPYD_MAX_REGIONS + 1)
27
26#define DM_RAID1_HANDLE_ERRORS 0x01 28#define DM_RAID1_HANDLE_ERRORS 0x01
27#define DM_RAID1_KEEP_LOG 0x02 29#define DM_RAID1_KEEP_LOG 0x02
28#define errors_handled(p) ((p)->features & DM_RAID1_HANDLE_ERRORS) 30#define errors_handled(p) ((p)->features & DM_RAID1_HANDLE_ERRORS)
@@ -255,7 +257,7 @@ static int mirror_flush(struct dm_target *ti)
255 unsigned long error_bits; 257 unsigned long error_bits;
256 258
257 unsigned int i; 259 unsigned int i;
258 struct dm_io_region io[ms->nr_mirrors]; 260 struct dm_io_region io[MAX_NR_MIRRORS];
259 struct mirror *m; 261 struct mirror *m;
260 struct dm_io_request io_req = { 262 struct dm_io_request io_req = {
261 .bi_op = REQ_OP_WRITE, 263 .bi_op = REQ_OP_WRITE,
@@ -651,7 +653,7 @@ static void write_callback(unsigned long error, void *context)
651static void do_write(struct mirror_set *ms, struct bio *bio) 653static void do_write(struct mirror_set *ms, struct bio *bio)
652{ 654{
653 unsigned int i; 655 unsigned int i;
654 struct dm_io_region io[ms->nr_mirrors], *dest = io; 656 struct dm_io_region io[MAX_NR_MIRRORS], *dest = io;
655 struct mirror *m; 657 struct mirror *m;
656 struct dm_io_request io_req = { 658 struct dm_io_request io_req = {
657 .bi_op = REQ_OP_WRITE, 659 .bi_op = REQ_OP_WRITE,
@@ -1083,7 +1085,7 @@ static int mirror_ctr(struct dm_target *ti, unsigned int argc, char **argv)
1083 argc -= args_used; 1085 argc -= args_used;
1084 1086
1085 if (!argc || sscanf(argv[0], "%u%c", &nr_mirrors, &dummy) != 1 || 1087 if (!argc || sscanf(argv[0], "%u%c", &nr_mirrors, &dummy) != 1 ||
1086 nr_mirrors < 2 || nr_mirrors > DM_KCOPYD_MAX_REGIONS + 1) { 1088 nr_mirrors < 2 || nr_mirrors > MAX_NR_MIRRORS) {
1087 ti->error = "Invalid number of mirrors"; 1089 ti->error = "Invalid number of mirrors";
1088 dm_dirty_log_destroy(dl); 1090 dm_dirty_log_destroy(dl);
1089 return -EINVAL; 1091 return -EINVAL;
@@ -1404,7 +1406,7 @@ static void mirror_status(struct dm_target *ti, status_type_t type,
1404 int num_feature_args = 0; 1406 int num_feature_args = 0;
1405 struct mirror_set *ms = (struct mirror_set *) ti->private; 1407 struct mirror_set *ms = (struct mirror_set *) ti->private;
1406 struct dm_dirty_log *log = dm_rh_dirty_log(ms->rh); 1408 struct dm_dirty_log *log = dm_rh_dirty_log(ms->rh);
1407 char buffer[ms->nr_mirrors + 1]; 1409 char buffer[MAX_NR_MIRRORS + 1];
1408 1410
1409 switch (type) { 1411 switch (type) {
1410 case STATUSTYPE_INFO: 1412 case STATUSTYPE_INFO: