diff options
author | Shaohua Li <shli@fb.com> | 2016-12-08 18:48:17 -0500 |
---|---|---|
committer | Shaohua Li <shli@fb.com> | 2016-12-09 01:00:11 -0500 |
commit | 6995f0b247e15e34fbcd10852c08b30bdc1a78da (patch) | |
tree | cf269278686e1ace761edded6fe4e7ae64417920 | |
parent | 3c6edc66085e1d895a698c572bbfaf4d57fdb771 (diff) |
md: takeover should clear unrelated bits
When we change level from raid1 to raid5, the MD_FAILFAST_SUPPORTED bit
will be accidentally set, but raid5 doesn't support it. The same is true
for the MD_HAS_JOURNAL bit.
Fix: 46533ff (md: Use REQ_FAILFAST_* on metadata writes where appropriate)
Reviewed-by: NeilBrown <neilb@suse.com>
Signed-off-by: Shaohua Li <shli@fb.com>
-rw-r--r-- | drivers/md/raid0.c | 5 | ||||
-rw-r--r-- | drivers/md/raid1.c | 5 | ||||
-rw-r--r-- | drivers/md/raid5.c | 6 |
3 files changed, 14 insertions, 2 deletions
diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c index e628f187e5ad..a162fedeb51a 100644 --- a/drivers/md/raid0.c +++ b/drivers/md/raid0.c | |||
@@ -539,8 +539,11 @@ static void *raid0_takeover_raid45(struct mddev *mddev) | |||
539 | mddev->delta_disks = -1; | 539 | mddev->delta_disks = -1; |
540 | /* make sure it will be not marked as dirty */ | 540 | /* make sure it will be not marked as dirty */ |
541 | mddev->recovery_cp = MaxSector; | 541 | mddev->recovery_cp = MaxSector; |
542 | clear_bit(MD_HAS_JOURNAL, &mddev->flags); | ||
543 | clear_bit(MD_JOURNAL_CLEAN, &mddev->flags); | ||
542 | 544 | ||
543 | create_strip_zones(mddev, &priv_conf); | 545 | create_strip_zones(mddev, &priv_conf); |
546 | |||
544 | return priv_conf; | 547 | return priv_conf; |
545 | } | 548 | } |
546 | 549 | ||
@@ -580,6 +583,7 @@ static void *raid0_takeover_raid10(struct mddev *mddev) | |||
580 | mddev->degraded = 0; | 583 | mddev->degraded = 0; |
581 | /* make sure it will be not marked as dirty */ | 584 | /* make sure it will be not marked as dirty */ |
582 | mddev->recovery_cp = MaxSector; | 585 | mddev->recovery_cp = MaxSector; |
586 | clear_bit(MD_FAILFAST_SUPPORTED, &mddev->flags); | ||
583 | 587 | ||
584 | create_strip_zones(mddev, &priv_conf); | 588 | create_strip_zones(mddev, &priv_conf); |
585 | return priv_conf; | 589 | return priv_conf; |
@@ -622,6 +626,7 @@ static void *raid0_takeover_raid1(struct mddev *mddev) | |||
622 | mddev->raid_disks = 1; | 626 | mddev->raid_disks = 1; |
623 | /* make sure it will be not marked as dirty */ | 627 | /* make sure it will be not marked as dirty */ |
624 | mddev->recovery_cp = MaxSector; | 628 | mddev->recovery_cp = MaxSector; |
629 | clear_bit(MD_FAILFAST_SUPPORTED, &mddev->flags); | ||
625 | 630 | ||
626 | create_strip_zones(mddev, &priv_conf); | 631 | create_strip_zones(mddev, &priv_conf); |
627 | return priv_conf; | 632 | return priv_conf; |
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index 94e0afce6d4c..efc2e744cfd3 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c | |||
@@ -3243,9 +3243,12 @@ static void *raid1_takeover(struct mddev *mddev) | |||
3243 | mddev->new_layout = 0; | 3243 | mddev->new_layout = 0; |
3244 | mddev->new_chunk_sectors = 0; | 3244 | mddev->new_chunk_sectors = 0; |
3245 | conf = setup_conf(mddev); | 3245 | conf = setup_conf(mddev); |
3246 | if (!IS_ERR(conf)) | 3246 | if (!IS_ERR(conf)) { |
3247 | /* Array must appear to be quiesced */ | 3247 | /* Array must appear to be quiesced */ |
3248 | conf->array_frozen = 1; | 3248 | conf->array_frozen = 1; |
3249 | clear_bit(MD_HAS_JOURNAL, &mddev->flags); | ||
3250 | clear_bit(MD_JOURNAL_CLEAN, &mddev->flags); | ||
3251 | } | ||
3249 | return conf; | 3252 | return conf; |
3250 | } | 3253 | } |
3251 | return ERR_PTR(-EINVAL); | 3254 | return ERR_PTR(-EINVAL); |
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 6bf3c2604a2f..3e6a2a0d61e9 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c | |||
@@ -7811,6 +7811,7 @@ static void *raid45_takeover_raid0(struct mddev *mddev, int level) | |||
7811 | static void *raid5_takeover_raid1(struct mddev *mddev) | 7811 | static void *raid5_takeover_raid1(struct mddev *mddev) |
7812 | { | 7812 | { |
7813 | int chunksect; | 7813 | int chunksect; |
7814 | void *ret; | ||
7814 | 7815 | ||
7815 | if (mddev->raid_disks != 2 || | 7816 | if (mddev->raid_disks != 2 || |
7816 | mddev->degraded > 1) | 7817 | mddev->degraded > 1) |
@@ -7832,7 +7833,10 @@ static void *raid5_takeover_raid1(struct mddev *mddev) | |||
7832 | mddev->new_layout = ALGORITHM_LEFT_SYMMETRIC; | 7833 | mddev->new_layout = ALGORITHM_LEFT_SYMMETRIC; |
7833 | mddev->new_chunk_sectors = chunksect; | 7834 | mddev->new_chunk_sectors = chunksect; |
7834 | 7835 | ||
7835 | return setup_conf(mddev); | 7836 | ret = setup_conf(mddev); |
7837 | if (!IS_ERR_VALUE(ret)) | ||
7838 | clear_bit(MD_FAILFAST_SUPPORTED, &mddev->flags); | ||
7839 | return ret; | ||
7836 | } | 7840 | } |
7837 | 7841 | ||
7838 | static void *raid5_takeover_raid6(struct mddev *mddev) | 7842 | static void *raid5_takeover_raid6(struct mddev *mddev) |