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:
parent
fc6330c1a8
commit
03653a0a57
@ -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"
|
||||
|
@ -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.
|
||||
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user