xx(vgextend,
"Add physical volumes to a volume group",
- ONE_VGNAME_ARG,
+ 0,
"vgextend\n"
"\t[-A|--autobackup y|n]\n"
"\t[--restoremissing]\n"
while (1) {
parms->outstanding_count = 0;
- process_each_vg(cmd, 0, NULL, READ_FOR_UPDATE, handle, _poll_vg);
+ process_each_vg(cmd, 0, NULL, NULL, READ_FOR_UPDATE, handle, _poll_vg);
if (!parms->outstanding_count)
break;
if (parms->interval)
handle->custom_handle = &lpdp;
- process_each_vg(cmd, 0, NULL, 0, handle, _lvmpolld_init_poll_vg);
+ process_each_vg(cmd, 0, NULL, NULL, 0, handle, _lvmpolld_init_poll_vg);
first = dm_list_first(&lpdp.idls);
&_lvs_single);
break;
case VGS:
- r = process_each_vg(cmd, argc, argv, 0,
+ r = process_each_vg(cmd, argc, argv, NULL, 0,
&handle, &_vgs_single);
break;
case LABEL:
r = process_each_pv(cmd, argc, argv, NULL, 0,
&handle, &_pvs_single);
else
- r = process_each_vg(cmd, argc, argv, 0,
+ r = process_each_vg(cmd, argc, argv, NULL, 0,
&handle, &_pvs_in_vg);
break;
case SEGSSTATUS:
lv_info_needed && lv_segment_status_needed ? &_pvsegs_with_lv_info_and_status_single :
&_pvsegs_single);
else
- r = process_each_vg(cmd, argc, argv, 0,
+ r = process_each_vg(cmd, argc, argv, NULL, 0,
&handle, &_pvsegs_in_vg);
break;
}
*/
static int _get_arg_vgnames(struct cmd_context *cmd,
int argc, char **argv,
- unsigned one_vgname_arg,
+ const char *one_vgname,
struct dm_list *arg_vgnames,
struct dm_list *arg_tags)
{
log_verbose("Using volume group(s) on command line.");
+ if (one_vgname) {
+ if (!str_list_add(cmd->mem, arg_vgnames,
+ dm_pool_strdup(cmd->mem, one_vgname))) {
+ log_error("strlist allocation failed.");
+ return ECMD_FAILED;
+ }
+ return ret_max;
+ }
+
for (; opt < argc; opt++) {
vg_name = argv[opt];
if (*vg_name == '@') {
- if (one_vgname_arg) {
- log_error("This command does not yet support a tag to identify a Volume Group.");
- return EINVALID_CMD_LINE;
- }
-
if (!validate_tag(vg_name + 1)) {
log_error("Skipping invalid tag: %s", vg_name);
if (ret_max < EINVALID_CMD_LINE)
log_error("Invalid volume group name %s.", vg_name);
if (ret_max < EINVALID_CMD_LINE)
ret_max = EINVALID_CMD_LINE;
- if (one_vgname_arg)
- break;
continue;
}
log_error("strlist allocation failed.");
return ECMD_FAILED;
}
-
- if (one_vgname_arg)
- break;
}
return ret_max;
process_all = 1;
/*
- * FIXME If one_vgname_arg, only proceed if exactly one VG matches tags or selection.
+ * FIXME If one_vgname, only proceed if exactly one VG matches tags or selection.
*/
dm_list_iterate_items(vgnl, vgnameids_to_process) {
if (sigint_caught())
/*
* Call process_single_vg() for each VG selected by the command line arguments.
+ * If one_vgname is set, process only that VG and ignore argc/argv (which should be 0/NULL)..
+ * If one_vgname is not set, get VG names to process from argc/argv.
*/
int process_each_vg(struct cmd_context *cmd, int argc, char **argv,
- uint32_t read_flags, struct processing_handle *handle,
+ const char *one_vgname, uint32_t read_flags,
+ struct processing_handle *handle,
process_single_vg_fn_t process_single_vg)
{
int handle_supplied = handle != NULL;
struct dm_list vgnameids_on_system; /* vgnameid_list */
struct dm_list vgnameids_to_process; /* vgnameid_list */
int enable_all_vgs = (cmd->command->flags & ALL_VGS_IS_DEFAULT);
- int one_vgname_arg = (cmd->command->flags & ONE_VGNAME_ARG);
int process_all_vgs_on_system = 0;
int ret_max = ECMD_PROCESSED;
int ret;
/*
* Find any VGs or tags explicitly provided on the command line.
*/
- if ((ret = _get_arg_vgnames(cmd, argc, argv, one_vgname_arg, &arg_vgnames, &arg_tags)) != ECMD_PROCESSED) {
+ if ((ret = _get_arg_vgnames(cmd, argc, argv, one_vgname, &arg_vgnames, &arg_tags)) != ECMD_PROCESSED) {
ret_max = ret;
goto_out;
}
struct processing_handle *handle);
int process_each_vg(struct cmd_context *cmd, int argc, char **argv,
- uint32_t flags, struct processing_handle *handle,
+ const char *one_vgname, uint32_t flags,
+ struct processing_handle *handle,
process_single_vg_fn_t process_single_vg);
int process_each_pv(struct cmd_context *cmd, int argc, char **argv,
#define ALL_VGS_IS_DEFAULT 0x00000004
/* Process all devices with --all if none are specified on the command line. */
#define ENABLE_ALL_DEVS 0x00000008
-/* Exactly one VG name argument required. */
-#define ONE_VGNAME_ARG 0x00000010
/* Command needs a shared lock on a VG; it only reads the VG. */
#define LOCKD_VG_SH 0x00000020
/* Command does not process any metadata. */
init_pvmove(1);
- ret = process_each_vg(cmd, argc, argv, READ_ALLOW_INCONSISTENT,
+ ret = process_each_vg(cmd, argc, argv, NULL, READ_ALLOW_INCONSISTENT,
handle, &vg_backup_single);
dm_free(last_filename);
if (arg_is_set(cmd, lockstart_ARG) || arg_is_set(cmd, lockstop_ARG))
flags |= READ_ALLOW_EXPORTED;
- ret = process_each_vg(cmd, argc, argv, flags, NULL, &vgchange_single);
+ ret = process_each_vg(cmd, argc, argv, NULL, flags, NULL, &vgchange_single);
/* Wait for lock-start ops that were initiated in vgchange_lockstart. */
int vgck(struct cmd_context *cmd, int argc, char **argv)
{
lvmetad_set_active(cmd, 0);
- return process_each_vg(cmd, argc, argv, 0, NULL,
+ return process_each_vg(cmd, argc, argv, NULL, 0, NULL,
&vgck_single);
}
return EINVALID_CMD_LINE;
}
- return process_each_vg(cmd, argc, argv, READ_FOR_UPDATE, NULL,
+ return process_each_vg(cmd, argc, argv, NULL, READ_FOR_UPDATE, NULL,
&vgconvert_single);
}
}
**********/
- return process_each_vg(cmd, argc, argv, 0, NULL,
+ return process_each_vg(cmd, argc, argv, NULL, 0, NULL,
vgdisplay_single);
/******** FIXME Need to count number processed
return EINVALID_CMD_LINE;
}
- return process_each_vg(cmd, argc, argv, READ_FOR_UPDATE, NULL,
+ return process_each_vg(cmd, argc, argv, NULL, READ_FOR_UPDATE, NULL,
&vgexport_single);
}
struct vgextend_params vp;
unsigned restoremissing = arg_is_set(cmd, restoremissing_ARG);
struct processing_handle *handle;
+ const char *one_vgname;
int ret;
if (!argc) {
return EINVALID_CMD_LINE;
}
+ one_vgname = skip_dev_dir(cmd, argv[0], NULL);
+
if (arg_count(cmd, metadatacopies_ARG)) {
log_error("Invalid option --metadatacopies, "
"use --pvmetadatacopies instead.");
if (!lockd_gl(cmd, "ex", 0))
return_ECMD_FAILED;
- ret = process_each_vg(cmd, argc, argv,
+ ret = process_each_vg(cmd, 0, NULL, one_vgname,
READ_FOR_UPDATE, handle,
restoremissing ? &_vgextend_restoremissing : &_vgextend_single);
return ECMD_FAILED;
}
- return process_each_vg(cmd, argc, argv,
+ return process_each_vg(cmd, argc, argv, NULL,
READ_FOR_UPDATE | READ_ALLOW_EXPORTED,
NULL,
&vgimport_single);
cmd->lockd_gl_disable = 1;
cmd->handles_missing_pvs = 1;
- ret = process_each_vg(cmd, argc, argv,
+ ret = process_each_vg(cmd, argc, argv, NULL,
READ_FOR_UPDATE,
NULL, &vgremove_single);
log_print_unless_silent("Reading all physical volumes. This may take a while...");
- maxret = process_each_vg(cmd, argc, argv, 0, NULL,
+ maxret = process_each_vg(cmd, argc, argv, NULL, 0, NULL,
&vgscan_single);
if (arg_count(cmd, mknodes_ARG)) {