On Mon, 24 Jan 2011 15:17:12 +0100 Krzysztof Wojcik <krzysztof.wojcik@xxxxxxxxx> wrote: > Add support for raid1 to raid0 takeover operation in user space. > This patch includes support for native and imsm metadata. > > Signed-off-by: Krzysztof Wojcik <krzysztof.wojcik@xxxxxxxxx> > --- > Grow.c | 39 ++++++++++++++++++++++++++++----------- > super-intel.c | 6 ++++++ > 2 files changed, 34 insertions(+), 11 deletions(-) > > diff --git a/Grow.c b/Grow.c > index 7c5edae..a8da20a 100644 > --- a/Grow.c > +++ b/Grow.c > @@ -650,15 +650,20 @@ void abort_reshape(struct mdinfo *sra) > sysfs_set_str(sra, NULL, "sync_max", "max"); > } > > -int remove_disks_on_raid10_to_raid0_takeover(struct supertype *st, > - struct mdinfo *sra, > - int layout) > +int remove_disks_for_takeover(struct supertype *st, > + struct mdinfo *sra, > + int layout) > { > int nr_of_copies; > struct mdinfo *remaining; > int slot; > > - nr_of_copies = layout & 0xff; > + if (sra->array.level == 10) > + nr_of_copies = layout & 0xff; > + else if (sra->array/level == 1) > + nr_of_copies = sra->array.raid_disks; > + else > + return 1; > > remaining = sra->devs; > sra->devs = NULL; > @@ -911,8 +916,18 @@ char *analyse_change(struct mdinfo *info, struct > reshape *re) switch (info->array.level) { > case 1: > /* RAID1 can convert to RAID1 with different disks, > or > - * raid5 with 2 disks > + * raid5 with 2 disks, or > + * raid0 with 1 disk > */ > + if (info->new_level == 0) { > + re->level = 0; > + re->before.data_disks = > info->array.raid_disks / 2; > + re->after.data_disks = re->before.data_disks; dividing raid_disks by 2 doesn't make any sense at all. It have fixed it so that it does make sense, and applied. Thanks, NeilBrown > + re->before.layout = 0; > + re->backup_blocks = 0; > + re->parity = 0; > + return NULL; > + } > if (info->new_level == 1) { > if (info->delta_disks == UnSet) > /* Don't know what to do */ > @@ -1449,15 +1464,17 @@ int Grow_reshape(char *devname, int fd, int > quiet, char *backup_file, size = array.size; > } > > - /* ========= check for Raid10 -> Raid0 conversion > =============== > + /* ========= check for Raid10/Raid1 -> Raid0 conversion > =============== > * current implementation assumes that following conditions > must be met: > - * - far_copies == 1 > - * - near_copies == 2 > + * - RAID10: > + * - far_copies == 1 > + * - near_copies == 2 > */ > - if (level == 0 && array.level == 10 && sra && > - array.layout == ((1 << 8) + 2) && !(array.raid_disks & > 1)) { > + if ((level == 0 && array.level == 10 && sra && > + array.layout == ((1 << 8) + 2) && !(array.raid_disks & > 1)) || > + (level == 0 && array.level == 1 && sra)) { > int err; > - err = remove_disks_on_raid10_to_raid0_takeover(st, > sra, array.layout); > + err = remove_disks_for_takeover(st, sra, > array.layout); if (err) { > dprintf(Name": Array cannot be reshaped\n"); > if (cfd > -1) > diff --git a/super-intel.c b/super-intel.c > index b25d4fb..461fb0c 100644 > --- a/super-intel.c > +++ b/super-intel.c > @@ -6785,6 +6785,12 @@ enum imsm_reshape_type > imsm_analyze_change(struct supertype *st, check_devs = 1; > } > break; > + case 1: > + if (geo->level == 0) { > + change = CH_TAKEOVER; > + check_devs = 1; > + } > + break; > case 5: > if (geo->level != 0) > change = CH_LEVEL_MIGRATION; > > -- > To unsubscribe from this list: send the line "unsubscribe linux-raid" > in the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-raid" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html