1
0
mirror of git://sourceware.org/git/lvm2.git synced 2025-01-02 01:18:26 +03:00

pvscan: fix PV online when device has a different size

Fix commit 7836e7aa1c
"pvscan: ignore device with incorrect size"

which caused pvscan to not consider a PV online (for purposes
of event based activation) if the PV and device sizes differed.

This helped to avoid mistaking MD components for PVs, and is
replaced by triggering an md component check when PV and device
sizes differ (which happens in set_pv_device).
This commit is contained in:
David Teigland 2019-07-09 13:45:09 -05:00
parent f17353e3e6
commit b16abb3816

View File

@ -621,6 +621,16 @@ static int _online_pvscan_one(struct cmd_context *cmd, struct device *dev,
set_pv_devices(baton.fid, baton.vg);
}
/* This check repeated because set_pv_devices can do new md check. */
if (dev->flags & DEV_IS_MD_COMPONENT) {
log_print("pvscan[%d] PV %s ignore MD component, ignore metadata.", getpid(), dev_name(dev));
if (baton.vg)
release_vg(baton.vg);
else
fmt->ops->destroy_instance(baton.fid);
return 1;
}
if (baton.vg && vg_is_shared(baton.vg)) {
log_print("pvscan[%d] PV %s ignore shared VG.", getpid(), dev_name(dev));
release_vg(baton.vg);
@ -638,36 +648,6 @@ 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);
/*