diff options
author | Heinz Mauelshagen <heinzm@redhat.com> | 2016-02-06 14:22:06 +0100 |
---|---|---|
committer | Heinz Mauelshagen <heinzm@redhat.com> | 2016-02-06 14:22:06 +0100 |
commit | e3a06ed0a58d6911152da6db17164ff34897b6a4 (patch) | |
tree | 9395df9d4b3b44194b3f60250716d206652bd08b | |
parent | 9433958318a424f0c5646c2672b0da40f7d81a10 (diff) | |
download | lvm2-e3a06ed0a58d6911152da6db17164ff34897b6a4.tar.gz |
lv_manip: more resizing fixes
-rw-r--r-- | lib/metadata/lv_manip.c | 52 | ||||
-rw-r--r-- | lib/metadata/merge.c | 2 | ||||
-rw-r--r-- | lib/metadata/raid_manip.c | 8 |
3 files changed, 27 insertions, 35 deletions
diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c index 8b8bc6e06..7efb08e46 100644 --- a/lib/metadata/lv_manip.c +++ b/lib/metadata/lv_manip.c @@ -1401,15 +1401,21 @@ static int _is_layered_lv(struct logical_volume *lv, uint32_t s) /* Find smallest one of any sub lvs of @seg */ static uint32_t _seg_smallest_sub_lv(struct lv_segment *seg) { - uint32_t r = ~0U, s, lvs = 0; + uint32_t cl, r = ~0U, s, lvs = 0; + struct logical_volume *lv1; + struct lv_segment *seg1; /* Find smallest LV and use that for length of top-level LV */ for (s = 0; s < seg->area_count; s++) { if (seg_type(seg, s) == AREA_LV) { - lvs++; + lv1 = seg_lv(seg, s); + if ((seg1 = first_seg(lv1))) { + lvs++; - if (seg_lv(seg, s)->le_count < r) - r = seg_lv(seg, s)->le_count; + cl = lv1->le_count - seg1->reshape_len * (seg1->area_count - seg1->segtype->parity_devs); + if (cl < r) + r = cl; + } } } @@ -1437,17 +1443,14 @@ PFLA("lv=%s lv->le_count=%u seg=%p extents=%u stripes=%u data_copies=%u delete=% if (!dont_recurse) { for (s = 0; s < seg->area_count; s++) { if (_is_layered_lv(lv, s)) { - uint32_t sub_lv_extents; struct logical_volume *lv1 = seg_lv(seg, s); struct lv_segment *seg1 = last_seg(lv1); + uint32_t sub_lv_extents = lv1->le_count; - if (delete) - sub_lv_extents = lv1->le_count; - else - sub_lv_extents = lv1->le_count - _round_to_stripe_boundary(lv1, lv1->le_count - extents, - seg1->area_count - seg1->segtype->parity_devs, - 0 /* reduce */); - + if (!delete) + sub_lv_extents -= _round_to_stripe_boundary(lv1, lv1->le_count - extents, + seg1->area_count - seg1->segtype->parity_devs, + 0 /* reduce */); PFLA("recursive seg_lv(seg, %u)=%s", s, display_lvname(lv1)); if (!_lv_reduce(lv1, sub_lv_extents, delete)) return_0; @@ -1666,10 +1669,12 @@ int lv_reduce(struct logical_volume *lv, uint32_t extents) { int delete = (extents == lv->le_count ? 1 : 0); +#if 0 if (!delete && !lv_raid_in_sync(lv)) { - log_error("RAID LV %s has to be in-sync to extend its size!", display_lvname(lv)); + log_error("RAID LV %s has to be in-sync to reduce its size!", display_lvname(lv)); return 0; } +#endif return _lv_reduce(lv, extents, delete); } @@ -4457,13 +4462,6 @@ int lv_extend(struct logical_volume *lv, return 0; } - /* Should be ensured by the caller... */ -#if 0 - if (!segtype_is_raid01(segtype) && - (segtype_is_mirrored(segtype) || segtype_is_raid1(segtype))) - stripes = 1; -#endif - log_very_verbose("Adding segment of type %s to LV %s.", segtype->name, display_lvname(lv)); PFLA("extents=%u", extents); /* Check for multi-level stack (e.g. extension of a duplicated LV stack) */ @@ -4477,14 +4475,9 @@ PFLA("extents=%u", extents); struct lv_segment *seg1 = last_seg(lv1); stripes1 = seg1->area_count - seg1->segtype->parity_devs; - sub_lv_extents = _round_to_stripe_boundary(lv1, lv->le_count + extents, stripes1, 1 /* extend */); - if (sub_lv_extents < lv->le_count) - return_0; - - sub_lv_extents -= lv1->le_count; + sub_lv_extents = _round_to_stripe_boundary(lv1, lv1->le_count + extents, stripes1, 1 /* extend */) - lv1->le_count; PFLA("recursive seg_lv(seg, %u)=%s extents=%u", s, display_lvname(lv1), extents); - if (sub_lv_extents + lv->le_count > lv1->le_count && - !lv_extend(lv1, seg1->segtype, stripes1, seg1->stripe_size, + if (!lv_extend(lv1, seg1->segtype, stripes1, seg1->stripe_size, seg1->data_copies, seg1->region_size, sub_lv_extents, allocatable_pvs, alloc, approx_alloc)) return_0; @@ -4494,9 +4487,8 @@ PFLA("recursive seg_lv(seg, %u)=%s extents=%u", s, display_lvname(lv1), extents) } if (extended) { - seg->len = _seg_smallest_sub_lv(seg); // + seg->reshape_len; - seg->area_len = _seg_area_len(seg, seg->len); // + seg->reshape_len; - // seg->len += seg->reshape_len; + seg->len = _seg_smallest_sub_lv(seg); + seg->area_len = _seg_area_len(seg, seg->len); lv->le_count = seg->len; lv->size = (uint64_t) lv->le_count * lv->vg->extent_size; return 1; diff --git a/lib/metadata/merge.c b/lib/metadata/merge.c index d5f17d6d2..34aab617b 100644 --- a/lib/metadata/merge.c +++ b/lib/metadata/merge.c @@ -1,6 +1,6 @@ /* * Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved. - * Copyright (C) 2004-2007 Red Hat, Inc. All rights reserved. + * Copyright (C) 2004-2016 Red Hat, Inc. All rights reserved. * * This file is part of LVM2. * diff --git a/lib/metadata/raid_manip.c b/lib/metadata/raid_manip.c index 4262204b2..30c1a375f 100644 --- a/lib/metadata/raid_manip.c +++ b/lib/metadata/raid_manip.c @@ -4350,7 +4350,7 @@ PFLA("lv->size=%s seg->len=%u seg->area_len=%u seg->area_count=%u old_image_coun /* * HM Helper: * - * Reshape: add disks to existing raid lv + * Reshape: add immages to existing raid lv * */ static int _raid_reshape_add_images(struct logical_volume *lv, @@ -4436,7 +4436,7 @@ PFLA("seg_lv(seg, %u)=%s", s, display_lvname(slv)); /* * HM Helper: * - * Reshape: remove disks from existing raid lv + * Reshape: remove images from existing raid lv * */ static int _raid_reshape_remove_images(struct logical_volume *lv, @@ -4682,7 +4682,7 @@ static int _lv_raid10_resize_data_copies(struct logical_volume *lv, /* * HM Helper: * - * Reshape: keep disks in RAID @lv but change stripe size or data copies + * Reshape: keep images in RAID @lv but change stripe size or data copies * */ static int _raid_reshape_keep_images(struct logical_volume *lv, @@ -4768,7 +4768,7 @@ static int _activate_sub_lvs(struct logical_volume *lv, uint32_t start_idx) return 0; } - return activate_lv_excl_local(cmd, lv); + // return activate_lv_excl_local(cmd, lv); return 1; } |