diff options
author | Jonathan E Brassow <jbrassow@redhat.com> | 2006-01-06 03:20:05 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-01-06 11:34:00 -0500 |
commit | a1a190807074bd6ad8771e00b00752771ae586cb (patch) | |
tree | ea9df244d215722e422f7bd7560dd9fe59789f44 /drivers/md/dm-raid1.c | |
parent | 2d5fe68987341a59a3fd97c71695efcabb0c6fd5 (diff) |
[PATCH] device-mapper raid1: add default mirror
This patch introduces a new field to the mirror_set (default_mirror) to store
the default mirror.
(A subsequent patch will allow us to change the default mirror in the event of
a failure.)
Signed-off-by: Alasdair G Kergon <agk@redhat.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'drivers/md/dm-raid1.c')
-rw-r--r-- | drivers/md/dm-raid1.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/drivers/md/dm-raid1.c b/drivers/md/dm-raid1.c index 6b0fc1670929..6cfa8d435d55 100644 --- a/drivers/md/dm-raid1.c +++ b/drivers/md/dm-raid1.c | |||
@@ -562,6 +562,8 @@ struct mirror_set { | |||
562 | region_t nr_regions; | 562 | region_t nr_regions; |
563 | int in_sync; | 563 | int in_sync; |
564 | 564 | ||
565 | struct mirror *default_mirror; /* Default mirror */ | ||
566 | |||
565 | unsigned int nr_mirrors; | 567 | unsigned int nr_mirrors; |
566 | struct mirror mirror[0]; | 568 | struct mirror mirror[0]; |
567 | }; | 569 | }; |
@@ -611,7 +613,7 @@ static int recover(struct mirror_set *ms, struct region *reg) | |||
611 | unsigned long flags = 0; | 613 | unsigned long flags = 0; |
612 | 614 | ||
613 | /* fill in the source */ | 615 | /* fill in the source */ |
614 | m = ms->mirror + DEFAULT_MIRROR; | 616 | m = ms->default_mirror; |
615 | from.bdev = m->dev->bdev; | 617 | from.bdev = m->dev->bdev; |
616 | from.sector = m->offset + region_to_sector(reg->rh, reg->key); | 618 | from.sector = m->offset + region_to_sector(reg->rh, reg->key); |
617 | if (reg->key == (ms->nr_regions - 1)) { | 619 | if (reg->key == (ms->nr_regions - 1)) { |
@@ -627,7 +629,7 @@ static int recover(struct mirror_set *ms, struct region *reg) | |||
627 | 629 | ||
628 | /* fill in the destinations */ | 630 | /* fill in the destinations */ |
629 | for (i = 0, dest = to; i < ms->nr_mirrors; i++) { | 631 | for (i = 0, dest = to; i < ms->nr_mirrors; i++) { |
630 | if (i == DEFAULT_MIRROR) | 632 | if (&ms->mirror[i] == ms->default_mirror) |
631 | continue; | 633 | continue; |
632 | 634 | ||
633 | m = ms->mirror + i; | 635 | m = ms->mirror + i; |
@@ -682,7 +684,7 @@ static void do_recovery(struct mirror_set *ms) | |||
682 | static struct mirror *choose_mirror(struct mirror_set *ms, sector_t sector) | 684 | static struct mirror *choose_mirror(struct mirror_set *ms, sector_t sector) |
683 | { | 685 | { |
684 | /* FIXME: add read balancing */ | 686 | /* FIXME: add read balancing */ |
685 | return ms->mirror + DEFAULT_MIRROR; | 687 | return ms->default_mirror; |
686 | } | 688 | } |
687 | 689 | ||
688 | /* | 690 | /* |
@@ -709,7 +711,7 @@ static void do_reads(struct mirror_set *ms, struct bio_list *reads) | |||
709 | if (rh_in_sync(&ms->rh, region, 0)) | 711 | if (rh_in_sync(&ms->rh, region, 0)) |
710 | m = choose_mirror(ms, bio->bi_sector); | 712 | m = choose_mirror(ms, bio->bi_sector); |
711 | else | 713 | else |
712 | m = ms->mirror + DEFAULT_MIRROR; | 714 | m = ms->default_mirror; |
713 | 715 | ||
714 | map_bio(ms, m, bio); | 716 | map_bio(ms, m, bio); |
715 | generic_make_request(bio); | 717 | generic_make_request(bio); |
@@ -833,7 +835,7 @@ static void do_writes(struct mirror_set *ms, struct bio_list *writes) | |||
833 | rh_delay(&ms->rh, bio); | 835 | rh_delay(&ms->rh, bio); |
834 | 836 | ||
835 | while ((bio = bio_list_pop(&nosync))) { | 837 | while ((bio = bio_list_pop(&nosync))) { |
836 | map_bio(ms, ms->mirror + DEFAULT_MIRROR, bio); | 838 | map_bio(ms, ms->default_mirror, bio); |
837 | generic_make_request(bio); | 839 | generic_make_request(bio); |
838 | } | 840 | } |
839 | } | 841 | } |
@@ -900,6 +902,7 @@ static struct mirror_set *alloc_context(unsigned int nr_mirrors, | |||
900 | ms->nr_mirrors = nr_mirrors; | 902 | ms->nr_mirrors = nr_mirrors; |
901 | ms->nr_regions = dm_sector_div_up(ti->len, region_size); | 903 | ms->nr_regions = dm_sector_div_up(ti->len, region_size); |
902 | ms->in_sync = 0; | 904 | ms->in_sync = 0; |
905 | ms->default_mirror = &ms->mirror[DEFAULT_MIRROR]; | ||
903 | 906 | ||
904 | if (rh_init(&ms->rh, ms, dl, region_size, ms->nr_regions)) { | 907 | if (rh_init(&ms->rh, ms, dl, region_size, ms->nr_regions)) { |
905 | ti->error = "dm-mirror: Error creating dirty region hash"; | 908 | ti->error = "dm-mirror: Error creating dirty region hash"; |