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

vgchange: allow changing system ID with majority of PVs

when used with --majoritypvs.  This allows the fail-over
of a VG between systems (by changing the VG system ID)
when a PV is missing.
This commit is contained in:
David Teigland 2022-07-07 16:06:01 -05:00
parent fc6330c1a8
commit 03653a0a57
3 changed files with 26 additions and 0 deletions

View File

@ -390,6 +390,10 @@ arg(logonly_ARG, '\0', "logonly", 0, 0, 0,
arg(longhelp_ARG, '\0', "longhelp", 0, 0, 0,
"Display long help text.\n")
arg(majoritypvs_ARG, '\0', "majoritypvs", 0, 0, 0,
"Change the VG system ID if the majority of PVs in the VG\n"
"are present (one more than half).\n")
arg(maxrecoveryrate_ARG, '\0', "maxrecoveryrate", sizekb_VAL, 0, 0,
"Sets the maximum recovery rate for a RAID LV. The rate value\n"
"is an amount of data per second for each device in the array.\n"

View File

@ -1766,6 +1766,7 @@ ID: vgchange_refresh
DESC: Reactivate LVs using the latest metadata.
vgchange --systemid String VG
OO: --majoritypvs
ID: vgchange_systemid
DESC: Change the system ID of a VG.

View File

@ -1344,6 +1344,24 @@ static int _vgchange_systemid_single(struct cmd_context *cmd, const char *vg_nam
struct volume_group *vg,
struct processing_handle *handle)
{
if (arg_is_set(cmd, majoritypvs_ARG)) {
struct pv_list *pvl;
int missing_pvs = 0;
int found_pvs = 0;
dm_list_iterate_items(pvl, &vg->pvs) {
if (!pvl->pv->dev)
missing_pvs++;
else
found_pvs++;
}
if (found_pvs <= missing_pvs) {
log_error("Cannot change system ID without the majority of PVs (found %d of %d)",
found_pvs, found_pvs+missing_pvs);
return ECMD_FAILED;
}
}
if (!_vgchange_system_id(cmd, vg))
return_ECMD_FAILED;
@ -1376,6 +1394,9 @@ int vgchange_systemid_cmd(struct cmd_context *cmd, int argc, char **argv)
return ECMD_FAILED;
}
if (arg_is_set(cmd, majoritypvs_ARG))
cmd->handles_missing_pvs = 1;
ret = process_each_vg(cmd, argc, argv, NULL, NULL, READ_FOR_UPDATE, 0, handle, &_vgchange_systemid_single);
destroy_processing_handle(cmd, handle);