From mboxrd@z Thu Jan 1 00:00:00 1970 From: Neil Brown Subject: Re: [PATCH 2/5] Add raid1->raid0 takeover support Date: Thu, 27 Jan 2011 13:12:00 +1000 Message-ID: <20110127131200.382115fb@nbeee.brown> References: <20110124141704.16405.6081.stgit@gklab-128-111.igk.intel.com> <20110124141712.16405.50338.stgit@gklab-128-111.igk.intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <20110124141712.16405.50338.stgit@gklab-128-111.igk.intel.com> Sender: linux-raid-owner@vger.kernel.org To: Krzysztof Wojcik Cc: linux-raid@vger.kernel.org, wojciech.neubauer@intel.com, adam.kwolek@intel.com, dan.j.williams@intel.com, ed.ciechanowski@intel.com List-Id: linux-raid.ids On Mon, 24 Jan 2011 15:17:12 +0100 Krzysztof Wojcik 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 > --- > 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@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html