Commit 24b961f8 authored by Jes Sorensen's avatar Jes Sorensen Committed by NeilBrown

md: Avoid OOPS when reshaping raid1 to raid0

raid1 arrays do not have the notion of chunk size. Calculate the
largest chunk sector size we can use to avoid a divide by zero OOPS
when aligning the size of the new array to the chunk size.
Signed-off-by: default avatarJes Sorensen <Jes.Sorensen@redhat.com>
Signed-off-by: default avatarNeilBrown <neilb@suse.de>
parent 18b9837e
...@@ -632,6 +632,7 @@ static void *raid0_takeover_raid10(struct mddev *mddev) ...@@ -632,6 +632,7 @@ static void *raid0_takeover_raid10(struct mddev *mddev)
static void *raid0_takeover_raid1(struct mddev *mddev) static void *raid0_takeover_raid1(struct mddev *mddev)
{ {
struct r0conf *priv_conf; struct r0conf *priv_conf;
int chunksect;
/* Check layout: /* Check layout:
* - (N - 1) mirror drives must be already faulty * - (N - 1) mirror drives must be already faulty
...@@ -642,10 +643,25 @@ static void *raid0_takeover_raid1(struct mddev *mddev) ...@@ -642,10 +643,25 @@ static void *raid0_takeover_raid1(struct mddev *mddev)
return ERR_PTR(-EINVAL); return ERR_PTR(-EINVAL);
} }
/*
* a raid1 doesn't have the notion of chunk size, so
* figure out the largest suitable size we can use.
*/
chunksect = 64 * 2; /* 64K by default */
/* The array must be an exact multiple of chunksize */
while (chunksect && (mddev->array_sectors & (chunksect - 1)))
chunksect >>= 1;
if ((chunksect << 9) < PAGE_SIZE)
/* array size does not allow a suitable chunk size */
return ERR_PTR(-EINVAL);
/* Set new parameters */ /* Set new parameters */
mddev->new_level = 0; mddev->new_level = 0;
mddev->new_layout = 0; mddev->new_layout = 0;
mddev->new_chunk_sectors = 128; /* by default set chunk size to 64k */ mddev->new_chunk_sectors = chunksect;
mddev->chunk_sectors = chunksect;
mddev->delta_disks = 1 - mddev->raid_disks; mddev->delta_disks = 1 - mddev->raid_disks;
mddev->raid_disks = 1; mddev->raid_disks = 1;
/* make sure it will be not marked as dirty */ /* make sure it will be not marked as dirty */
......
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