diff options
author | David Teigland <teigland@redhat.com> | 2019-04-05 16:44:00 -0500 |
---|---|---|
committer | David Teigland <teigland@redhat.com> | 2019-04-05 16:44:00 -0500 |
commit | 7836e7aa1c17216ed368fda89cfc805a07efda81 (patch) | |
tree | 3b3c6bb10b0f17d24f0c7211bfe2d846d25c666f | |
parent | 6f18186bfd1a67ab0758a987ec53631bf19b0cb7 (diff) | |
download | lvm2-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.c | 30 |
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); |