On Tue, Apr 12, 2022 at 11:54 PM Pascal Hambourg <pascal@xxxxxxxxxxxxxxx> wrote: > > The RAID0 layout is irrelevant if all members have the same size so the > array has only one zone. It is *also* irrelevant if the array has two > zones and the second zone has only one device, for example if the array > has two members of different sizes. > > So in that case it makes sense to allow assembly even when the layout is > undefined, like what is done when the array has only one zone. > > Reviewed-By: NeilBrown <neilb@xxxxxxx> > Signed-off-by: Pascal Hambourg <pascal@xxxxxxxxxxxxxxx> Thanks for the patch and thanks Neil for the review. Applied to md-next with two minor changes: s/ENOTSUPP/EOPNOTSUPP/ s/Reviewed-By/Review-by/ Thanks, Song > --- > > Changes since v1: > - add missing Signed-off-by > - add missing subsystem maintainer in recipients > > --- > drivers/md/raid0.c | 31 ++++++++++++++++--------------- > 1 file changed, 16 insertions(+), 15 deletions(-) > > diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c > index b21e101183f4..7623811cc11c 100644 > --- a/drivers/md/raid0.c > +++ b/drivers/md/raid0.c > @@ -128,21 +128,6 @@ static int create_strip_zones(struct mddev *mddev, struct r0conf **private_conf) > pr_debug("md/raid0:%s: FINAL %d zones\n", > mdname(mddev), conf->nr_strip_zones); > > - if (conf->nr_strip_zones == 1) { > - conf->layout = RAID0_ORIG_LAYOUT; > - } else if (mddev->layout == RAID0_ORIG_LAYOUT || > - mddev->layout == RAID0_ALT_MULTIZONE_LAYOUT) { > - conf->layout = mddev->layout; > - } else if (default_layout == RAID0_ORIG_LAYOUT || > - default_layout == RAID0_ALT_MULTIZONE_LAYOUT) { > - conf->layout = default_layout; > - } else { > - pr_err("md/raid0:%s: cannot assemble multi-zone RAID0 with default_layout setting\n", > - mdname(mddev)); > - pr_err("md/raid0: please set raid0.default_layout to 1 or 2\n"); > - err = -ENOTSUPP; > - goto abort; > - } > /* > * now since we have the hard sector sizes, we can make sure > * chunk size is a multiple of that sector size > @@ -273,6 +258,22 @@ static int create_strip_zones(struct mddev *mddev, struct r0conf **private_conf) > (unsigned long long)smallest->sectors); > } > > + if (conf->nr_strip_zones == 1 || conf->strip_zone[1].nb_dev == 1) { > + conf->layout = RAID0_ORIG_LAYOUT; > + } else if (mddev->layout == RAID0_ORIG_LAYOUT || > + mddev->layout == RAID0_ALT_MULTIZONE_LAYOUT) { > + conf->layout = mddev->layout; > + } else if (default_layout == RAID0_ORIG_LAYOUT || > + default_layout == RAID0_ALT_MULTIZONE_LAYOUT) { > + conf->layout = default_layout; > + } else { > + pr_err("md/raid0:%s: cannot assemble multi-zone RAID0 with default_layout setting\n", > + mdname(mddev)); > + pr_err("md/raid0: please set raid0.default_layout to 1 or 2\n"); > + err = -ENOTSUPP; > + goto abort; > + } > + > pr_debug("md/raid0:%s: done.\n", mdname(mddev)); > *private_conf = conf; > > -- > 2.11.0 >