mirror of
git://sourceware.org/git/lvm2.git
synced 2025-07-03 00:58:59 +03:00
Add change_tag to toollib.
Allow multiple pvchange command line options to be specified together.
This commit is contained in:
@ -1,5 +1,7 @@
|
|||||||
Version 2.02.82 -
|
Version 2.02.82 -
|
||||||
===================================
|
===================================
|
||||||
|
Add change_tag to toollib.
|
||||||
|
Allow multiple pvchange command line options to be specified together.
|
||||||
Add -f (don't fork) option to clvmd and fix clvmd -d<num> description.
|
Add -f (don't fork) option to clvmd and fix clvmd -d<num> description.
|
||||||
Fix possible clvmd DLM lockspace increasing reference count.
|
Fix possible clvmd DLM lockspace increasing reference count.
|
||||||
Do not fail polling if pvmove finished in another process.
|
Do not fail polling if pvmove finished in another process.
|
||||||
|
@ -491,24 +491,10 @@ static int lvchange_persistent(struct cmd_context *cmd,
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int lvchange_tag(struct cmd_context *cmd, struct logical_volume *lv,
|
static int lvchange_tag(struct cmd_context *cmd, struct logical_volume *lv, int arg)
|
||||||
int arg)
|
|
||||||
{
|
{
|
||||||
const char *tag;
|
if (!change_tag(cmd, NULL, lv, NULL, arg))
|
||||||
struct arg_value_group_list *current_group;
|
|
||||||
|
|
||||||
dm_list_iterate_items(current_group, &cmd->arg_value_groups) {
|
|
||||||
if (!grouped_arg_is_set(current_group->arg_values, arg))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (!(tag = grouped_arg_str_value(current_group->arg_values, arg, NULL))) {
|
|
||||||
log_error("Failed to get tag");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!lv_change_tag(lv, tag, arg == addtag_ARG))
|
|
||||||
return_0;
|
return_0;
|
||||||
}
|
|
||||||
|
|
||||||
log_very_verbose("Updating logical volume \"%s\" on disk(s)", lv->name);
|
log_very_verbose("Updating logical volume \"%s\" on disk(s)", lv->name);
|
||||||
|
|
||||||
|
@ -15,8 +15,6 @@
|
|||||||
|
|
||||||
#include "tools.h"
|
#include "tools.h"
|
||||||
|
|
||||||
/* FIXME Locking. PVs in VG. */
|
|
||||||
|
|
||||||
static int _pvchange_single(struct cmd_context *cmd, struct volume_group *vg,
|
static int _pvchange_single(struct cmd_context *cmd, struct volume_group *vg,
|
||||||
struct physical_volume *pv,
|
struct physical_volume *pv,
|
||||||
void *handle __attribute__((unused)))
|
void *handle __attribute__((unused)))
|
||||||
@ -27,21 +25,14 @@ static int _pvchange_single(struct cmd_context *cmd, struct volume_group *vg,
|
|||||||
uint64_t orig_pe_start;
|
uint64_t orig_pe_start;
|
||||||
|
|
||||||
const char *pv_name = pv_dev_name(pv);
|
const char *pv_name = pv_dev_name(pv);
|
||||||
const char *tag = NULL;
|
|
||||||
const char *orig_vg_name;
|
const char *orig_vg_name;
|
||||||
char uuid[64] __attribute__((aligned(8)));
|
char uuid[64] __attribute__((aligned(8)));
|
||||||
|
|
||||||
int allocatable = 0;
|
int allocatable = 0;
|
||||||
int tagarg = 0;
|
int tagargs = 0;
|
||||||
int r = 0;
|
|
||||||
int mda_ignore = 0;
|
int mda_ignore = 0;
|
||||||
|
|
||||||
struct arg_value_group_list *current_group;
|
tagargs = arg_count(cmd, addtag_ARG) + arg_count(cmd, deltag_ARG);
|
||||||
|
|
||||||
if (arg_count(cmd, addtag_ARG))
|
|
||||||
tagarg = addtag_ARG;
|
|
||||||
else if (arg_count(cmd, deltag_ARG))
|
|
||||||
tagarg = deltag_ARG;
|
|
||||||
|
|
||||||
if (arg_count(cmd, allocatable_ARG))
|
if (arg_count(cmd, allocatable_ARG))
|
||||||
allocatable = !strcmp(arg_str_value(cmd, allocatable_ARG, "n"),
|
allocatable = !strcmp(arg_str_value(cmd, allocatable_ARG, "n"),
|
||||||
@ -52,20 +43,20 @@ static int _pvchange_single(struct cmd_context *cmd, struct volume_group *vg,
|
|||||||
|
|
||||||
/* If in a VG, must change using volume group. */
|
/* If in a VG, must change using volume group. */
|
||||||
if (!is_orphan(pv)) {
|
if (!is_orphan(pv)) {
|
||||||
if (tagarg && !(vg->fid->fmt->features & FMT_TAGS)) {
|
if (tagargs && !(vg->fid->fmt->features & FMT_TAGS)) {
|
||||||
log_error("Volume group containing %s does not "
|
log_error("Volume group containing %s does not "
|
||||||
"support tags", pv_name);
|
"support tags", pv_name);
|
||||||
goto out;
|
return 0;
|
||||||
}
|
}
|
||||||
if (arg_count(cmd, uuid_ARG) && lvs_in_vg_activated(vg)) {
|
if (arg_count(cmd, uuid_ARG) && lvs_in_vg_activated(vg)) {
|
||||||
log_error("Volume group containing %s has active "
|
log_error("Volume group containing %s has active "
|
||||||
"logical volumes", pv_name);
|
"logical volumes", pv_name);
|
||||||
goto out;
|
return 0;
|
||||||
}
|
}
|
||||||
if (!archive(vg))
|
if (!archive(vg))
|
||||||
goto out;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
if (tagarg) {
|
if (tagargs) {
|
||||||
log_error("Can't change tag on Physical Volume %s not "
|
log_error("Can't change tag on Physical Volume %s not "
|
||||||
"in volume group", pv_name);
|
"in volume group", pv_name);
|
||||||
return 0;
|
return 0;
|
||||||
@ -77,22 +68,20 @@ static int _pvchange_single(struct cmd_context *cmd, struct volume_group *vg,
|
|||||||
!(pv->fmt->features & FMT_ORPHAN_ALLOCATABLE)) {
|
!(pv->fmt->features & FMT_ORPHAN_ALLOCATABLE)) {
|
||||||
log_error("Allocatability not supported by orphan "
|
log_error("Allocatability not supported by orphan "
|
||||||
"%s format PV %s", pv->fmt->name, pv_name);
|
"%s format PV %s", pv->fmt->name, pv_name);
|
||||||
goto out;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* change allocatability for a PV */
|
/* change allocatability for a PV */
|
||||||
if (allocatable && (pv_status(pv) & ALLOCATABLE_PV)) {
|
if (allocatable && (pv_status(pv) & ALLOCATABLE_PV)) {
|
||||||
log_error("Physical volume \"%s\" is already "
|
log_error("Physical volume \"%s\" is already "
|
||||||
"allocatable", pv_name);
|
"allocatable", pv_name);
|
||||||
r = 1;
|
return 1;
|
||||||
goto out;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!allocatable && !(pv_status(pv) & ALLOCATABLE_PV)) {
|
if (!allocatable && !(pv_status(pv) & ALLOCATABLE_PV)) {
|
||||||
log_error("Physical volume \"%s\" is already "
|
log_error("Physical volume \"%s\" is already "
|
||||||
"unallocatable", pv_name);
|
"unallocatable", pv_name);
|
||||||
r = 1;
|
return 1;
|
||||||
goto out;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (allocatable) {
|
if (allocatable) {
|
||||||
@ -104,50 +93,40 @@ static int _pvchange_single(struct cmd_context *cmd, struct volume_group *vg,
|
|||||||
"allocatable", pv_name);
|
"allocatable", pv_name);
|
||||||
pv->status &= ~ALLOCATABLE_PV;
|
pv->status &= ~ALLOCATABLE_PV;
|
||||||
}
|
}
|
||||||
} else if (tagarg) {
|
}
|
||||||
|
|
||||||
|
if (tagargs) {
|
||||||
/* tag or deltag */
|
/* tag or deltag */
|
||||||
|
if (arg_count(cmd, addtag_ARG) && !change_tag(cmd, NULL, NULL, pv, addtag_ARG))
|
||||||
|
return_0;
|
||||||
|
|
||||||
dm_list_iterate_items(current_group, &cmd->arg_value_groups) {
|
if (arg_count(cmd, deltag_ARG) && !change_tag(cmd, NULL, NULL, pv, deltag_ARG))
|
||||||
if (!grouped_arg_is_set(current_group->arg_values, tagarg))
|
return_0;
|
||||||
continue;
|
|
||||||
|
|
||||||
if (!(tag = grouped_arg_str_value(current_group->arg_values, tagarg, NULL))) {
|
|
||||||
log_error("Failed to get tag");
|
|
||||||
goto out;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((tagarg == addtag_ARG)) {
|
if (arg_count(cmd, metadataignore_ARG)) {
|
||||||
if (!str_list_add(cmd->mem, &pv->tags, tag)) {
|
|
||||||
log_error("Failed to add tag %s to physical "
|
|
||||||
"volume %s", tag, pv_name);
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
} else if (!str_list_del(&pv->tags, tag)) {
|
|
||||||
log_error("Failed to remove tag %s from "
|
|
||||||
"physical volume" "%s", tag, pv_name);
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (arg_count(cmd, metadataignore_ARG)) {
|
|
||||||
if ((vg_mda_copies(vg) != VGMETADATACOPIES_UNMANAGED) &&
|
if ((vg_mda_copies(vg) != VGMETADATACOPIES_UNMANAGED) &&
|
||||||
(arg_count(cmd, force_ARG) == PROMPT) &&
|
(arg_count(cmd, force_ARG) == PROMPT) &&
|
||||||
yes_no_prompt("Override preferred number of copies "
|
yes_no_prompt("Override preferred number of copies "
|
||||||
"of VG %s metadata? [y/n]: ",
|
"of VG %s metadata? [y/n]: ",
|
||||||
pv_vg_name(pv)) == 'n') {
|
pv_vg_name(pv)) == 'n') {
|
||||||
log_error("Physical volume %s not changed", pv_name);
|
log_error("Physical volume %s not changed", pv_name);
|
||||||
goto out;
|
return 0;
|
||||||
}
|
}
|
||||||
if (!pv_change_metadataignore(pv, mda_ignore))
|
if (!pv_change_metadataignore(pv, mda_ignore))
|
||||||
goto out;
|
return_0;
|
||||||
} else {
|
}
|
||||||
|
|
||||||
|
if (arg_count(cmd, uuid_ARG)) {
|
||||||
/* --uuid: Change PV ID randomly */
|
/* --uuid: Change PV ID randomly */
|
||||||
if (!id_create(&pv->id)) {
|
if (!id_create(&pv->id)) {
|
||||||
log_error("Failed to generate new random UUID for %s.",
|
log_error("Failed to generate new random UUID for %s.",
|
||||||
pv_name);
|
pv_name);
|
||||||
goto out;
|
return 0;
|
||||||
}
|
}
|
||||||
if (!id_write_format(&pv->id, uuid, sizeof(uuid)))
|
if (!id_write_format(&pv->id, uuid, sizeof(uuid)))
|
||||||
goto_out;
|
return 0;
|
||||||
log_verbose("Changing uuid of %s to %s.", pv_name, uuid);
|
log_verbose("Changing uuid of %s to %s.", pv_name, uuid);
|
||||||
if (!is_orphan(pv)) {
|
if (!is_orphan(pv)) {
|
||||||
orig_vg_name = pv_vg_name(pv);
|
orig_vg_name = pv_vg_name(pv);
|
||||||
@ -163,7 +142,7 @@ static int _pvchange_single(struct cmd_context *cmd, struct volume_group *vg,
|
|||||||
if (!(pv_write(cmd, pv, NULL, INT64_C(-1)))) {
|
if (!(pv_write(cmd, pv, NULL, INT64_C(-1)))) {
|
||||||
log_error("pv_write with new uuid failed "
|
log_error("pv_write with new uuid failed "
|
||||||
"for %s.", pv_name);
|
"for %s.", pv_name);
|
||||||
goto out;
|
return 0;
|
||||||
}
|
}
|
||||||
pv->vg_name = orig_vg_name;
|
pv->vg_name = orig_vg_name;
|
||||||
pv->pe_alloc_count = orig_pe_alloc_count;
|
pv->pe_alloc_count = orig_pe_alloc_count;
|
||||||
@ -179,20 +158,18 @@ static int _pvchange_single(struct cmd_context *cmd, struct volume_group *vg,
|
|||||||
if (!vg_write(vg) || !vg_commit(vg)) {
|
if (!vg_write(vg) || !vg_commit(vg)) {
|
||||||
log_error("Failed to store physical volume \"%s\" in "
|
log_error("Failed to store physical volume \"%s\" in "
|
||||||
"volume group \"%s\"", pv_name, vg->name);
|
"volume group \"%s\"", pv_name, vg->name);
|
||||||
goto out;
|
return 0;
|
||||||
}
|
}
|
||||||
backup(vg);
|
backup(vg);
|
||||||
} else if (!(pv_write(cmd, pv, NULL, INT64_C(-1)))) {
|
} else if (!(pv_write(cmd, pv, NULL, INT64_C(-1)))) {
|
||||||
log_error("Failed to store physical volume \"%s\"",
|
log_error("Failed to store physical volume \"%s\"",
|
||||||
pv_name);
|
pv_name);
|
||||||
goto out;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
log_print("Physical volume \"%s\" changed", pv_name);
|
log_print("Physical volume \"%s\" changed", pv_name);
|
||||||
r = 1;
|
|
||||||
out:
|
|
||||||
return r;
|
|
||||||
|
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int pvchange(struct cmd_context *cmd, int argc, char **argv)
|
int pvchange(struct cmd_context *cmd, int argc, char **argv)
|
||||||
@ -209,11 +186,11 @@ int pvchange(struct cmd_context *cmd, int argc, char **argv)
|
|||||||
struct dm_list *vgnames;
|
struct dm_list *vgnames;
|
||||||
struct str_list *sll;
|
struct str_list *sll;
|
||||||
|
|
||||||
if (arg_count(cmd, allocatable_ARG) + arg_is_set(cmd, addtag_ARG) +
|
if (!(arg_count(cmd, allocatable_ARG) + arg_is_set(cmd, addtag_ARG) +
|
||||||
arg_is_set(cmd, deltag_ARG) + arg_count(cmd, uuid_ARG) +
|
arg_is_set(cmd, deltag_ARG) + arg_count(cmd, uuid_ARG) +
|
||||||
arg_count(cmd, metadataignore_ARG) != 1) {
|
arg_count(cmd, metadataignore_ARG))) {
|
||||||
log_error("Please give exactly one option of -x, -uuid, "
|
log_error("Please give one or more of -x, -uuid, "
|
||||||
"--addtag or --deltag");
|
"--addtag, --deltag or --metadataignore");
|
||||||
return EINVALID_CMD_LINE;
|
return EINVALID_CMD_LINE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1544,3 +1544,47 @@ int get_stripe_params(struct cmd_context *cmd, uint32_t *stripes, uint32_t *stri
|
|||||||
return _validate_stripe_params(cmd, stripes, stripe_size);
|
return _validate_stripe_params(cmd, stripes, stripe_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* FIXME move to lib */
|
||||||
|
static int _pv_change_tag(struct physical_volume *pv, const char *tag, int addtag)
|
||||||
|
{
|
||||||
|
if (addtag) {
|
||||||
|
if (!str_list_add(pv->fmt->cmd->mem, &pv->tags, tag)) {
|
||||||
|
log_error("Failed to add tag %s to physical volume %s",
|
||||||
|
tag, pv_dev_name(pv));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
} else if (!str_list_del(&pv->tags, tag)) {
|
||||||
|
log_error("Failed to remove tag %s from physical volume" "%s",
|
||||||
|
tag, pv_dev_name(pv));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set exactly one of VG, LV or PV */
|
||||||
|
int change_tag(struct cmd_context *cmd, struct volume_group *vg,
|
||||||
|
struct logical_volume *lv, struct physical_volume *pv, int arg)
|
||||||
|
{
|
||||||
|
const char *tag;
|
||||||
|
struct arg_value_group_list *current_group;
|
||||||
|
|
||||||
|
dm_list_iterate_items(current_group, &cmd->arg_value_groups) {
|
||||||
|
if (!grouped_arg_is_set(current_group->arg_values, arg))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!(tag = grouped_arg_str_value(current_group->arg_values, arg, NULL))) {
|
||||||
|
log_error("Failed to get tag");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vg && !vg_change_tag(vg, tag, arg == addtag_ARG))
|
||||||
|
return_0;
|
||||||
|
else if (lv && !lv_change_tag(lv, tag, arg == addtag_ARG))
|
||||||
|
return_0;
|
||||||
|
else if (pv && !_pv_change_tag(pv, tag, arg == addtag_ARG))
|
||||||
|
return_0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
@ -115,4 +115,7 @@ int get_activation_monitoring_mode(struct cmd_context *cmd,
|
|||||||
int get_stripe_params(struct cmd_context *cmd, uint32_t *stripes,
|
int get_stripe_params(struct cmd_context *cmd, uint32_t *stripes,
|
||||||
uint32_t *stripe_size);
|
uint32_t *stripe_size);
|
||||||
|
|
||||||
|
int change_tag(struct cmd_context *cmd, struct volume_group *vg,
|
||||||
|
struct logical_volume *lv, struct physical_volume *pv, int arg);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -360,37 +360,14 @@ static int _vgchange_pesize(struct cmd_context *cmd, struct volume_group *vg)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _vgchange_tag(struct cmd_context *cmd, struct volume_group *vg,
|
|
||||||
int arg)
|
|
||||||
{
|
|
||||||
const char *tag;
|
|
||||||
struct arg_value_group_list *current_group;
|
|
||||||
|
|
||||||
dm_list_iterate_items(current_group, &cmd->arg_value_groups) {
|
|
||||||
if (!grouped_arg_is_set(current_group->arg_values, arg))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (!(tag = grouped_arg_str_value(current_group->arg_values, arg, NULL))) {
|
|
||||||
log_error("Failed to get tag");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!vg_change_tag(vg, tag, arg == addtag_ARG))
|
|
||||||
return_0;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int _vgchange_addtag(struct cmd_context *cmd, struct volume_group *vg)
|
static int _vgchange_addtag(struct cmd_context *cmd, struct volume_group *vg)
|
||||||
{
|
{
|
||||||
return _vgchange_tag(cmd, vg, addtag_ARG);
|
return change_tag(cmd, vg, NULL, NULL, addtag_ARG);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _vgchange_deltag(struct cmd_context *cmd, struct volume_group *vg)
|
static int _vgchange_deltag(struct cmd_context *cmd, struct volume_group *vg)
|
||||||
{
|
{
|
||||||
return _vgchange_tag(cmd, vg, deltag_ARG);
|
return change_tag(cmd, vg, NULL, NULL, deltag_ARG);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _vgchange_uuid(struct cmd_context *cmd __attribute__((unused)),
|
static int _vgchange_uuid(struct cmd_context *cmd __attribute__((unused)),
|
||||||
|
Reference in New Issue
Block a user