1
0
mirror of git://sourceware.org/git/lvm2.git synced 2025-03-10 16:58:47 +03:00

Add --maxphysicalvolumes to vgchange.

This commit is contained in:
Alasdair Kergon 2006-08-16 14:41:42 +00:00
parent 64c8457976
commit e95d828454
4 changed files with 75 additions and 7 deletions

View File

@ -1,5 +1,6 @@
Version 2.02.09 - Version 2.02.09 -
================================== ==================================
Add --maxphysicalvolumes to vgchange.
Version 2.02.08 - 15th August 2006 Version 2.02.08 - 15th August 2006
================================== ==================================

View File

@ -16,6 +16,8 @@ vgchange \- change attributes of a volume group
.RB [ \-\-ignorelockingfailure] .RB [ \-\-ignorelockingfailure]
.RB [ \-l | \-\-logicalvolume .RB [ \-l | \-\-logicalvolume
.IR MaxLogicalVolumes ] .IR MaxLogicalVolumes ]
.RB [ -p | \-\-maxphysicalvolumes
.IR MaxPhysicalVolumes ]
.RB [ \-P | \-\-partial] .RB [ \-P | \-\-partial]
.RB [ \-s | \-\-physicalextentsize .RB [ \-s | \-\-physicalextentsize
.IR PhysicalExtentSize [ \fBkKmMgGtT\fR ]] .IR PhysicalExtentSize [ \fBkKmMgGtT\fR ]]
@ -61,6 +63,18 @@ exclusively because they can only be used on one node at once.
Changes the maximum logical volume number of an existing inactive Changes the maximum logical volume number of an existing inactive
volume group. volume group.
.TP .TP
.BR \-p ", " \-\-maxphysicalvolumes " " \fIMaxPhysicalVolumes\fR
Changes the maximum number of physical volumes that can belong
to this volume group.
For volume groups with metadata in lvm1 format, the limit is 255.
If the metadata uses lvm2 format, the value 0
removes this restriction: there is then no limit.
If you have a large number of physical volumes in
a volume group with metadata in lvm2 format,
for tool performance reasons, you should consider
some use of \fB--metadatacopies 0\fP
as described in \fBpvcreate(8)\fP.
.TP
.BR \-s ", " \-\-physicalextentsize " " \fIPhysicalExtentSize\fR[\fBkKmMgGtT\fR] .BR \-s ", " \-\-physicalextentsize " " \fIPhysicalExtentSize\fR[\fBkKmMgGtT\fR]
Changes the physical extent size on physical volumes of this volume group. Changes the physical extent size on physical volumes of this volume group.
A size suffix (k for kilobytes up to t for terabytes) is optional, megabytes A size suffix (k for kilobytes up to t for terabytes) is optional, megabytes

View File

@ -607,6 +607,7 @@ xx(vgchange,
"\t -c|--clustered {y|n} |" "\n" "\t -c|--clustered {y|n} |" "\n"
"\t -x|--resizeable {y|n} |" "\n" "\t -x|--resizeable {y|n} |" "\n"
"\t -l|--logicalvolume MaxLogicalVolumes |" "\n" "\t -l|--logicalvolume MaxLogicalVolumes |" "\n"
"\t -p|--maxphysicalvolumes MaxPhysicalVolumes |" "\n"
"\t -s|--physicalextentsize PhysicalExtentSize[kKmMgGtT] |" "\n" "\t -s|--physicalextentsize PhysicalExtentSize[kKmMgGtT] |" "\n"
"\t --addtag Tag |\n" "\t --addtag Tag |\n"
"\t --deltag Tag}\n" "\t --deltag Tag}\n"
@ -614,8 +615,8 @@ xx(vgchange,
addtag_ARG, alloc_ARG, allocation_ARG, autobackup_ARG, available_ARG, addtag_ARG, alloc_ARG, allocation_ARG, autobackup_ARG, available_ARG,
clustered_ARG, deltag_ARG, ignorelockingfailure_ARG, logicalvolume_ARG, clustered_ARG, deltag_ARG, ignorelockingfailure_ARG, logicalvolume_ARG,
monitor_ARG, partial_ARG, physicalextentsize_ARG, resizeable_ARG, maxphysicalvolumes_ARG, monitor_ARG, partial_ARG, physicalextentsize_ARG,
resizable_ARG, test_ARG, uuid_ARG) resizeable_ARG, resizable_ARG, test_ARG, uuid_ARG)
xx(vgck, xx(vgck,
"Check the consistency of volume group(s)", "Check the consistency of volume group(s)",

View File

@ -312,7 +312,7 @@ static int _vgchange_logicalvolume(struct cmd_context *cmd,
if (max_lv && max_lv < vg->lv_count) { if (max_lv && max_lv < vg->lv_count) {
log_error("MaxLogicalVolume is less than the current number " log_error("MaxLogicalVolume is less than the current number "
"%d of logical volume(s) for \"%s\"", vg->lv_count, "%d of LVs for \"%s\"", vg->lv_count,
vg->name); vg->name);
return ECMD_FAILED; return ECMD_FAILED;
} }
@ -332,6 +332,53 @@ static int _vgchange_logicalvolume(struct cmd_context *cmd,
return ECMD_PROCESSED; return ECMD_PROCESSED;
} }
static int _vgchange_physicalvolumes(struct cmd_context *cmd,
struct volume_group *vg)
{
uint32_t max_pv = arg_uint_value(cmd, maxphysicalvolumes_ARG, 0);
if (!(vg->status & RESIZEABLE_VG)) {
log_error("Volume group \"%s\" must be resizeable "
"to change MaxPhysicalVolumes", vg->name);
return ECMD_FAILED;
}
if (arg_sign_value(cmd, maxphysicalvolumes_ARG, 0) == SIGN_MINUS) {
log_error("MaxPhysicalVolumes may not be negative");
return EINVALID_CMD_LINE;
}
if (!(vg->fid->fmt->features & FMT_UNLIMITED_VOLS)) {
if (!max_pv)
max_pv = 255;
else if (max_pv > 255) {
log_error("MaxPhysicalVolume limit is 255");
return ECMD_FAILED;
}
}
if (max_pv && max_pv < vg->pv_count) {
log_error("MaxPhysicalVolumes is less than the current number "
"%d of PVs for \"%s\"", vg->pv_count,
vg->name);
return ECMD_FAILED;
}
if (!archive(vg))
return ECMD_FAILED;
vg->max_pv = max_pv;
if (!vg_write(vg) || !vg_commit(vg))
return ECMD_FAILED;
backup(vg);
log_print("Volume group \"%s\" successfully changed", vg->name);
return ECMD_PROCESSED;
}
static int _vgchange_pesize(struct cmd_context *cmd, struct volume_group *vg) static int _vgchange_pesize(struct cmd_context *cmd, struct volume_group *vg)
{ {
uint32_t extent_size; uint32_t extent_size;
@ -508,6 +555,9 @@ static int vgchange_single(struct cmd_context *cmd, const char *vg_name,
else if (arg_count(cmd, logicalvolume_ARG)) else if (arg_count(cmd, logicalvolume_ARG))
r = _vgchange_logicalvolume(cmd, vg); r = _vgchange_logicalvolume(cmd, vg);
else if (arg_count(cmd, maxphysicalvolumes_ARG))
r = _vgchange_physicalvolumes(cmd, vg);
else if (arg_count(cmd, addtag_ARG)) else if (arg_count(cmd, addtag_ARG))
r = _vgchange_tag(cmd, vg, addtag_ARG); r = _vgchange_tag(cmd, vg, addtag_ARG);
@ -533,24 +583,26 @@ int vgchange(struct cmd_context *cmd, int argc, char **argv)
{ {
if (! if (!
(arg_count(cmd, available_ARG) + arg_count(cmd, logicalvolume_ARG) + (arg_count(cmd, available_ARG) + arg_count(cmd, logicalvolume_ARG) +
arg_count(cmd, maxphysicalvolumes_ARG) +
arg_count(cmd, resizeable_ARG) + arg_count(cmd, deltag_ARG) + arg_count(cmd, resizeable_ARG) + arg_count(cmd, deltag_ARG) +
arg_count(cmd, addtag_ARG) + arg_count(cmd, uuid_ARG) + arg_count(cmd, addtag_ARG) + arg_count(cmd, uuid_ARG) +
arg_count(cmd, physicalextentsize_ARG) + arg_count(cmd, physicalextentsize_ARG) +
arg_count(cmd, clustered_ARG) + arg_count(cmd, alloc_ARG) + arg_count(cmd, clustered_ARG) + arg_count(cmd, alloc_ARG) +
arg_count(cmd, monitor_ARG))) { arg_count(cmd, monitor_ARG))) {
log_error("One of -a, -c, -l, -s, -x, --uuid, --alloc, --addtag or " log_error("One of -a, -c, -l, -p, -s, -x, --uuid, --alloc, "
"--deltag required"); "--addtag or --deltag required");
return EINVALID_CMD_LINE; return EINVALID_CMD_LINE;
} }
/* FIXME Cope with several changes at once! */ /* FIXME Cope with several changes at once! */
if (arg_count(cmd, available_ARG) + arg_count(cmd, logicalvolume_ARG) + if (arg_count(cmd, available_ARG) + arg_count(cmd, logicalvolume_ARG) +
arg_count(cmd, maxphysicalvolumes_ARG) +
arg_count(cmd, resizeable_ARG) + arg_count(cmd, deltag_ARG) + arg_count(cmd, resizeable_ARG) + arg_count(cmd, deltag_ARG) +
arg_count(cmd, addtag_ARG) + arg_count(cmd, alloc_ARG) + arg_count(cmd, addtag_ARG) + arg_count(cmd, alloc_ARG) +
arg_count(cmd, uuid_ARG) + arg_count(cmd, clustered_ARG) + arg_count(cmd, uuid_ARG) + arg_count(cmd, clustered_ARG) +
arg_count(cmd, physicalextentsize_ARG) > 1) { arg_count(cmd, physicalextentsize_ARG) > 1) {
log_error("Only one of -a, -c, -l, -s, -x, --uuid, --alloc, " log_error("Only one of -a, -c, -l, -p, -s, -x, --uuid, "
"--addtag or --deltag allowed"); "--alloc, --addtag or --deltag allowed");
return EINVALID_CMD_LINE; return EINVALID_CMD_LINE;
} }