1
0
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:
Alasdair Kergon
2011-01-24 13:38:31 +00:00
parent 74863007ee
commit b51cd542be
6 changed files with 91 additions and 102 deletions

View File

@ -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.

View File

@ -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);

View File

@ -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;
} }

View File

@ -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;
}

View File

@ -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

View File

@ -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)),