diff options
author | David Teigland <teigland@redhat.com> | 2019-05-02 16:54:28 -0500 |
---|---|---|
committer | David Teigland <teigland@redhat.com> | 2019-05-03 14:39:42 -0500 |
commit | 1e9e21a171db49b75e1c7276b05ef2959a340c4e (patch) | |
tree | 5ceec35d8be29fbe5ae8b063a9f571fc11fa3aed | |
parent | 607858538132a33a27039e0ff4796b1a7d9f4f32 (diff) | |
download | lvm2-1e9e21a171db49b75e1c7276b05ef2959a340c4e.tar.gz |
pvscan: don't record PV online after error reading metadata
-rw-r--r-- | tools/pvscan.c | 20 |
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); |