summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHeinz Mauelshagen <heinzm@redhat.com>2016-01-29 12:59:23 +0100
committerHeinz Mauelshagen <heinzm@redhat.com>2016-01-29 12:59:23 +0100
commitc2b07aa3b30dcb90d2319ed6bfb0f20ed741961f (patch)
tree07fe357cf31bc0f47670e97ccf9ee02095ba0c8f
parent8977fd78352a5b109cb50e215dd7972e9c3e5b26 (diff)
downloadlvm2-c2b07aa3b30dcb90d2319ed6bfb0f20ed741961f.tar.gz
raid_manip: introduce new_region_size argument to takeover(helper) functions to allow for changing it during conversion
-rw-r--r--lib/metadata/raid_manip.c252
1 files changed, 152 insertions, 100 deletions
diff --git a/lib/metadata/raid_manip.c b/lib/metadata/raid_manip.c
index 15b7612b0..37b0c33f3 100644
--- a/lib/metadata/raid_manip.c
+++ b/lib/metadata/raid_manip.c
@@ -1082,6 +1082,8 @@ static int _convert_raid_to_linear(struct logical_volume *lv,
if (!(first_seg(lv)->segtype = get_segtype_from_string(lv->vg->cmd, SEG_TYPE_NAME_STRIPED)))
return_0;
+ first_seg(lv)->region_size = 0;
+
lv->status &= ~(MIRRORED | RAID | RAID_IMAGE | LV_DUPLICATED);
return 1;
@@ -5005,8 +5007,10 @@ PFLA("data_copies=%u seg->data_copies=%u stripes=%u seg->area_count=%u", data_co
PFL();
if ((!seg_is_striped(seg) && segtype_is_raid10_far(segtype)) ||
(seg_is_raid10_far(seg) && !segtype_is_striped(segtype))) {
- log_error("Can't convert from/to raid10_far");
- goto err;
+ if (region_size == seg->region_size) {
+ log_error("Can't convert raid10_far");
+ goto err;
+ }
}
if (seg_is_raid10_far(seg)) {
@@ -5035,7 +5039,7 @@ PFLA("may=%d", may);
return may ? 3 : 2;
}
PFL();
- if (seg_is_any_raid10(seg) &&
+ if (seg_is_any_raid10(seg) && seg->area_count > 2 &&
stripes && stripes < seg->area_count - seg->segtype->parity_devs) {
log_error("Can't remove stripes from raid10");
goto err;
@@ -5196,7 +5200,15 @@ struct possible_type {
static struct possible_takeover_reshape_type _possible_takeover_reshape_types[] = {
/* striped -> */
{ .current_types = SEG_AREAS_STRIPED, /* linear, i.e. seg->area_count = 1 */
- .possible_types = SEG_RAID1|SEG_RAID4|SEG_RAID5_LS|SEG_RAID5_LA|SEG_RAID5_RS|SEG_RAID5_RA|SEG_RAID5_N,
+ .possible_types = SEG_RAID1,
+ .current_areas = 1,
+ .options = ALLOW_REGION_SIZE|ALLOW_DATA_COPIES },
+ { .current_types = SEG_AREAS_STRIPED, /* linear, i.e. seg->area_count = 1 */
+ .possible_types = SEG_RAID4|SEG_RAID5_LS|SEG_RAID5_LA|SEG_RAID5_RS|SEG_RAID5_RA|SEG_RAID5_N,
+ .current_areas = 1,
+ .options = ALLOW_REGION_SIZE },
+ { .current_types = SEG_AREAS_STRIPED, /* linear, i.e. seg->area_count = 1 */
+ .possible_types = SEG_RAID10_NEAR,
.current_areas = 1,
.options = ALLOW_REGION_SIZE },
{ .current_types = SEG_AREAS_STRIPED,
@@ -5247,7 +5259,7 @@ static struct possible_takeover_reshape_type _possible_takeover_reshape_types[]
{ .current_types = SEG_RAID1, /* seg->area_count != 2 */
.possible_types = SEG_RAID10_NEAR,
.current_areas = ~0U,
- .options = ALLOW_NONE|ALLOW_REGION_SIZE },
+ .options = ALLOW_REGION_SIZE },
{ .current_types = SEG_RAID1, /* seg->area_count != 2 allowing for -m0 */
.possible_types = SEG_AREAS_STRIPED,
.current_areas = ~0U,
@@ -5385,6 +5397,12 @@ static struct possible_takeover_reshape_type _possible_takeover_reshape_types[]
.current_areas = ~0U,
.options = ALLOW_NONE },
+ /* raid10 (2 legs) -> raid1 */
+ { .current_types = SEG_RAID10_NEAR,
+ .possible_types = SEG_RAID1,
+ .current_areas = 2,
+ .options = ALLOW_REGION_SIZE },
+
/* raid01 -> striped */
{ .current_types = SEG_RAID01,
.possible_types = SEG_AREAS_STRIPED,
@@ -5582,28 +5600,30 @@ static int _log_possible_conversion_types(struct logical_volume *lv, const struc
"flags processed");
if (possible_conversions) {
- if (!duplicating) {
+ if (!duplicating && !silent_mode()) {
const char *alias = _get_segtype_alias(seg->segtype);
- log_print_unless_silent("Converting %s from %s%s%s%c (without --duplicate) is "
- "directly possible to the following layout%s:",
- display_lvname(lv), _get_segtype_name(seg->segtype, seg->area_count),
- *alias ? " (same as " : "", alias, *alias ? ')' : 0,
- possible_conversions > 1 ? "s" : "");
- }
+ log_print("Converting %s from %s%s%s%c (without --duplicate) is "
+ "directly possible to the following layout%s:",
+ display_lvname(lv), _get_segtype_name(seg->segtype, seg->area_count),
+ *alias ? " (same as " : "", alias, *alias ? ')' : 0,
+ possible_conversions > 1 ? "s" : "");
- pt = NULL;
+ pt = NULL;
- /* Print any possible segment types @seg can be directly converted to */
- while ((pt = _get_possible_type(seg, NULL, 0, pt)))
- RETURN_IF_ZERO(_process_type_flags(lv, pt, _log_possible_conversion, NULL),
- "flags processed");
+ /* Print any possible segment types @seg can be directly converted to */
+ while ((pt = _get_possible_type(seg, NULL, 0, pt)))
+ RETURN_IF_ZERO(_process_type_flags(lv, pt, _log_possible_conversion, NULL),
+ "flags processed");
+ }
} else
log_warn("Direct conversion of %s LV %s is not possible",
lvseg_name(seg), display_lvname(lv));
- if (!duplicating)
+ if (duplicating)
+ log_warn("To add more duplicated sub LVs, use \"lvconvert --duplicate ...\"");
+ else
log_warn("To convert to other arbitrary layouts by duplication, use \"lvconvert --duplicate ...\"");
return 0;
@@ -5692,6 +5712,7 @@ static int _lv_is_synced(struct logical_volume *lv)
const unsigned new_data_copies, \
const unsigned new_stripes, \
unsigned new_stripe_size, \
+ unsigned new_region_size, \
struct dm_list *allocate_pvs
#if 0
@@ -5771,10 +5792,7 @@ TAKEOVER_FN(_error)
{
RETURN_IF_LV_SEG_SEGTYPE_ZERO(lv, first_seg(lv), new_segtype);
- log_error("Converting the raid type for %s (directly) from %s to %s"
- " is not supported (yet).", display_lvname(lv),
- lvseg_name(first_seg(lv)), new_segtype->name);
- log_error("You may want to use the \"--duplicate\" option");
+ _log_possible_conversion_types(lv, new_segtype);
return 0;
}
@@ -5870,11 +5888,9 @@ PFLA("lv_name=%s segtype=%s data_copies=%u stripes=%u region_size=%u stripe_size
}
log_debug_metadata("Creating new logical volume %s/%s.", vg->name, lp.lv_name);
- init_silent(1);
-
- if (!(r = lv_create_single(vg, &lp)))
- return_NULL;
+ init_silent(1);
+ r = lv_create_single(vg, &lp);
init_silent(0);
return r;
@@ -6049,11 +6065,9 @@ PFL();
!_rename_lv(mlv, names[type][ft[0]+1], names[type][ft[1]+1]))
return 0;
-PFLA("seg_lv(seg, %u)=%s", s, display_lvname(seg_lv(seg, s)));
if (seg_type(seg, s) == AREA_LV &&
!_rename_lv(seg_lv(seg, s), names[type][ft[0]], names[type][ft[1]]))
return 0;
-PFLA("seg_lv(seg, %u)=%s", s, display_lvname(seg_lv(seg, s)));
}
PFL();
return 1;
@@ -6818,7 +6832,7 @@ TAKEOVER_HELPER_FN(_linear_raid14510)
/* HM FIXME: overloading force argument to avoid metadata update in _linear_raid0() */
/* Use helper _linear_raid0() to create the initial raid0_meta with one image pair up */
if (!(segtype = get_segtype_from_flag(lv->vg->cmd, SEG_RAID0_META)) ||
- !_linear_raid0(lv, segtype, 0, 1 /* force */, 1, 1 /* data_copies */, 0, 0, allocate_pvs))
+ !_linear_raid0(lv, segtype, 0, 1 /* force */, 1, 1 /* data_copies */, 0, 0, 0, allocate_pvs))
return 0;
/* Allocate the additional meta and data LVs requested */
@@ -6829,6 +6843,9 @@ TAKEOVER_HELPER_FN(_linear_raid14510)
seg = first_seg(lv);
seg->segtype = new_segtype;
+ seg->data_copies = new_data_copies;
+ seg->stripe_size = new_stripe_size;
+ seg->region_size = new_region_size;
return _lv_update_reload_fns_reset_eliminate_lvs(lv, NULL, NULL);
}
@@ -6933,8 +6950,9 @@ PFL();
}
PFL();
- seg->data_copies = new_data_copies;
seg->segtype = new_segtype;
+ seg->data_copies = new_data_copies;
+ seg->region_size = new_region_size;
if (!_check_and_init_region_size(lv))
return 0;
@@ -6993,7 +7011,7 @@ TAKEOVER_HELPER_FN(_raid0_mirror)
RETURN_IF_LV_SEG_SEGTYPE_ZERO(lv, (seg = first_seg(lv)), new_segtype);
if (seg->area_count != 1)
- return _error(lv, new_segtype, yes, force, 0, 1 /* data_copies */, 0, 0, NULL);
+ return _error(lv, new_segtype, yes, force, 0, 1 /* data_copies */, 0, 0, 0, NULL);
new_image_count = new_image_count > 1 ? new_image_count : 2;
@@ -7023,9 +7041,11 @@ TAKEOVER_HELPER_FN(_raid0_mirror)
lvseg_name(seg), new_segtype->name,
new_image_count - seg->area_count);
if (!_linear_raid14510(lv, segtype, 0, 0, new_image_count, new_image_count, 0 /* new_stripes */,
- new_stripe_size, allocate_pvs))
+ new_stripe_size, new_region_size, allocate_pvs))
return 0;
+ seg->region_size = new_region_size;
+
/* ...second convert to mirror */
log_debug_metadata("Converting %s from %s to %s",
display_lvname(lv),
@@ -7040,6 +7060,7 @@ TAKEOVER_HELPER_FN(_raid0_raid1)
struct lv_segment *seg;
RETURN_IF_LV_SEG_SEGTYPE_ZERO(lv, (seg = first_seg(lv)), new_segtype);
+ RETURN_IF_ZERO(seg->area_count == 1, "single area");
RETURN_IF_ZERO(seg_is_any_raid0(seg) && seg->area_count == 1,
"converson of non-raid0 LV or with area count != 1");
@@ -7067,6 +7088,7 @@ TAKEOVER_HELPER_FN(_raid0_raid1)
lvseg_name(seg), new_segtype->name,
new_image_count - seg->area_count);
seg->segtype = new_segtype;
+ seg->region_size = new_region_size;
if (!_lv_change_image_count(lv, new_image_count, allocate_pvs, NULL))
return 0;
@@ -7116,6 +7138,7 @@ TAKEOVER_HELPER_FN(_mirror_raid0)
}
seg->segtype = new_segtype;
+ seg->region_size = 0;
return _lv_update_reload_fns_reset_eliminate_lvs(lv, &removal_lvs, NULL);
}
@@ -7163,6 +7186,8 @@ TAKEOVER_HELPER_FN(_mirror_r45)
} else if (!_convert_mirror_to_raid(lv, new_segtype, 0, NULL, 0 /* update_and_reaload */, NULL))
return 0;
+ seg->region_size = new_region_size;
+
return _lv_update_reload_fns_reset_eliminate_lvs(lv, &removal_lvs, NULL);
}
@@ -7201,6 +7226,8 @@ TAKEOVER_HELPER_FN(_raid1_raid0)
return 0;
}
+ seg->region_size = 0;
+
return _lv_update_reload_fns_reset_eliminate_lvs(lv, &removal_lvs, NULL);
}
@@ -7254,7 +7281,9 @@ PFLA("seg->area_count=%u seg->len=%u seg->area_len=%u", seg->area_count, seg->le
!_raid0_add_or_remove_metadata_lvs(lv, 0 /* update_and_reload */, allocate_pvs, &removal_lvs))
return_0;
- first_seg(lv)->data_copies = 1;
+ seg = first_seg(lv);
+ seg->data_copies = 1;
+ seg->region_size = 0;
return _lv_update_reload_fns_reset_eliminate_lvs(lv, &removal_lvs, NULL);
}
@@ -7304,6 +7333,8 @@ PFL();
if (!_convert_raid_to_linear(lv, &removal_lvs))
return_0;
+ first_seg(lv)->region_size = 0;
+
return _lv_update_reload_fns_reset_eliminate_lvs(lv, &removal_lvs, NULL);
}
@@ -7339,6 +7370,8 @@ TAKEOVER_HELPER_FN(_raid145_raid1_raid6)
} else
seg->data_copies = new_data_copies;
+ seg->region_size = new_region_size;
+
return _lv_update_reload_fns_reset_eliminate_lvs(lv, &removal_lvs, NULL);
}
@@ -7400,6 +7433,7 @@ TAKEOVER_HELPER_FN(_raid145_raid4510)
seg->segtype = new_segtype;
seg->stripe_size = new_stripe_size ?: DEFAULT_STRIPESIZE;
+ seg->region_size = new_region_size;
return _lv_update_reload_fns_reset_eliminate_lvs(lv, NULL, NULL);
}
@@ -7498,6 +7532,7 @@ PFLA("seg->len=%u seg->area_len=%u seg->area_count=%u", seg->len, seg->area_len,
PFLA("seg->stripe_size=%u", seg->stripe_size);
PFLA("seg->chunk_size=%u", seg->chunk_size);
seg->segtype = new_segtype;
+ seg->region_size = 0;
/* HM FIXME: overloading force argument here! */
return force ? 1 : _lv_update_reload_fns_reset_eliminate_lvs(lv, removal_lvs, NULL);
@@ -7552,6 +7587,7 @@ TAKEOVER_HELPER_FN(_raid10_r1456)
}
seg->segtype = new_segtype;
+ seg->region_size = new_region_size;
return _lv_update_reload_fns_reset_eliminate_lvs(lv, &removal_lvs, NULL);
}
@@ -7566,7 +7602,7 @@ TAKEOVER_FN(_l_r0)
RETURN_IF_LV_SEG_SEGTYPE_ZERO(lv, first_seg(lv), new_segtype);
return _lv_has_segments_with_n_areas(lv, 1) &&
- _linear_raid0(lv, new_segtype, yes, force, 1, 1, 0, 0, allocate_pvs);
+ _linear_raid0(lv, new_segtype, yes, force, 1, 1, 0, 0, 0, allocate_pvs);
}
/* Linear -> raid1 */
@@ -7577,7 +7613,7 @@ TAKEOVER_FN(_l_r1)
return _lv_has_segments_with_n_areas(lv, 1) &&
_linear_raid14510(lv, new_segtype, yes, force,
new_image_count, new_image_count, 0 /* new_stripes */,
- new_stripe_size, allocate_pvs);
+ new_stripe_size, new_region_size, allocate_pvs);
}
/* Linear -> raid4/5 */
@@ -7585,12 +7621,10 @@ TAKEOVER_FN(_l_r45)
{
RETURN_IF_LV_SEG_SEGTYPE_ZERO(lv, first_seg(lv), new_segtype);
- if (!_lv_has_segments_with_n_areas(lv, 1))
- return 0;
-
- return _linear_raid14510(lv, new_segtype, yes, force,
+ return (_lv_has_segments_with_n_areas(lv, 1) &&
+ _linear_raid14510(lv, new_segtype, yes, force,
2 /* new_image_count */, 2, 0 /* new_stripes */,
- new_stripe_size, allocate_pvs);
+ new_stripe_size, new_region_size, allocate_pvs));
}
/* Linear -> raid10 */
@@ -7598,10 +7632,11 @@ TAKEOVER_FN(_l_r10)
{
RETURN_IF_LV_SEG_SEGTYPE_ZERO(lv, first_seg(lv), new_segtype);
+printf("new_stripe_size=%u\n", new_stripe_size);
return _lv_has_segments_with_n_areas(lv, 1) &&
_linear_raid14510(lv, new_segtype, yes, force,
2 /* new_image_count */ , 2, 0 /* new_stripes */,
- new_stripe_size, allocate_pvs);
+ new_stripe_size, new_region_size, allocate_pvs);
}
/* Striped -> raid0 */
@@ -7639,7 +7674,8 @@ TAKEOVER_FN(_s_r45)
{
RETURN_IF_LV_SEG_SEGTYPE_ZERO(lv, first_seg(lv), new_segtype);
- return _striped_raid0_raid45610(lv, new_segtype, yes, force, first_seg(lv)->area_count + 1, 2 /* data_copies*/, 0, 0, allocate_pvs);
+ return _striped_raid0_raid45610(lv, new_segtype, yes, force, first_seg(lv)->area_count + 1,
+ 2 /* data_copies*/, 0, 0, new_region_size, allocate_pvs);
}
/* Striped -> raid6 */
@@ -7647,16 +7683,17 @@ TAKEOVER_FN(_s_r6)
{
RETURN_IF_LV_SEG_SEGTYPE_ZERO(lv, first_seg(lv), new_segtype);
- return _striped_raid0_raid45610(lv, new_segtype, yes, force, first_seg(lv)->area_count + 2, 3 /* data_copies*/, 0, 0, allocate_pvs);
+ return _striped_raid0_raid45610(lv, new_segtype, yes, force, first_seg(lv)->area_count + 2,
+ 3 /* data_copies*/, 0, 0, new_region_size, allocate_pvs);
}
TAKEOVER_FN(_s_r10)
{
RETURN_IF_LV_SEG_SEGTYPE_ZERO(lv, first_seg(lv), new_segtype);
-
+PFL();
return _striped_raid0_raid45610(lv, new_segtype, yes, force,
first_seg(lv)->area_count * new_data_copies,
- new_data_copies, 0, 0, allocate_pvs);
+ new_data_copies, 0, 0, new_region_size, allocate_pvs);
}
/* mirror -> raid0 */
@@ -7664,7 +7701,7 @@ TAKEOVER_FN(_m_r0)
{
RETURN_IF_LV_SEG_SEGTYPE_ZERO(lv, first_seg(lv), new_segtype);
- return _mirror_raid0(lv, new_segtype, yes, force, 1, 1 /* data_copies */, 0, 0, allocate_pvs);
+ return _mirror_raid0(lv, new_segtype, yes, force, 1, 1 /* data_copies */, 0, 0, 0, allocate_pvs);
}
/* mirror -> raid0_meta */
@@ -7672,7 +7709,7 @@ TAKEOVER_FN(_m_r0m)
{
RETURN_IF_LV_SEG_SEGTYPE_ZERO(lv, first_seg(lv), new_segtype);
- return _mirror_raid0(lv, new_segtype, yes, force, 1, 1 /* data_copies */, 0, 0, allocate_pvs);
+ return _mirror_raid0(lv, new_segtype, yes, force, 1, 1 /* data_copies */, 0, 0, 0, allocate_pvs);
}
/* Mirror -> raid1 */
@@ -7700,7 +7737,7 @@ TAKEOVER_FN(_m_r45)
{
RETURN_IF_LV_SEG_SEGTYPE_ZERO(lv, first_seg(lv), new_segtype);
- return _mirror_r45(lv, new_segtype, yes, force, 0, 1 /* data_copies */, 0, 0, allocate_pvs);
+ return _mirror_r45(lv, new_segtype, yes, force, 0, 1 /* data_copies */, 0, 0, new_region_size, allocate_pvs);
}
/* Mirror with 2 images -> raid10 */
@@ -7738,7 +7775,7 @@ TAKEOVER_FN(_r0_l)
{
RETURN_IF_LV_SEG_SEGTYPE_ZERO(lv, first_seg(lv), new_segtype);
- return _raid0_linear(lv, new_segtype, yes, force, 0, 1 /* data_copies */, 0, 0, allocate_pvs);
+ return _raid0_linear(lv, new_segtype, yes, force, 0, 1 /* data_copies */, 0, 0, 0, allocate_pvs);
}
/* raid0 with one image -> mirror */
@@ -7746,7 +7783,8 @@ TAKEOVER_FN(_r0_m)
{
RETURN_IF_LV_SEG_SEGTYPE_ZERO(lv, first_seg(lv), new_segtype);
- return _raid0_mirror(lv, new_segtype, yes, force, new_image_count, 1 /* data_copies */, 0, 0, allocate_pvs);
+ return _raid0_mirror(lv, new_segtype, yes, force, new_image_count,
+ 1 /* data_copies */, 0, 0, new_region_size, allocate_pvs);
}
/* raid0 -> raid0_meta */
@@ -7782,7 +7820,8 @@ TAKEOVER_FN(_r0_r1)
{
RETURN_IF_LV_SEG_SEGTYPE_ZERO(lv, first_seg(lv), new_segtype);
- return _raid0_raid1(lv, new_segtype, yes, force, new_image_count, 1 /* data_copies */, 0, 0, allocate_pvs);
+ return _raid0_raid1(lv, new_segtype, yes, force, new_image_count,
+ 1 /* data_copies */, 0, 0, new_region_size, allocate_pvs);
}
/* raid0 -> raid4/5_n */
@@ -7790,7 +7829,8 @@ TAKEOVER_FN(_r0_r45)
{
RETURN_IF_LV_SEG_SEGTYPE_ZERO(lv, first_seg(lv), new_segtype);
- return _striped_raid0_raid45610(lv, new_segtype, yes, force, first_seg(lv)->area_count + 1, 1 /* data_copies */, 0, 0, allocate_pvs);
+ return _striped_raid0_raid45610(lv, new_segtype, yes, force, first_seg(lv)->area_count + 1,
+ 1 /* data_copies */, 0, 0, new_region_size, allocate_pvs);
}
/* raid0 -> raid6_n_6 */
@@ -7798,7 +7838,8 @@ TAKEOVER_FN(_r0_r6)
{
RETURN_IF_LV_SEG_SEGTYPE_ZERO(lv, first_seg(lv), new_segtype);
- return _striped_raid0_raid45610(lv, new_segtype, yes, force, first_seg(lv)->area_count + 2, 1 /* data_copies */, 0, 0, allocate_pvs);
+ return _striped_raid0_raid45610(lv, new_segtype, yes, force, first_seg(lv)->area_count + 2,
+ 1 /* data_copies */, 0, 0, new_region_size, allocate_pvs);
}
/* raid0 with N images (N > 1) -> raid10 */
@@ -7806,7 +7847,8 @@ TAKEOVER_FN(_r0_r10)
{
RETURN_IF_LV_SEG_SEGTYPE_ZERO(lv, first_seg(lv), new_segtype);
- return _striped_raid0_raid45610(lv, new_segtype, yes, force, first_seg(lv)->area_count * new_data_copies, new_data_copies, 0, 0, allocate_pvs);
+ return _striped_raid0_raid45610(lv, new_segtype, yes, force, first_seg(lv)->area_count * new_data_copies,
+ new_data_copies, 0, 0, new_region_size, allocate_pvs);
}
/* raid0_meta -> */
@@ -7814,7 +7856,7 @@ TAKEOVER_FN(_r0m_l)
{
RETURN_IF_LV_SEG_SEGTYPE_ZERO(lv, first_seg(lv), new_segtype);
- return _raid0_linear(lv, new_segtype, yes, force, 0, 1 /* data_copies */, 0, 0, allocate_pvs);
+ return _raid0_linear(lv, new_segtype, yes, force, 0, 1 /* data_copies */, 0, 0, 0, allocate_pvs);
}
/* raid0_meta -> mirror */
@@ -7822,7 +7864,8 @@ TAKEOVER_FN(_r0m_m)
{
RETURN_IF_LV_SEG_SEGTYPE_ZERO(lv, first_seg(lv), new_segtype);
- return _raid0_mirror(lv, new_segtype, yes, force, new_image_count, 1 /* data_copies */, 0, 0, allocate_pvs);
+ return _raid0_mirror(lv, new_segtype, yes, force, new_image_count,
+ 1 /* data_copies */, 0, 0, new_region_size, allocate_pvs);
}
/* raid0_meta -> raid0 */
@@ -7862,7 +7905,8 @@ TAKEOVER_FN(_r0m_r1)
{
RETURN_IF_LV_SEG_SEGTYPE_ZERO(lv, first_seg(lv), new_segtype);
- return _raid0_raid1(lv, new_segtype, yes, force, new_image_count, 1 /* data_copies */, 0, 0, allocate_pvs);
+ return _raid0_raid1(lv, new_segtype, yes, force, new_image_count,
+ 1 /* data_copies */, 0, 0, new_region_size, allocate_pvs);
}
/* raid0_meta -> raid4/5_n */
@@ -7870,7 +7914,8 @@ TAKEOVER_FN(_r0m_r45)
{
RETURN_IF_LV_SEG_SEGTYPE_ZERO(lv, first_seg(lv), new_segtype);
- return _striped_raid0_raid45610(lv, new_segtype, yes, force, first_seg(lv)->area_count + 1, 1 /* data_copies */, 0, 0, allocate_pvs);
+ return _striped_raid0_raid45610(lv, new_segtype, yes, force, first_seg(lv)->area_count + 1,
+ 1 /* data_copies */, 0, 0, new_region_size, allocate_pvs);
}
/* raid0_meta -> raid6_n_6 */
@@ -7878,7 +7923,8 @@ TAKEOVER_FN(_r0m_r6)
{
RETURN_IF_LV_SEG_SEGTYPE_ZERO(lv, first_seg(lv), new_segtype);
- return _striped_raid0_raid45610(lv, new_segtype, yes, force, first_seg(lv)->area_count + 2, 1 /* data_copies */, 0, 0, allocate_pvs);
+ return _striped_raid0_raid45610(lv, new_segtype, yes, force, first_seg(lv)->area_count + 2,
+ 1 /* data_copies */, 0, 0, new_region_size, allocate_pvs);
}
@@ -7887,7 +7933,8 @@ TAKEOVER_FN(_r0m_r10)
{
RETURN_IF_LV_SEG_SEGTYPE_ZERO(lv, first_seg(lv), new_segtype);
- return _striped_raid0_raid45610(lv, new_segtype, yes, force, first_seg(lv)->area_count * new_data_copies, new_data_copies, 0, 0, allocate_pvs);
+ return _striped_raid0_raid45610(lv, new_segtype, yes, force, first_seg(lv)->area_count * new_data_copies,
+ new_data_copies, 0, 0, new_region_size, allocate_pvs);
}
@@ -7896,7 +7943,7 @@ TAKEOVER_FN(_r1_l)
{
RETURN_IF_LV_SEG_SEGTYPE_ZERO(lv, first_seg(lv), new_segtype);
PFL();
- return _raid14510_linear(lv, new_segtype, yes, force, 1, 1, 0, 0, allocate_pvs);
+ return _raid14510_linear(lv, new_segtype, yes, force, 1, 1, 0, 0, 0, allocate_pvs);
}
/* raid1 with N images -> striped */
@@ -7904,7 +7951,7 @@ TAKEOVER_FN(_r1_s)
{
RETURN_IF_LV_SEG_SEGTYPE_ZERO(lv, first_seg(lv), new_segtype);
PFL();
- return _raid14510_linear(lv, new_segtype, yes, force, 1, 1, 0, 0, allocate_pvs);
+ return _raid14510_linear(lv, new_segtype, yes, force, 1, 1, 0, 0, 0, allocate_pvs);
}
/* raid1 -> mirror */
@@ -7946,7 +7993,7 @@ TAKEOVER_FN(_r1_r0)
{
RETURN_IF_LV_SEG_SEGTYPE_ZERO(lv, first_seg(lv), new_segtype);
- return _raid1_raid0(lv, new_segtype, yes, force, 1, 1 /* data_copies */, 0, 0, allocate_pvs);
+ return _raid1_raid0(lv, new_segtype, yes, force, 1, 1 /* data_copies */, 0, 0, 0, allocate_pvs);
}
/* raid1 -> raid0_meta */
@@ -7954,7 +8001,7 @@ TAKEOVER_FN(_r1_r0m)
{
RETURN_IF_LV_SEG_SEGTYPE_ZERO(lv, first_seg(lv), new_segtype);
- return _raid1_raid0(lv, new_segtype, yes, force, 1, 1 /* data_copies */, 0, 0, allocate_pvs);
+ return _raid1_raid0(lv, new_segtype, yes, force, 1, 1 /* data_copies */, 0, 0, 0, allocate_pvs);
}
TAKEOVER_FN(_r1_r1)
@@ -7971,7 +8018,8 @@ TAKEOVER_FN(_r1_r1)
return 0;
}
- return _raid145_raid1_raid6(lv, new_segtype, yes, force, new_image_count, new_image_count, 0, 0, allocate_pvs);
+ return _raid145_raid1_raid6(lv, new_segtype, yes, force, new_image_count,
+ new_image_count, 0, 0, new_region_size, allocate_pvs);
}
/* raid1 with 2 legs -> raid4/5 */
@@ -7986,7 +8034,8 @@ TAKEOVER_FN(_r1_r45)
return 0;
}
- return _raid145_raid4510(lv, new_segtype, yes, force, new_image_count, 1 /* data_copies */, 0, 0, allocate_pvs);
+ return _raid145_raid4510(lv, new_segtype, yes, force, new_image_count,
+ 1 /* data_copies */, 0, 0, new_region_size, allocate_pvs);
}
/****************************************************************************/
@@ -8002,7 +8051,8 @@ TAKEOVER_FN(_r1_r10)
return 1;
}
- return _raid145_raid4510(lv, new_segtype, yes, force, new_image_count, 1 /* data_copies */, 0 /* stripes */, 0, allocate_pvs);
+ return _raid145_raid4510(lv, new_segtype, yes, force, new_image_count,
+ 1 /* data_copies */, 0 /* stripes */, 0, new_region_size, allocate_pvs);
}
/* raid45 with 2 images -> linear */
@@ -8017,7 +8067,7 @@ TAKEOVER_FN(_r45_l)
return 0;
}
- return _raid14510_linear(lv, new_segtype, yes, force, 1, 1, 0, 0, allocate_pvs);
+ return _raid14510_linear(lv, new_segtype, yes, force, 1, 1, 0, 0, 0, allocate_pvs);
}
/* raid4/5 -> striped */
@@ -8025,7 +8075,8 @@ TAKEOVER_FN(_r45_s)
{
RETURN_IF_LV_SEG_SEGTYPE_ZERO(lv, first_seg(lv), new_segtype);
PFL();
- return _r456_r0_striped(lv, new_segtype, yes, force, first_seg(lv)->area_count - 1, 1 /* data_copies */, 0, 0, allocate_pvs);
+ return _r456_r0_striped(lv, new_segtype, yes, force, first_seg(lv)->area_count - 1,
+ 1 /* data_copies */, 0, 0, 0, allocate_pvs);
}
/* raid4/5 with 2 images -> mirror */
@@ -8033,7 +8084,7 @@ TAKEOVER_FN(_r45_m)
{
RETURN_IF_LV_SEG_SEGTYPE_ZERO(lv, first_seg(lv), new_segtype);
- return _mirror_r45(lv, new_segtype, yes, force, 0, 1 /* data_copies */, 0, 0, allocate_pvs);
+ return _mirror_r45(lv, new_segtype, yes, force, 0, 1 /* data_copies */, 0, 0, new_region_size, allocate_pvs);
}
/* raid4/5 -> raid0 */
@@ -8041,7 +8092,8 @@ TAKEOVER_FN(_r45_r0)
{
RETURN_IF_LV_SEG_SEGTYPE_ZERO(lv, first_seg(lv), new_segtype);
- return _r456_r0_striped(lv, new_segtype, yes, force, first_seg(lv)->area_count - 1, 1 /* data_copies */, 0, 0, allocate_pvs);
+ return _r456_r0_striped(lv, new_segtype, yes, force, first_seg(lv)->area_count - 1,
+ 1 /* data_copies */, 0, 0, 0, allocate_pvs);
}
/* raid4/5 -> raid0_meta */
@@ -8049,7 +8101,8 @@ TAKEOVER_FN(_r45_r0m)
{
RETURN_IF_LV_SEG_SEGTYPE_ZERO(lv, first_seg(lv), new_segtype);
- return _r456_r0_striped(lv, new_segtype, yes, force, first_seg(lv)->area_count - 1, 1 /* data_copies */, 0, 0, allocate_pvs);
+ return _r456_r0_striped(lv, new_segtype, yes, force, first_seg(lv)->area_count - 1,
+ 1 /* data_copies */, 0, 0, 0, allocate_pvs);
}
/* raid4/5 with 2 images -> raid1 */
@@ -8066,7 +8119,8 @@ TAKEOVER_FN(_r45_r1)
return 0;
}
- return _raid145_raid4510(lv, new_segtype, yes, force, 2, 1 /* data_copies */, 0, 0, allocate_pvs);
+ return _raid145_raid4510(lv, new_segtype, yes, force, 2,
+ 1 /* data_copies */, 0, 0, new_region_size, allocate_pvs);
}
/* raid4 <-> raid5_n */
@@ -8134,7 +8188,8 @@ TAKEOVER_FN(_r45_r6)
return_0;
}
- return _raid145_raid1_raid6(lv, new_segtype, yes, force, seg->area_count + 1, 3 /* data_copies */, 0, 0, allocate_pvs);
+ return _raid145_raid1_raid6(lv, new_segtype, yes, force, seg->area_count + 1,
+ 3 /* data_copies */, 0, 0, new_region_size, allocate_pvs);
}
/* raid6 -> striped */
@@ -8142,7 +8197,8 @@ TAKEOVER_FN(_r6_s)
{
RETURN_IF_LV_SEG_SEGTYPE_ZERO(lv, first_seg(lv), new_segtype);
- return _r456_r0_striped(lv, new_segtype, yes, force, first_seg(lv)->area_count - 2, 1 /* data_copies */, 0, 0, allocate_pvs);
+ return _r456_r0_striped(lv, new_segtype, yes, force, first_seg(lv)->area_count - 2,
+ 1 /* data_copies */, 0, 0, 0, allocate_pvs);
}
/* raid6 -> raid0 */
@@ -8150,7 +8206,8 @@ TAKEOVER_FN(_r6_r0)
{
RETURN_IF_LV_SEG_SEGTYPE_ZERO(lv, first_seg(lv), new_segtype);
- return _r456_r0_striped(lv, new_segtype, yes, force, first_seg(lv)->area_count - 2, 1 /* data_copies */, 0, 0, allocate_pvs);
+ return _r456_r0_striped(lv, new_segtype, yes, force, first_seg(lv)->area_count - 2,
+ 1 /* data_copies */, 0, 0, 0, allocate_pvs);
}
/* raid6 -> raid0_meta */
@@ -8158,7 +8215,8 @@ TAKEOVER_FN(_r6_r0m)
{
RETURN_IF_LV_SEG_SEGTYPE_ZERO(lv, first_seg(lv), new_segtype);
- return _r456_r0_striped(lv, new_segtype, yes, force, first_seg(lv)->area_count - 2, 1 /* data_copies */, 0, 0, allocate_pvs);
+ return _r456_r0_striped(lv, new_segtype, yes, force, first_seg(lv)->area_count - 2,
+ 1 /* data_copies */, 0, 0, 0, allocate_pvs);
}
/* raid6* -> raid4/5* */
@@ -8220,7 +8278,7 @@ TAKEOVER_FN(_r10_l)
return 0;
}
- return _raid14510_linear(lv, new_segtype, yes, force, 1, 1, 0, 0, allocate_pvs);
+ return _raid14510_linear(lv, new_segtype, yes, force, 1, 1, 0, 0, 0, allocate_pvs);
}
/* raid10 -> raid0* */
@@ -8232,7 +8290,7 @@ PFL();
dm_list_init(&removal_lvs);
- return _raid10_striped_r0(lv, new_segtype, yes, 0, 0, 1 /* data_copies */, 0, 0, allocate_pvs, &removal_lvs);
+ return _raid10_striped_r0(lv, new_segtype, yes, 0, 0, 1 /* data_copies */, 0, 0, 0, allocate_pvs, &removal_lvs);
}
/* raid10 with 2 images -> mirror */
@@ -8278,7 +8336,7 @@ TAKEOVER_FN(_r10_r0)
dm_list_init(&removal_lvs);
- return _raid10_striped_r0(lv, new_segtype, yes, 0, 0, 1 /* data_copies */, 0, 0, allocate_pvs, &removal_lvs);
+ return _raid10_striped_r0(lv, new_segtype, yes, 0, 0, 1 /* data_copies */, 0, 0, 0, allocate_pvs, &removal_lvs);
}
/* raid10 -> raid0_meta */
@@ -8290,7 +8348,7 @@ TAKEOVER_FN(_r10_r0m)
dm_list_init(&removal_lvs);
- return _raid10_striped_r0(lv, new_segtype, yes, 0, 0, 1 /* data_copies */, 0, 0, allocate_pvs, &removal_lvs);
+ return _raid10_striped_r0(lv, new_segtype, yes, 0, 0, 1 /* data_copies */, 0, 0, 0, allocate_pvs, &removal_lvs);
}
/* raid10 with 2 images -> raid1 */
@@ -8299,11 +8357,10 @@ TAKEOVER_FN(_r10_r1)
struct lv_segment *seg;
RETURN_IF_LV_SEG_SEGTYPE_ZERO(lv, (seg = first_seg(lv)), new_segtype);
-
- return ((seg_is_raid10_near(seg) && seg->data_copies == seg->area_count) ||
- _lv_has_segments_with_n_areas(lv, 2)) &&
- _raid10_r1456(lv, new_segtype, yes, force, new_image_count, seg->data_copies,
- seg->area_count, 0, allocate_pvs);
+PFL();
+ return (seg_is_raid10_near(seg) && seg->data_copies == seg->area_count &&
+ _raid10_r1456(lv, new_segtype, yes, force, new_image_count, seg->data_copies,
+ seg->area_count, 0, new_region_size, allocate_pvs));
}
/* Helper: raid10_near with N images to M images (N != M) */
@@ -8433,8 +8490,8 @@ static int _lv_create_raid01_image_lvs(struct logical_volume *lv,
1 /* data_copies */, 0 /* region_size */,
stripes, stripe_size, image_extents, CHANGE_AEY,
1 /* zero */, NULL, allocate_pvs))) {
- log_error("Failed to create striped image LV %s/%s", lv->vg->name, image_name);
struct lv_list *lvl;
+
if ((lvl = find_lv_in_vg(lv->vg, image_name)))
unlink_lv_from_vg(lvl->lv);
@@ -8468,9 +8525,6 @@ err:
struct dm_list removal_lvs;
struct lv_list *lvl_array;
- log_error("Allocation of additional images failed for %s LV %s",
- lvseg_name(seg), display_lvname(lv));
-
dm_list_init(&removal_lvs);
log_debug_metadata("Removing %u new allocated image LVs", s - start);
@@ -8663,7 +8717,7 @@ TAKEOVER_FN(_r01_r10)
return 0;
return _striped_raid0_raid45610(lv, new_segtype, 1, force,
- stripes, data_copies, 0, 0, allocate_pvs);
+ stripes, data_copies, 0, 0, new_region_size, allocate_pvs);
}
/* raid10_near with any number of data_copies (stripes must be divisable by data_copies) to raid01 */
@@ -8698,14 +8752,14 @@ TAKEOVER_FN(_r10_r01)
PFL();
stripes /= seg->data_copies;
if (!_raid10_striped_r0(lv, striped_segtype, 1, 0, stripes, 1 /* data_copies */, stripes,
- seg->stripe_size, allocate_pvs, &removal_lvs))
+ seg->stripe_size, 0, allocate_pvs, &removal_lvs))
return 0;
PFL();
if (!_lv_update_reload_fns_reset_eliminate_lvs(lv, &removal_lvs, NULL))
return 0;
PFL();
return _s_r01(lv, new_segtype, 1, force,
- seg->area_count, new_data_copies, 0, 0, allocate_pvs);
+ seg->area_count, new_data_copies, 0, 0, new_region_size, allocate_pvs);
}
/* Change number of data_copies on raid01 */
@@ -8764,11 +8818,9 @@ PFL();
log_debug_metadata("Avoiding coallocation on PVs holding other sub LVs of %s",
display_lvname(lv));
- for (ss = 0; ss < s; ss++) {
- struct logical_volume *mlv = seg_metalv(seg, ss);
- if (!_avoid_pvs_with_other_images_of_lv(mlv, allocate_pvs))
+ for (ss = 0; ss < s; ss++)
+ if (!_avoid_pvs_with_other_images_of_lv(seg_metalv(seg, ss), allocate_pvs))
return 0;
- }
if (!_alloc_rmeta_for_lv_add_set_hidden(lv, s, allocate_pvs))
return 0;
@@ -9430,9 +9482,9 @@ PFLA("new_segtype=%s image_count=%u stripes=%u stripe_size=%u", new_segtype->nam
* Table driven takeover, i.e. conversions from one segment type to another
*/
tfn = _takeover_fns[_takeover_fn_idx(seg->segtype, seg->area_count)][_takeover_fn_idx(new_segtype, image_count)];
- if (!tfn(lv, new_segtype, rcp.yes, rcp.force, image_count, data_copies, stripes, stripe_size, rcp.allocate_pvs))
- return _log_possible_conversion_types(lv, new_segtype);
-
+ if (!tfn(lv, new_segtype, rcp.yes, rcp.force, image_count,
+ data_copies, stripes, stripe_size, region_size, rcp.allocate_pvs))
+ return 0;
out:
log_print_unless_silent("Logical volume %s successfully converted.", display_lvname(lv));
return 1;