summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Teigland <teigland@redhat.com>2019-05-02 16:54:28 -0500
committerDavid Teigland <teigland@redhat.com>2019-05-03 14:39:42 -0500
commit1e9e21a171db49b75e1c7276b05ef2959a340c4e (patch)
tree5ceec35d8be29fbe5ae8b063a9f571fc11fa3aed
parent607858538132a33a27039e0ff4796b1a7d9f4f32 (diff)
downloadlvm2-1e9e21a171db49b75e1c7276b05ef2959a340c4e.tar.gz
pvscan: don't record PV online after error reading metadata
-rw-r--r--tools/pvscan.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/tools/pvscan.c b/tools/pvscan.c
index d3b2b8e5c..e38910654 100644
--- a/tools/pvscan.c
+++ b/tools/pvscan.c
@@ -511,6 +511,7 @@ struct _pvscan_baton {
struct cmd_context *cmd;
struct volume_group *vg;
struct format_instance *fid;
+ int mda_read_errors;
};
static int _online_pvscan_single(struct metadata_area *mda, void *baton)
@@ -518,9 +519,13 @@ static int _online_pvscan_single(struct metadata_area *mda, void *baton)
struct _pvscan_baton *b = baton;
struct volume_group *vg;
- if (mda_is_ignored(mda) ||
- !(vg = mda->ops->vg_read(b->fid, "", mda, NULL, NULL)))
+ if (mda_is_ignored(mda))
return 1;
+ vg = mda->ops->vg_read(b->fid, "", mda, NULL, NULL);
+ if (!vg) {
+ b->mda_read_errors++;
+ return 1;
+ }
/* FIXME Also ensure contents match etc. */
if (!b->vg || vg->seqno > b->vg->seqno)
@@ -586,6 +591,7 @@ static int _online_pvscan_one(struct cmd_context *cmd, struct device *dev,
fmt = lvmcache_fmt(info);
+ memset(&baton, 0, sizeof(baton));
baton.cmd = cmd;
baton.vg = NULL;
baton.fid = fmt->ops->create_instance(fmt, &fic);
@@ -597,6 +603,16 @@ static int _online_pvscan_one(struct cmd_context *cmd, struct device *dev,
lvmcache_foreach_mda(info, _online_pvscan_single, &baton);
+ if (baton.mda_read_errors) {
+ /* Don't record the PV as online if there are errors reading the vg. */
+ log_print("pvscan[%d] PV %s ignore for metadata processing error.", getpid(), dev_name(dev));
+ if (baton.vg)
+ release_vg(baton.vg);
+ else
+ fmt->ops->destroy_instance(baton.fid);
+ return 1;
+ }
+
if (!baton.vg) {
if (pvid_without_metadata)
*pvid_without_metadata = dm_pool_strdup(cmd->mem, dev->pvid);