diff --git a/lib/metadata/raid_manip.c b/lib/metadata/raid_manip.c index 466273654..f99788fac 100644 --- a/lib/metadata/raid_manip.c +++ b/lib/metadata/raid_manip.c @@ -1976,6 +1976,7 @@ static int _raid_reshape_remove_images(struct logical_volume *lv, * Reshape: keep images in RAID @lv but change stripe size or data copies * */ +static const char *_get_segtype_alias(const struct segment_type *segtype); static int _raid_reshape_keep_images(struct logical_volume *lv, const struct segment_type *new_segtype, int yes, int force, int *force_repair, @@ -1995,8 +1996,6 @@ static int _raid_reshape_keep_images(struct logical_volume *lv, return 0; } - seg->stripe_size = new_stripe_size; - /* * Reshape layout alogorithm or chunksize: * @@ -2010,8 +2009,22 @@ static int _raid_reshape_keep_images(struct logical_volume *lv, * The dm-raid target is able to use the space whereever it * is found by appropriately selecting forward or backward reshape. */ - if (seg->area_count != 2 && - alloc_reshape_space && + if (seg->segtype != new_segtype) { + const char *alias = _get_segtype_alias(seg->segtype); + + if (!strcmp(alias, new_segtype->name)) + alloc_reshape_space = 0; + } + + if (seg->stripe_size != new_stripe_size) + alloc_reshape_space = 1; + + seg->stripe_size = new_stripe_size; + + if (seg->area_count == 2) + alloc_reshape_space = 0; + + if (alloc_reshape_space && !_lv_alloc_reshape_space(lv, where, NULL, allocate_pvs)) return 0; @@ -4411,6 +4424,12 @@ static const char *_get_segtype_alias(const struct segment_type *segtype) if (!strcmp(segtype->name, SEG_TYPE_NAME_RAID6_ZR)) return SEG_TYPE_NAME_RAID6; + if (!strcmp(segtype->name, SEG_TYPE_NAME_RAID10)) + return SEG_TYPE_NAME_RAID10_NEAR; + + if (!strcmp(segtype->name, SEG_TYPE_NAME_RAID10_NEAR)) + return SEG_TYPE_NAME_RAID10; + return ""; } diff --git a/lib/metadata/segtype.h b/lib/metadata/segtype.h index 0eea6e610..93132c39c 100644 --- a/lib/metadata/segtype.h +++ b/lib/metadata/segtype.h @@ -1,6 +1,6 @@ /* * Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved. - * Copyright (C) 2004-2016 Red Hat, Inc. All rights reserved. + * Copyright (C) 2004-2017 Red Hat, Inc. All rights reserved. * * This file is part of LVM2. * @@ -89,6 +89,7 @@ struct dev_manager; #define SEG_TYPE_NAME_RAID0_META "raid0_meta" #define SEG_TYPE_NAME_RAID1 "raid1" #define SEG_TYPE_NAME_RAID10 "raid10" +#define SEG_TYPE_NAME_RAID10_NEAR "raid10_near" #define SEG_TYPE_NAME_RAID4 "raid4" #define SEG_TYPE_NAME_RAID5 "raid5" #define SEG_TYPE_NAME_RAID5_N "raid5_n" @@ -137,11 +138,12 @@ struct dev_manager; #define segtype_is_raid6_rs_6(segtype) ((segtype)->flags & SEG_RAID6_RS_6 ? 1 : 0) #define segtype_is_raid6_la_6(segtype) ((segtype)->flags & SEG_RAID6_LA_6 ? 1 : 0) #define segtype_is_raid6_ra_6(segtype) ((segtype)->flags & SEG_RAID6_RA_6 ? 1 : 0) -#define segtype_is_any_raid10(segtype) ((segtype)->flags & SEG_RAID10 ? 1 : 0) #define segtype_is_raid10(segtype) ((segtype)->flags & SEG_RAID10 ? 1 : 0) -#define segtype_is_raid10_near(segtype) segtype_is_raid10(segtype) -/* FIXME: once raid10_offset supported */ +#define segtype_is_raid10_near(segtype) ((segtype)->flags & SEG_RAID10_NEAR ? 1 : 0) +/* FIXME: once raid10_{far,offset} supported */ +#define segtype_is_raid10_far(segtype) 0 /* FIXME ((segtype)->flags & SEG_RAID10_FAR ? 1 : 0 */ #define segtype_is_raid10_offset(segtype) 0 /* FIXME ((segtype)->flags & SEG_RAID10_OFFSET ? 1 : 0 */ +#define segtype_is_any_raid10(segtype) (segtype_is_raid10(segtype) || segtype_is_raid10_near(segtype) || segtype_is_raid10_far(segtype) || segtype_is_raid10_offset(segtype)) #define segtype_is_raid_with_meta(segtype) (segtype_is_raid(segtype) && !segtype_is_raid0(segtype)) #define segtype_is_striped_raid(segtype) (segtype_is_raid(segtype) && !segtype_is_raid1(segtype)) #define segtype_is_reshapable_raid(segtype) ((segtype_is_striped_raid(segtype) && !segtype_is_any_raid0(segtype)) || segtype_is_raid10_near(segtype) || segtype_is_raid10_offset(segtype)) diff --git a/lib/raid/raid.c b/lib/raid/raid.c index df9796d04..25009f6a3 100644 --- a/lib/raid/raid.c +++ b/lib/raid/raid.c @@ -599,6 +599,7 @@ static const struct raid_type { { SEG_TYPE_NAME_RAID0_META, 0, SEG_RAID0_META | SEG_AREAS_STRIPED }, { SEG_TYPE_NAME_RAID1, 0, SEG_RAID1 | SEG_AREAS_MIRRORED }, { SEG_TYPE_NAME_RAID10, 0, SEG_RAID10 | SEG_AREAS_MIRRORED }, + { SEG_TYPE_NAME_RAID10_NEAR,0, SEG_RAID10_NEAR | SEG_AREAS_MIRRORED }, { SEG_TYPE_NAME_RAID4, 1, SEG_RAID4 }, { SEG_TYPE_NAME_RAID5, 1, SEG_RAID5 }, { SEG_TYPE_NAME_RAID5_N, 1, SEG_RAID5_N }, diff --git a/libdm/libdm-deptree.c b/libdm/libdm-deptree.c index a25d4c3f8..80bfc1be7 100644 --- a/libdm/libdm-deptree.c +++ b/libdm/libdm-deptree.c @@ -108,6 +108,7 @@ static const struct { */ { SEG_RAID5_LS, "raid5"}, /* same as "raid5_ls" (default for MD also) */ { SEG_RAID6_ZR, "raid6"}, /* same as "raid6_zr" */ + { SEG_RAID10, "raid10_near"}, /* same as "raid10" */ }; /* Some segment types have a list of areas of other devices attached */