Skip to content

Commit 53a6ab4

Browse files
committed
md/raid10: fix conversion from RAID0 to RAID10
A RAID0 array (like a LINEAR array) does not have a concept of 'size' being the amount of each device that is in use. Rather, as much of each device as is available is used. So the 'size' is set to 0 and ignored. RAID10 does have this concept and needs it to be set correctly. So when we convert RAID0 to RAID10 we must determine the 'size' (that being the size of the first 'strip_zone' in the RAID0), and set it correctly. Reported-and-tested-by: Xiao Ni <[email protected]> Signed-off-by: NeilBrown <[email protected]>
1 parent dfe15ac commit 53a6ab4

File tree

1 file changed

+9
-3
lines changed

1 file changed

+9
-3
lines changed

drivers/md/raid10.c

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3872,7 +3872,7 @@ static int raid10_resize(struct mddev *mddev, sector_t sectors)
38723872
return 0;
38733873
}
38743874

3875-
static void *raid10_takeover_raid0(struct mddev *mddev)
3875+
static void *raid10_takeover_raid0(struct mddev *mddev, sector_t size, int devs)
38763876
{
38773877
struct md_rdev *rdev;
38783878
struct r10conf *conf;
@@ -3882,6 +3882,7 @@ static void *raid10_takeover_raid0(struct mddev *mddev)
38823882
mdname(mddev));
38833883
return ERR_PTR(-EINVAL);
38843884
}
3885+
sector_div(size, devs);
38853886

38863887
/* Set new parameters */
38873888
mddev->new_level = 10;
@@ -3892,12 +3893,15 @@ static void *raid10_takeover_raid0(struct mddev *mddev)
38923893
mddev->raid_disks *= 2;
38933894
/* make sure it will be not marked as dirty */
38943895
mddev->recovery_cp = MaxSector;
3896+
mddev->dev_sectors = size;
38953897

38963898
conf = setup_conf(mddev);
38973899
if (!IS_ERR(conf)) {
38983900
rdev_for_each(rdev, mddev)
3899-
if (rdev->raid_disk >= 0)
3901+
if (rdev->raid_disk >= 0) {
39003902
rdev->new_raid_disk = rdev->raid_disk * 2;
3903+
rdev->sectors = size;
3904+
}
39013905
conf->barrier = 1;
39023906
}
39033907

@@ -3920,7 +3924,9 @@ static void *raid10_takeover(struct mddev *mddev)
39203924
mdname(mddev));
39213925
return ERR_PTR(-EINVAL);
39223926
}
3923-
return raid10_takeover_raid0(mddev);
3927+
return raid10_takeover_raid0(mddev,
3928+
raid0_conf->strip_zone->zone_end,
3929+
raid0_conf->strip_zone->nb_dev);
39243930
}
39253931
return ERR_PTR(-EINVAL);
39263932
}

0 commit comments

Comments
 (0)