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: Jes Sorensen <Jes.Sorensen@redhat.com> Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
parent
18b9837ea0
commit
24b961f811
1 changed files with 17 additions and 1 deletions
|
@ -632,6 +632,7 @@ static void *raid0_takeover_raid10(struct mddev *mddev)
|
|||
static void *raid0_takeover_raid1(struct mddev *mddev)
|
||||
{
|
||||
struct r0conf *priv_conf;
|
||||
int chunksect;
|
||||
|
||||
/* Check layout:
|
||||
* - (N - 1) mirror drives must be already faulty
|
||||
|
@ -642,10 +643,25 @@ static void *raid0_takeover_raid1(struct mddev *mddev)
|
|||
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 */
|
||||
mddev->new_level = 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->raid_disks = 1;
|
||||
/* make sure it will be not marked as dirty */
|
||||
|
|
Loading…
Reference in a new issue