diff --git a/lib/format_text/format-text.c b/lib/format_text/format-text.c index 4a9c303e4..4146e7c72 100644 --- a/lib/format_text/format-text.c +++ b/lib/format_text/format-text.c @@ -536,8 +536,10 @@ static struct volume_group *_vg_read_raw_area(struct format_instance *fid, char *desc; uint32_t wrap = 0; - if (!(mdah = raw_read_mda_header(fid->fmt, area, primary_mda))) + if (!(mdah = raw_read_mda_header(fid->fmt, area, primary_mda))) { + log_error("Failed to read vg %s from %s", vgname, dev_name(area->dev)); goto_out; + } if (!(rlocn = _read_metadata_location_vg(area, mdah, primary_mda, vgname, &precommitted))) { log_debug_metadata("VG %s not found on %s", vgname, dev_name(area->dev)); @@ -1213,6 +1215,7 @@ int read_metadata_location_summary(const struct format_type *fmt, log_debug_metadata("Metadata location on %s at %llu has offset 0.", dev_name(dev_area->dev), (unsigned long long)(dev_area->start + rlocn->offset)); + vgsummary->zero_offset = 1; return 0; } diff --git a/lib/format_text/text_label.c b/lib/format_text/text_label.c index 206ae3f2e..e65079e0f 100644 --- a/lib/format_text/text_label.c +++ b/lib/format_text/text_label.c @@ -331,16 +331,9 @@ static int _read_mda_header_and_metadata(struct metadata_area *mda, void *baton) struct mda_header *mdah; struct lvmcache_vgsummary vgsummary = { 0 }; - /* - * Using the labeller struct to preserve info about - * the last parsed vgname, vgid, creation host - * - * TODO: make lvmcache smarter and move this cache logic there - */ - if (!(mdah = raw_read_mda_header(fmt, &mdac->area, mda_is_primary(mda)))) { - stack; - goto close_dev; + log_error("Failed to read mda header from %s", dev_name(mdac->area.dev)); + goto fail; } mda_set_ignored(mda, rlocn_is_ignored(mdah->raw_locns)); @@ -352,14 +345,25 @@ static int _read_mda_header_and_metadata(struct metadata_area *mda, void *baton) return 1; } - if (read_metadata_location_summary(fmt, mdah, mda_is_primary(mda), &mdac->area, &vgsummary, - &mdac->free_sectors) && - !lvmcache_update_vgname_and_id(p->info, &vgsummary)) { - return_0; + if (!read_metadata_location_summary(fmt, mdah, mda_is_primary(mda), &mdac->area, + &vgsummary, &mdac->free_sectors)) { + if (vgsummary.zero_offset) + return 1; + + log_error("Failed to read metadata summary from %s", dev_name(mdac->area.dev)); + goto fail; + } + + if (!lvmcache_update_vgname_and_id(p->info, &vgsummary)) { + log_error("Failed to save lvm summary for %s", dev_name(mdac->area.dev)); + goto fail; } -close_dev: return 1; + +fail: + lvmcache_del(p->info); + return 0; } static int _text_read(struct labeller *l, struct device *dev, void *label_buf, @@ -434,10 +438,12 @@ out: baton.info = info; baton.label = *label; - lvmcache_foreach_mda(info, _read_mda_header_and_metadata, &baton); + if (!lvmcache_foreach_mda(info, _read_mda_header_and_metadata, &baton)) { + log_error("Failed to scan VG from %s", dev_name(dev)); + return 0; + } lvmcache_make_valid(info); - return 1; }