summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Teigland <teigland@redhat.com>2019-04-05 16:44:00 -0500
committerDavid Teigland <teigland@redhat.com>2019-04-05 16:44:00 -0500
commit7836e7aa1c17216ed368fda89cfc805a07efda81 (patch)
tree3b3c6bb10b0f17d24f0c7211bfe2d846d25c666f
parent6f18186bfd1a67ab0758a987ec53631bf19b0cb7 (diff)
downloadlvm2-7836e7aa1c17216ed368fda89cfc805a07efda81.tar.gz
pvscan: ignore device with incorrect size
If a device looks like a PV, but its size does not match the PV size in the metadata, then skip it for purposes of autoactivation. It's probably not wrong device for the PV.
-rw-r--r--tools/pvscan.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/tools/pvscan.c b/tools/pvscan.c
index 376919bb1..6a464907b 100644
--- a/tools/pvscan.c
+++ b/tools/pvscan.c
@@ -624,6 +624,36 @@ static int _online_pvscan_one(struct cmd_context *cmd, struct device *dev,
return 1;
}
+ /*
+ * Do not consider a device online (for purposes of autoactivation)
+ * if its size does not match the PV size recorded in the metadata.
+ * It may mean that it's not the correct dev for the PV, e.g. it
+ * could be an md component device that's not been filtered.
+ */
+ if (baton.vg && cmd->check_pv_dev_sizes) {
+ struct pv_list *pvl;
+ uint64_t dev_size = 0;
+ uint64_t meta_pv_size = 0;
+
+ dm_list_iterate_items(pvl, &baton.vg->pvs) {
+ if (pvl->pv->dev != dev)
+ continue;
+
+ if (!dev_get_size(dev, &dev_size))
+ stack;
+ meta_pv_size = pv_size(pvl->pv);
+ break;
+ }
+
+ if (dev_size != meta_pv_size) {
+ log_print("pvscan[%d] PV %s ignore for size %llu not matching device %llu.",
+ getpid(), dev_name(dev),
+ (unsigned long long)meta_pv_size, (unsigned long long)dev_size);
+ release_vg(baton.vg);
+ return 1;
+ }
+ }
+
ret = _online_pv_found(cmd, dev, dev_args, baton.vg, found_vgnames);
release_vg(baton.vg);