diff options
author | Heinz Mauelshagen <heinzm@redhat.com> | 2016-02-24 01:51:10 +0100 |
---|---|---|
committer | Heinz Mauelshagen <heinzm@redhat.com> | 2016-02-24 01:51:10 +0100 |
commit | e385774242387bd25eedc005efec46a083ae8bd8 (patch) | |
tree | 132bc631c7cb3b23012a03fea8ca848074a99341 | |
parent | 913911074599f13e1d52ebcaf5b0ca4b264b6b28 (diff) | |
download | lvm2-e385774242387bd25eedc005efec46a083ae8bd8.tar.gz |
raid_manip: handle match_count properly in lv_raid_replace()
-rw-r--r-- | lib/metadata/lv_manip.c | 10 | ||||
-rw-r--r-- | lib/metadata/raid_manip.c | 14 | ||||
-rw-r--r-- | lib/misc/lib.h | 4 |
3 files changed, 13 insertions, 15 deletions
diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c index 1a19ca670..4788b00fa 100644 --- a/lib/metadata/lv_manip.c +++ b/lib/metadata/lv_manip.c @@ -4705,7 +4705,7 @@ static int _rename_sub_lv(struct logical_volume *lv, * The suffix follows lv_name_old and includes '_'. */ len = strlen(lv_name_old); -PFLA("lv=%s lv_name_old=%s lv_name_new=%s len=%d", display_lvname(lv), lv_name_old, lv_name_new, len); +PFLA("lv=%s lv_name_old=%s lv_name_new=%s len=%u", display_lvname(lv), lv_name_old, lv_name_new, len); if (strncmp(lv->name, lv_name_old, len) || lv->name[len] != '_') { log_error("Cannot rename \"%s\": name format not recognized " "for internal LV \"%s\"", @@ -4770,7 +4770,6 @@ static int _for_each_sub_lv(struct logical_volume *lv, int skip_pools, dm_list_iterate_items(seg, &lv->segments) { if (seg->log_lv) { -PFL(); if (!fn(seg->log_lv, data)) return_0; if (!for_each_sub_lv(seg->log_lv, fn, data)) @@ -4779,7 +4778,6 @@ PFL(); if (!seg_is_thin(seg) && !seg_is_raid(seg)) { if (seg->metadata_lv) { -PFL(); if (!fn(seg->metadata_lv, data)) return_0; if (!for_each_sub_lv(seg->metadata_lv, fn, data)) @@ -4787,7 +4785,6 @@ PFL(); } if (seg->pool_lv && !skip_pools) { -PFL(); if (!fn(seg->pool_lv, data)) return_0; if (!for_each_sub_lv(seg->pool_lv, fn, data)) @@ -4796,7 +4793,6 @@ PFL(); } for (s = 0; s < seg->area_count; s++) { -PFL(); if (seg_type(seg, s) != AREA_LV) continue; if (!fn(seg_lv(seg, s), data)) @@ -4804,14 +4800,11 @@ PFL(); if (!for_each_sub_lv(seg_lv(seg, s), fn, data)) return_0; } -PFL(); if (!seg_is_raid(seg) || !seg->meta_areas) continue; -PFL(); /* RAID has meta_areas */ for (s = 0; s < seg->area_count; s++) { -PFL(); if (seg_metatype(seg, s) != AREA_LV) continue; if (!fn(seg_metalv(seg, s), data)) @@ -4820,7 +4813,6 @@ PFL(); return_0; } } -PFL(); return 1; } diff --git a/lib/metadata/raid_manip.c b/lib/metadata/raid_manip.c index c6c8fa714..a819c640c 100644 --- a/lib/metadata/raid_manip.c +++ b/lib/metadata/raid_manip.c @@ -9776,6 +9776,8 @@ static int _resilient_replacement(struct logical_volume *lv, struct lv_segment *seg; RETURN_IF_LV_SEG_ZERO(lv, (seg = first_seg(lv))); + RETURN_IF_ZERO(match_count, "match_count pointer argument"); + RETURN_IF_ZERO(partial_lvs, "partial_vs pointer argument"); RETURN_IF_ZERO(remove_pvs , "remove pvs list argument"); RETURN_IF_NONZERO(dm_list_empty(remove_pvs), "remove pvs listed"); @@ -9795,12 +9797,12 @@ static int _resilient_replacement(struct logical_volume *lv, pv_mc++; } -PFLA("lv_mc=%u pv_mc=%u", lv_mc, pv_mc); +PFLA("lv=%s lv_mc=%u pv_mc=%u area_count=%u", display_lvname(lv), lv_mc, pv_mc, seg->area_count); if (!(lv_mc + pv_mc)) { log_warn("%s does not contain devices specified" " for replacement", display_lvname(lv)); - return 0; + return 1; } else if (lv_mc == seg->area_count) { log_error("Unable to replace PVs in all %s of %s at once.", @@ -10014,7 +10016,8 @@ static int _replace_failed_areas(struct logical_volume *top_lv, struct lv_segment *seg; RETURN_IF_LV_SEG_ZERO(replace_lv, (seg = first_seg(replace_lv))); - RETURN_IF_ZERO(match_count, "match count"); + if (!match_count) + return 0; PFLA("top_lv=%s replace_lv=%s data_lv=%s", display_lvname(top_lv), display_lvname(replace_lv), data_lv ? display_lvname(data_lv) : ""); @@ -10132,7 +10135,7 @@ static int _lv_raid_replace(struct logical_volume *top_lv, struct dm_list *allocate_pvs, int recursive) { - uint32_t match_count = 0, partial_lvs = 0, s, zero = 0; + uint32_t match_count, partial_lvs = 0, s, zero = 0; struct lv_segment *seg; struct volume_group *vg; @@ -10175,6 +10178,9 @@ PFLA("top_lv=%s replace_lv=%s", display_lvname(top_lv), display_lvname(replace_l /* How many image component pairs/areas are being removed (none ok) ? */ if (!_resilient_replacement(replace_lv, yes, &match_count, &partial_lvs, remove_pvs)) + return 0; + + if (!match_count) return 1; /* Recurse into sub LVs in case of a duplicating one */ diff --git a/lib/misc/lib.h b/lib/misc/lib.h index b9dfb451a..c0eaea14c 100644 --- a/lib/misc/lib.h +++ b/lib/misc/lib.h @@ -26,8 +26,8 @@ /* HM FIXME: REMOVEME: devel output */ #if 1 -#define PFL() printf("%s %u\n", __func__, __LINE__); -#define PFLA(format, arg...) printf("%s %u " format "\n", __func__, __LINE__, arg); +#define PFL() fprintf(stderr, "%s %u\n", __func__, __LINE__); +#define PFLA(format, arg...) fprintf(stderr, "%s %u " format "\n", __func__, __LINE__, arg); #else #define PFL() ; #define PFLA(format, arg...) ; |