summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHeinz Mauelshagen <heinzm@redhat.com>2016-02-24 01:51:10 +0100
committerHeinz Mauelshagen <heinzm@redhat.com>2016-02-24 01:51:10 +0100
commite385774242387bd25eedc005efec46a083ae8bd8 (patch)
tree132bc631c7cb3b23012a03fea8ca848074a99341
parent913911074599f13e1d52ebcaf5b0ca4b264b6b28 (diff)
downloadlvm2-e385774242387bd25eedc005efec46a083ae8bd8.tar.gz
raid_manip: handle match_count properly in lv_raid_replace()
-rw-r--r--lib/metadata/lv_manip.c10
-rw-r--r--lib/metadata/raid_manip.c14
-rw-r--r--lib/misc/lib.h4
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...) ;