mirror of
git://sourceware.org/git/lvm2.git
synced 2025-11-01 00:23:49 +03:00
Compare commits
1 Commits
dev-dct-cm
...
dev-dct-cm
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e65c3727d8 |
@@ -140,13 +140,6 @@ Makefile: Makefile.in
|
||||
*) echo "Creating $@" ; $(SED) -e "s+#VERSION#+$(LVM_VERSION)+;s+#DEFAULT_SYS_DIR#+$(DEFAULT_SYS_DIR)+;s+#DEFAULT_ARCHIVE_DIR#+$(DEFAULT_ARCHIVE_DIR)+;s+#DEFAULT_BACKUP_DIR#+$(DEFAULT_BACKUP_DIR)+;s+#DEFAULT_PROFILE_DIR#+$(DEFAULT_PROFILE_DIR)+;s+#DEFAULT_CACHE_DIR#+$(DEFAULT_CACHE_DIR)+;s+#DEFAULT_LOCK_DIR#+$(DEFAULT_LOCK_DIR)+;s+#CLVMD_PATH#+@CLVMD_PATH@+;s+#LVM_PATH#+@LVM_PATH@+;s+#DEFAULT_RUN_DIR#+@DEFAULT_RUN_DIR@+;s+#DEFAULT_PID_DIR#+@DEFAULT_PID_DIR@+;s+#SYSTEMD_GENERATOR_DIR#+$(SYSTEMD_GENERATOR_DIR)+;s+#DEFAULT_MANGLING#+$(DEFAULT_MANGLING)+;" $< > $@ ;; \
|
||||
esac
|
||||
|
||||
ccmd: ../tools/create-commands.c
|
||||
$(CC) ../tools/create-commands.c -o ccmd
|
||||
|
||||
generate: ccmd
|
||||
./ccmd --output man -s 0 -p 1 -c lvcreate ../tools/command-lines.in > lvcreate.8.a
|
||||
cat lvcreate.8.a lvcreate.8.b > lvcreate.8.in
|
||||
|
||||
install_man5: $(MAN5)
|
||||
$(INSTALL) -d $(MAN5DIR)
|
||||
$(INSTALL_DATA) $(MAN5) $(MAN5DIR)/
|
||||
|
||||
@@ -81,7 +81,8 @@ lvcreate -l1 -s -n inval $vg/$lv3
|
||||
lvcreate -l4 -I4 -i2 -n stripe $vg
|
||||
# Invalidate snapshot
|
||||
not dd if=/dev/zero of="$DM_DEV_DIR/$vg/inval" bs=4K
|
||||
invalid lvscan "$dev1"
|
||||
# ignores unused positional arg dev1
|
||||
lvscan "$dev1"
|
||||
lvdisplay --maps
|
||||
lvscan --all
|
||||
|
||||
@@ -108,13 +109,16 @@ vgmknodes --refresh
|
||||
lvscan
|
||||
lvmdiskscan
|
||||
|
||||
invalid pvscan "$dev1"
|
||||
# ignores unused arg
|
||||
pvscan "$dev1"
|
||||
invalid pvscan -aay
|
||||
invalid pvscan --major 254
|
||||
invalid pvscan --minor 0
|
||||
invalid pvscan --novolumegroup -e
|
||||
invalid vgscan $vg
|
||||
invalid lvscan $vg
|
||||
# ignores unsed arg
|
||||
vgscan $vg
|
||||
# ignroes unused arg
|
||||
lvscan $vg
|
||||
|
||||
if aux have_readline; then
|
||||
cat <<EOF | lvm
|
||||
|
||||
@@ -23,6 +23,7 @@ lvcreate -l 1 -n lv1 $vg "$dev1"
|
||||
invalid vgextend
|
||||
# --metadatacopies => use --pvmetadatacopies
|
||||
invalid vgextend --metadatacopies 3 $vg "$dev1" 2>&1 | tee out
|
||||
grep -- "use --pvmetadatacopies" out
|
||||
|
||||
# VG name should exist
|
||||
fail vgextend --restoremissing $vg-invalid "$dev1"
|
||||
|
||||
22
tools/args.h
22
tools/args.h
@@ -31,8 +31,8 @@ arg(cachemode_ARG, '\0', "cachemode", cachemode_VAL, 0, 0)
|
||||
arg(cachepool_ARG, '\0', "cachepool", lv_VAL, 0, 0)
|
||||
arg(commandprofile_ARG, '\0', "commandprofile", string_VAL, 0, 0)
|
||||
arg(config_ARG, '\0', "config", string_VAL, 0, 0)
|
||||
arg(configreport_ARG, '\0', "configreport", configreport_VAL, ARG_GROUPABLE, 1)
|
||||
arg(configtype_ARG, '\0', "typeconfig", configtype_VAL, 0, 0)
|
||||
arg(configreport_ARG, '\0', "configreport", string_VAL, ARG_GROUPABLE, 1)
|
||||
arg(configtype_ARG, '\0', "typeconfig", string_VAL, 0, 0)
|
||||
arg(corelog_ARG, '\0', "corelog", 0, 0, 0)
|
||||
arg(dataalignment_ARG, '\0', "dataalignment", sizekb_VAL, 0, 0)
|
||||
arg(dataalignmentoffset_ARG, '\0', "dataalignmentoffset", sizekb_VAL, 0, 0)
|
||||
@@ -81,26 +81,26 @@ arg(noudevsync_ARG, '\0', "noudevsync", 0, 0, 0)
|
||||
arg(originname_ARG, '\0', "originname", lv_VAL, 0, 0)
|
||||
arg(physicalvolumesize_ARG, '\0', "setphysicalvolumesize", sizemb_VAL, 0, 0)
|
||||
arg(poll_ARG, '\0', "poll", bool_VAL, 0, 0)
|
||||
arg(polloperation_ARG, '\0', "polloperation", polloperation_VAL, 0, 0)
|
||||
arg(polloperation_ARG, '\0', "polloperation", string_VAL, 0, 0)
|
||||
arg(pooldatasize_ARG, '\0', "pooldatasize", sizemb_VAL, 0, 0)
|
||||
arg(poolmetadata_ARG, '\0', "poolmetadata", lv_VAL, 0, 0)
|
||||
arg(poolmetadatasize_ARG, '\0', "poolmetadatasize", sizemb_VAL, 0, 0)
|
||||
arg(poolmetadataspare_ARG, '\0', "poolmetadataspare", bool_VAL, 0, 0)
|
||||
arg(profile_ARG, '\0', "profile", string_VAL, 0, 0)
|
||||
arg(pvmetadatacopies_ARG, '\0', "pvmetadatacopies", pvmetadatacopies_VAL, 0, 0)
|
||||
arg(raidrebuild_ARG, '\0', "raidrebuild", pv_VAL, ARG_GROUPABLE, 0)
|
||||
arg(pvmetadatacopies_ARG, '\0', "pvmetadatacopies", number_VAL, 0, 0)
|
||||
arg(raidrebuild_ARG, '\0', "raidrebuild", string_VAL, ARG_GROUPABLE, 0)
|
||||
arg(raidmaxrecoveryrate_ARG, '\0', "raidmaxrecoveryrate", sizekb_VAL, 0, 0)
|
||||
arg(raidminrecoveryrate_ARG, '\0', "raidminrecoveryrate", sizekb_VAL, 0, 0)
|
||||
arg(raidsyncaction_ARG, '\0', "raidsyncaction", syncaction_VAL, 0, 0)
|
||||
arg(raidsyncaction_ARG, '\0', "raidsyncaction", string_VAL, 0, 0)
|
||||
arg(raidwritebehind_ARG, '\0', "raidwritebehind", number_VAL, 0, 0)
|
||||
arg(raidwritemostly_ARG, '\0', "raidwritemostly", writemostly_VAL, ARG_GROUPABLE, 0)
|
||||
arg(raidwritemostly_ARG, '\0', "raidwritemostly", string_VAL, ARG_GROUPABLE, 0)
|
||||
arg(readonly_ARG, '\0', "readonly", 0, 0, 0)
|
||||
arg(refresh_ARG, '\0', "refresh", 0, 0, 0)
|
||||
arg(removemissing_ARG, '\0', "removemissing", 0, 0, 0)
|
||||
arg(rebuild_ARG, '\0', "rebuild", pv_VAL, ARG_GROUPABLE, 0)
|
||||
arg(repair_ARG, '\0', "repair", 0, 0, 0)
|
||||
arg(replace_ARG, '\0', "replace", pv_VAL, ARG_GROUPABLE, 0)
|
||||
arg(reportformat_ARG, '\0', "reportformat", reportformat_VAL, 0, 0)
|
||||
arg(reportformat_ARG, '\0', "reportformat", string_VAL, 0, 0)
|
||||
arg(restorefile_ARG, '\0', "restorefile", string_VAL, 0, 0)
|
||||
arg(restoremissing_ARG, '\0', "restoremissing", 0, 0, 0)
|
||||
arg(resync_ARG, '\0', "resync", 0, 0, 0)
|
||||
@@ -116,7 +116,7 @@ arg(splitsnapshot_ARG, '\0', "splitsnapshot", 0, 0, 0)
|
||||
arg(showdeprecated_ARG, '\0', "showdeprecated", 0, 0, 0)
|
||||
arg(showunsupported_ARG, '\0', "showunsupported", 0, 0, 0)
|
||||
arg(stripes_long_ARG, '\0', "stripes", number_VAL, 0, 0)
|
||||
arg(syncaction_ARG, '\0', "syncaction", syncaction_VAL, 0, 0)
|
||||
arg(syncaction_ARG, '\0', "syncaction", string_VAL, 0, 0) /* FIXME Use custom VAL */
|
||||
arg(sysinit_ARG, '\0', "sysinit", 0, 0, 0)
|
||||
arg(systemid_ARG, '\0', "systemid", string_VAL, 0, 0)
|
||||
arg(thinpool_ARG, '\0', "thinpool", lv_VAL, 0, 0)
|
||||
@@ -133,14 +133,14 @@ arg(unquoted_ARG, '\0', "unquoted", 0, 0, 0)
|
||||
arg(usepolicies_ARG, '\0', "usepolicies", 0, 0, 0)
|
||||
arg(validate_ARG, '\0', "validate", 0, 0, 0)
|
||||
arg(version_ARG, '\0', "version", 0, 0, 0)
|
||||
arg(vgmetadatacopies_ARG, '\0', "vgmetadatacopies", vgmetadatacopies_VAL, 0, 0)
|
||||
arg(vgmetadatacopies_ARG, '\0', "vgmetadatacopies", metadatacopies_VAL, 0, 0)
|
||||
arg(virtualoriginsize_ARG, '\0', "virtualoriginsize", sizemb_VAL, 0, 0)
|
||||
arg(withsummary_ARG, '\0', "withsummary", 0, 0, 0)
|
||||
arg(withcomments_ARG, '\0', "withcomments", 0, 0, 0)
|
||||
arg(withspaces_ARG, '\0', "withspaces", 0, 0, 0)
|
||||
arg(withversions_ARG, '\0', "withversions", 0, 0, 0)
|
||||
arg(writebehind_ARG, '\0', "writebehind", number_VAL, 0, 0)
|
||||
arg(writemostly_ARG, '\0', "writemostly", writemostly_VAL, ARG_GROUPABLE, 0)
|
||||
arg(writemostly_ARG, '\0', "writemostly", string_VAL, ARG_GROUPABLE, 0)
|
||||
|
||||
/* Allow some variations */
|
||||
arg(allocation_ARG, '\0', "allocation", bool_VAL, 0, 0)
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -51,8 +51,8 @@ struct command_name {
|
||||
*/
|
||||
|
||||
/* arg_def flags */
|
||||
#define ARG_DEF_FLAG_NEW 1 << 0
|
||||
#define ARG_DEF_FLAG_MAY_REPEAT 1 << 1
|
||||
#define ARG_DEF_FLAG_NEW 1 << 0
|
||||
#define ARG_DEF_FLAG_MAY_REPEAT 1 << 1
|
||||
|
||||
/* arg_def lv_types */
|
||||
enum {
|
||||
@@ -82,7 +82,7 @@ static inline int val_bit_is_set(uint64_t val_bits, int val_enum)
|
||||
|
||||
static inline uint64_t val_enum_to_bit(int val_enum)
|
||||
{
|
||||
return (1ULL << val_enum);
|
||||
return 1 << val_enum;
|
||||
}
|
||||
|
||||
/* Description a value that follows an option or exists in a position. */
|
||||
@@ -123,8 +123,7 @@ struct pos_arg {
|
||||
* one or more from required_opt_args is required,
|
||||
* then the rest are optional.
|
||||
*/
|
||||
#define CMD_FLAG_ONE_REQUIRED_OPT 1
|
||||
#define CMD_FLAG_SECONDARY_SYNTAX 2
|
||||
#define CMD_FLAG_ONE_REQUIRED_OPT 1
|
||||
|
||||
/* a register of the lvm commands */
|
||||
struct command {
|
||||
@@ -165,42 +164,6 @@ struct command {
|
||||
|
||||
/* used for processing current position */
|
||||
int pos_count;
|
||||
|
||||
/* struct cmd_rule rules[CMD_RULES]; */
|
||||
};
|
||||
|
||||
#if 0
|
||||
/*
|
||||
* if rule.opt is set, then rule.type specifies if rule.check values
|
||||
* are required or invalid.
|
||||
*
|
||||
* if (arg_is_set(rule.opt) &&
|
||||
* (rule.type & RULE_OPT_INVALID_OPT) && arg_is_set(rule.check.opt)) {
|
||||
* log_error("option %s and option %s cannot be used together");
|
||||
* }
|
||||
*
|
||||
* if (arg_is_set(rule.opt) &&
|
||||
* (rule.type & RULE_OPT_REQUIRES_LV_CHECK) && !lv_is(lv, rule.check.lv_is)) {
|
||||
* log_error("LV %s must be %s", lv, rule.check.lv_is);
|
||||
* }
|
||||
*
|
||||
* if (arg_is_set(rule.opt) &&
|
||||
* (rule.type & RULE_OPT_INVALID_LV_CHECK) && lv_is(lv, rule.check.lv_is)) {
|
||||
* log_error("LV %s must not be %s", lv, rule.check.lv_is);
|
||||
* }
|
||||
*
|
||||
*/
|
||||
|
||||
struct cmd_rule {
|
||||
int opt; /* foo_ARG, or INT_MAX for command def in general */
|
||||
int type; /* RULE_ specifies how to require/prohibit check value */
|
||||
|
||||
union {
|
||||
int opt;
|
||||
int pos;
|
||||
uint64_t lv_is;
|
||||
} check;
|
||||
};
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
@@ -47,15 +47,7 @@ int segtype_arg(struct cmd_context *cmd, struct arg_values *av) { return 0; }
|
||||
int alloc_arg(struct cmd_context *cmd, struct arg_values *av) { return 0; }
|
||||
int locktype_arg(struct cmd_context *cmd, struct arg_values *av) { return 0; }
|
||||
int readahead_arg(struct cmd_context *cmd, struct arg_values *av) { return 0; }
|
||||
int vgmetadatacopies_arg(struct cmd_context *cmd __attribute__((unused)), struct arg_values *av) { return 0; }
|
||||
int pvmetadatacopies_arg(struct cmd_context *cmd __attribute__((unused)), struct arg_values *av) { return 0; }
|
||||
int metadatacopies_arg(struct cmd_context *cmd __attribute__((unused)), struct arg_values *av) { return 0; }
|
||||
int polloperation_arg(struct cmd_context *cmd __attribute__((unused)), struct arg_values *av) { return 0; }
|
||||
int writemostly_arg(struct cmd_context *cmd __attribute__((unused)), struct arg_values *av) { return 0; }
|
||||
int syncaction_arg(struct cmd_context *cmd __attribute__((unused)), struct arg_values *av) { return 0; }
|
||||
int reportformat_arg(struct cmd_context *cmd __attribute__((unused)), struct arg_values *av) { return 0; }
|
||||
int configreport_arg(struct cmd_context *cmd __attribute__((unused)), struct arg_values *av) { return 0; }
|
||||
int configtype_arg(struct cmd_context *cmd __attribute__((unused)), struct arg_values *av) { return 0; }
|
||||
|
||||
/* also see arg_props */
|
||||
struct opt_name {
|
||||
@@ -149,9 +141,6 @@ struct command lvm_all; /* for printing common options for all lvm commands */
|
||||
int oo_line_count;
|
||||
struct oo_line oo_lines[MAX_OO_LINES];
|
||||
|
||||
static int include_man_secondary = 1;
|
||||
static int include_man_primary = 1;
|
||||
static char *man_command_name = NULL;
|
||||
|
||||
static void add_optional_opt_line(struct command *cmd, int argc, char *argv[]);
|
||||
|
||||
@@ -256,7 +245,7 @@ static int opt_str_to_num(char *str)
|
||||
exit(1);
|
||||
}
|
||||
|
||||
static char *val_bits_to_str(uint64_t val_bits)
|
||||
static char *val_bits_to_str(int val_bits)
|
||||
{
|
||||
static char buf[128];
|
||||
int i;
|
||||
@@ -588,13 +577,6 @@ static int is_desc_line(char *str)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int is_flags_line(char *str)
|
||||
{
|
||||
if (!strncmp(str, "FLAGS:", 6))
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int is_id_line(char *str)
|
||||
{
|
||||
if (!strncmp(str, "ID:", 3))
|
||||
@@ -1165,46 +1147,14 @@ static char *flags_to_str(int flags)
|
||||
|
||||
memset(buf_flags, 0, sizeof(buf_flags));
|
||||
|
||||
if (flags & ARG_DEF_FLAG_MAY_REPEAT) {
|
||||
if (buf_flags[0])
|
||||
strcat(buf_flags, " | ");
|
||||
if (flags & ARG_DEF_FLAG_MAY_REPEAT)
|
||||
strcat(buf_flags, "ARG_DEF_FLAG_MAY_REPEAT");
|
||||
}
|
||||
if (flags & ARG_DEF_FLAG_NEW) {
|
||||
if (buf_flags[0])
|
||||
strcat(buf_flags, " | ");
|
||||
if (flags & ARG_DEF_FLAG_NEW)
|
||||
strcat(buf_flags, "ARG_DEF_FLAG_NEW");
|
||||
}
|
||||
|
||||
return buf_flags;
|
||||
}
|
||||
|
||||
static void add_flags(struct command *cmd, char *line)
|
||||
{
|
||||
if (strstr(line, "SECONDARY_SYNTAX"))
|
||||
cmd->cmd_flags |= CMD_FLAG_SECONDARY_SYNTAX;
|
||||
}
|
||||
|
||||
static char *cmd_flags_to_str(uint32_t flags)
|
||||
{
|
||||
static char buf_cmd_flags[32];
|
||||
|
||||
memset(buf_cmd_flags, 0, sizeof(buf_cmd_flags));
|
||||
|
||||
if (flags & CMD_FLAG_SECONDARY_SYNTAX) {
|
||||
if (buf_cmd_flags[0])
|
||||
strcat(buf_cmd_flags, " | ");
|
||||
strcat(buf_cmd_flags, "CMD_FLAG_SECONDARY_SYNTAX");
|
||||
}
|
||||
if (flags & CMD_FLAG_ONE_REQUIRED_OPT) {
|
||||
if (buf_cmd_flags[0])
|
||||
strcat(buf_cmd_flags, " | ");
|
||||
strcat(buf_cmd_flags, "CMD_FLAG_ONE_REQUIRED_OPT");
|
||||
}
|
||||
|
||||
return buf_cmd_flags;
|
||||
}
|
||||
|
||||
void print_command_count(void)
|
||||
{
|
||||
struct command *cmd;
|
||||
@@ -1589,48 +1539,6 @@ static void print_def_man(struct arg_def *def, int usage)
|
||||
printf(" ...");
|
||||
}
|
||||
|
||||
static char *man_long_opt_name(struct command *cmd, int opt_enum)
|
||||
{
|
||||
static char long_opt_name[64];
|
||||
|
||||
memset(&long_opt_name, 0, sizeof(long_opt_name));
|
||||
|
||||
switch (opt_enum) {
|
||||
case syncaction_ARG:
|
||||
strncpy(long_opt_name, "--[raid]syncaction", 63);
|
||||
break;
|
||||
case writemostly_ARG:
|
||||
strncpy(long_opt_name, "--[raid]writemostly", 63);
|
||||
break;
|
||||
case minrecoveryrate_ARG:
|
||||
strncpy(long_opt_name, "--[raid]minrecoveryrate", 63);
|
||||
break;
|
||||
case maxrecoveryrate_ARG:
|
||||
strncpy(long_opt_name, "--[raid]maxrecoveryrate", 63);
|
||||
break;
|
||||
case writebehind_ARG:
|
||||
strncpy(long_opt_name, "--[raid]writebehind", 63);
|
||||
break;
|
||||
case vgmetadatacopies_ARG:
|
||||
if (!strncmp(cmd->name, "vg", 2))
|
||||
strncpy(long_opt_name, "--[vg]metadatacopies", 63);
|
||||
else
|
||||
strncpy(long_opt_name, "--vgmetadatacopies", 63);
|
||||
break;
|
||||
case pvmetadatacopies_ARG:
|
||||
if (!strncmp(cmd->name, "pv", 2))
|
||||
strncpy(long_opt_name, "--[pv]metadatacopies", 63);
|
||||
else
|
||||
strncpy(long_opt_name, "--pvmetadatacopies", 63);
|
||||
break;
|
||||
default:
|
||||
strncpy(long_opt_name, opt_names[opt_enum].long_opt, 63);
|
||||
break;
|
||||
}
|
||||
|
||||
return long_opt_name;
|
||||
}
|
||||
|
||||
void print_man_usage(struct command *cmd)
|
||||
{
|
||||
struct cmd_name *cname;
|
||||
@@ -1665,9 +1573,7 @@ void print_man_usage(struct command *cmd)
|
||||
|
||||
/* print required options with a short opt */
|
||||
for (ro = 0; ro < cmd->ro_count; ro++) {
|
||||
opt_enum = cmd->required_opt_args[ro].opt;
|
||||
|
||||
if (!opt_names[opt_enum].short_opt)
|
||||
if (!opt_names[cmd->required_opt_args[ro].opt].short_opt)
|
||||
continue;
|
||||
|
||||
if (sep) {
|
||||
@@ -1676,13 +1582,13 @@ void print_man_usage(struct command *cmd)
|
||||
printf(" ");
|
||||
}
|
||||
|
||||
if (opt_names[opt_enum].short_opt) {
|
||||
if (opt_names[cmd->required_opt_args[ro].opt].short_opt) {
|
||||
printf(" \\fB-%c\\fP|\\fB%s\\fP",
|
||||
opt_names[opt_enum].short_opt,
|
||||
man_long_opt_name(cmd, opt_enum));
|
||||
opt_names[cmd->required_opt_args[ro].opt].short_opt,
|
||||
opt_names[cmd->required_opt_args[ro].opt].long_opt);
|
||||
} else {
|
||||
printf(" ");
|
||||
printf(" \\fB%s\\fP", man_long_opt_name(cmd, opt_enum));
|
||||
printf(" \\fB%s\\fP", opt_names[cmd->required_opt_args[ro].opt].long_opt);
|
||||
}
|
||||
|
||||
if (cmd->required_opt_args[ro].def.val_bits) {
|
||||
@@ -1695,9 +1601,7 @@ void print_man_usage(struct command *cmd)
|
||||
|
||||
/* print required options without a short opt */
|
||||
for (ro = 0; ro < cmd->ro_count; ro++) {
|
||||
opt_enum = cmd->required_opt_args[ro].opt;
|
||||
|
||||
if (opt_names[opt_enum].short_opt)
|
||||
if (opt_names[cmd->required_opt_args[ro].opt].short_opt)
|
||||
continue;
|
||||
|
||||
if (sep) {
|
||||
@@ -1707,7 +1611,7 @@ void print_man_usage(struct command *cmd)
|
||||
}
|
||||
|
||||
printf(" ");
|
||||
printf(" \\fB%s\\fP", man_long_opt_name(cmd, opt_enum));
|
||||
printf(" \\fB%s\\fP", opt_names[cmd->required_opt_args[ro].opt].long_opt);
|
||||
|
||||
if (cmd->required_opt_args[ro].def.val_bits) {
|
||||
printf(" ");
|
||||
@@ -1749,12 +1653,10 @@ void print_man_usage(struct command *cmd)
|
||||
|
||||
if (cmd->ro_count) {
|
||||
for (ro = 0; ro < cmd->ro_count; ro++) {
|
||||
opt_enum = cmd->required_opt_args[ro].opt;
|
||||
|
||||
if (opt_names[opt_enum].short_opt) {
|
||||
if (opt_names[cmd->required_opt_args[ro].opt].short_opt) {
|
||||
printf(" \\fB-%c\\fP|\\fB%s\\fP",
|
||||
opt_names[opt_enum].short_opt,
|
||||
man_long_opt_name(cmd, opt_enum));
|
||||
opt_names[cmd->required_opt_args[ro].opt].short_opt,
|
||||
opt_names[cmd->required_opt_args[ro].opt].long_opt);
|
||||
} else {
|
||||
printf(" \\fB%s\\fP", opt_names[cmd->required_opt_args[ro].opt].long_opt);
|
||||
}
|
||||
@@ -1820,7 +1722,7 @@ void print_man_usage(struct command *cmd)
|
||||
|
||||
printf(" \\fB-%c\\fP|\\fB%s\\fP",
|
||||
opt_names[opt_enum].short_opt,
|
||||
man_long_opt_name(cmd, opt_enum));
|
||||
opt_names[opt_enum].long_opt);
|
||||
|
||||
if (cmd->optional_opt_args[oo].def.val_bits) {
|
||||
printf(" ");
|
||||
@@ -1858,7 +1760,7 @@ void print_man_usage(struct command *cmd)
|
||||
/* space alignment without short opt */
|
||||
printf(" ");
|
||||
|
||||
printf(" \\fB%s\\fP", man_long_opt_name(cmd, opt_enum));
|
||||
printf(" \\fB%s\\fP", opt_names[opt_enum].long_opt);
|
||||
|
||||
if (cmd->optional_opt_args[oo].def.val_bits) {
|
||||
printf(" ");
|
||||
@@ -1947,7 +1849,7 @@ void print_man_usage_common(struct command *cmd)
|
||||
|
||||
printf(" \\fB-%c\\fP|\\fB%s\\fP",
|
||||
opt_names[opt_enum].short_opt,
|
||||
man_long_opt_name(cmd, opt_enum));
|
||||
opt_names[opt_enum].long_opt);
|
||||
|
||||
if (cmd->optional_opt_args[oo].def.val_bits) {
|
||||
printf(" ");
|
||||
@@ -1983,7 +1885,7 @@ void print_man_usage_common(struct command *cmd)
|
||||
/* space alignment without short opt */
|
||||
printf(" ");
|
||||
|
||||
printf(" \\fB%s\\fP", man_long_opt_name(cmd, opt_enum));
|
||||
printf(" \\fB%s\\fP", opt_names[opt_enum].long_opt);
|
||||
|
||||
if (cmd->optional_opt_args[oo].def.val_bits) {
|
||||
printf(" ");
|
||||
@@ -2011,7 +1913,7 @@ void print_man_usage_common(struct command *cmd)
|
||||
|
||||
printf(" \\fB-%c\\fP|\\fB%s\\fP",
|
||||
opt_names[opt_enum].short_opt,
|
||||
man_long_opt_name(cmd, opt_enum));
|
||||
opt_names[opt_enum].long_opt);
|
||||
|
||||
if (lvm_all.optional_opt_args[oo].def.val_bits) {
|
||||
printf(" ");
|
||||
@@ -2036,7 +1938,7 @@ void print_man_usage_common(struct command *cmd)
|
||||
/* space alignment without short opt */
|
||||
printf(" ");
|
||||
|
||||
printf(" \\fB%s\\fP", man_long_opt_name(cmd, opt_enum));
|
||||
printf(" \\fB%s\\fP", opt_names[opt_enum].long_opt);
|
||||
|
||||
if (lvm_all.optional_opt_args[oo].def.val_bits) {
|
||||
printf(" ");
|
||||
@@ -2044,7 +1946,8 @@ void print_man_usage_common(struct command *cmd)
|
||||
}
|
||||
sep = 1;
|
||||
}
|
||||
printf(" ]\n");
|
||||
printf(" ]\"");
|
||||
printf(";\n");
|
||||
}
|
||||
|
||||
#define DESC_LINE 256
|
||||
@@ -2087,55 +1990,26 @@ void print_desc_man(const char *desc)
|
||||
}
|
||||
}
|
||||
|
||||
static char *upper_command_name(char *str)
|
||||
{
|
||||
static char str_upper[32];
|
||||
int i = 0;
|
||||
|
||||
while (*str) {
|
||||
str_upper[i++] = toupper(*str);
|
||||
str++;
|
||||
}
|
||||
str_upper[i] = '\0';
|
||||
return str_upper;
|
||||
}
|
||||
|
||||
void print_man_command(void)
|
||||
{
|
||||
struct command *cmd, *prev_cmd = NULL;
|
||||
struct command *cmd;
|
||||
const char *last_cmd_name = NULL;
|
||||
const char *desc;
|
||||
int i, j, ro, rp, oo, op;
|
||||
|
||||
include_optional_opt_args(&lvm_all, "OO_USAGE_COMMON");
|
||||
|
||||
printf(".TH %s 8 \"LVM TOOLS #VERSION#\" \"Sistina Software UK\"\n",
|
||||
man_command_name ? upper_command_name(man_command_name) : "LVM_COMMANDS");
|
||||
printf(".TH LVM_COMMANDS 8\n");
|
||||
|
||||
for (i = 0; i < cmd_count; i++) {
|
||||
|
||||
cmd = &cmd_array[i];
|
||||
|
||||
if (prev_cmd && strcmp(prev_cmd->name, cmd->name)) {
|
||||
printf("Common options:\n");
|
||||
printf(".\n");
|
||||
print_man_usage_common(prev_cmd);
|
||||
prev_cmd = NULL;
|
||||
}
|
||||
|
||||
if ((cmd->cmd_flags & CMD_FLAG_SECONDARY_SYNTAX) && !include_man_secondary)
|
||||
continue;
|
||||
|
||||
if (!(cmd->cmd_flags & CMD_FLAG_SECONDARY_SYNTAX) && !include_man_primary)
|
||||
continue;
|
||||
|
||||
if (man_command_name && strcmp(man_command_name, cmd->name))
|
||||
continue;
|
||||
|
||||
if (!prev_cmd || strcmp(prev_cmd->name, cmd->name)) {
|
||||
if (!last_cmd_name || strcmp(last_cmd_name, cmd->name)) {
|
||||
printf(".SH NAME\n");
|
||||
printf(".\n");
|
||||
if ((desc = cmd_name_desc(cmd->name)))
|
||||
printf("%s \\- %s\n", cmd->name, desc);
|
||||
printf("%s - %s\n", cmd->name, desc);
|
||||
else
|
||||
printf("%s\n", cmd->name);
|
||||
printf(".br\n");
|
||||
@@ -2145,7 +2019,7 @@ void print_man_command(void)
|
||||
printf(".br\n");
|
||||
printf(".P\n");
|
||||
printf(".\n");
|
||||
prev_cmd = cmd;
|
||||
last_cmd_name = cmd->name;
|
||||
}
|
||||
|
||||
if (cmd->desc) {
|
||||
@@ -2155,7 +2029,7 @@ void print_man_command(void)
|
||||
|
||||
print_man_usage(cmd);
|
||||
|
||||
if (i == (cmd_count - 1)) {
|
||||
if ((i == (cmd_count - 1)) || strcmp(cmd->name, cmd_array[i+1].name)) {
|
||||
printf("Common options:\n");
|
||||
printf(".\n");
|
||||
print_man_usage_common(cmd);
|
||||
@@ -2196,10 +2070,8 @@ void print_command_struct(int only_usage)
|
||||
printf("commands[%d].oo_count = %d;\n", i, cmd->oo_count);
|
||||
printf("commands[%d].op_count = %d;\n", i, cmd->op_count);
|
||||
|
||||
if (cmd->cmd_flags)
|
||||
printf("commands[%d].cmd_flags = %s;\n", i, cmd_flags_to_str(cmd->cmd_flags));
|
||||
else
|
||||
printf("commands[%d].cmd_flags = 0;\n", i, cmd_flags_to_str(cmd->cmd_flags));
|
||||
if (cmd->cmd_flags & CMD_FLAG_ONE_REQUIRED_OPT)
|
||||
printf("commands[%d].cmd_flags = CMD_FLAG_ONE_REQUIRED_OPT;\n", i);
|
||||
|
||||
printf("commands[%d].desc = \"%s\";\n", i, cmd->desc ?: "");
|
||||
printf("commands[%d].usage = ", i);
|
||||
@@ -2454,9 +2326,6 @@ int main(int argc, char *argv[])
|
||||
static struct option long_options[] = {
|
||||
{"help", no_argument, 0, 'h' },
|
||||
{"output", required_argument, 0, 'o' },
|
||||
{"man-primary", required_argument, 0, 'p' },
|
||||
{"man-secondary", required_argument, 0, 's' },
|
||||
{"man-command", required_argument, 0, 'c' },
|
||||
{0, 0, 0, 0 }
|
||||
};
|
||||
|
||||
@@ -2464,7 +2333,7 @@ int main(int argc, char *argv[])
|
||||
int c;
|
||||
int option_index = 0;
|
||||
|
||||
c = getopt_long(argc, argv, "ho:p:s:c:",
|
||||
c = getopt_long(argc, argv, "ho:",
|
||||
long_options, &option_index);
|
||||
if (c == -1)
|
||||
break;
|
||||
@@ -2478,15 +2347,6 @@ int main(int argc, char *argv[])
|
||||
case 'o':
|
||||
outputformat = strdup(optarg);
|
||||
break;
|
||||
case 'p':
|
||||
include_man_primary = atoi(optarg);
|
||||
break;
|
||||
case 's':
|
||||
include_man_secondary = atoi(optarg);
|
||||
break;
|
||||
case 'c':
|
||||
man_command_name = strdup(optarg);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2549,11 +2409,6 @@ int main(int argc, char *argv[])
|
||||
continue;
|
||||
}
|
||||
|
||||
if (is_flags_line(line_argv[0])) {
|
||||
add_flags(cmd, line_orig);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (is_id_line(line_argv[0])) {
|
||||
cmd->command_line_id = strdup(line_argv[1]);
|
||||
continue;
|
||||
|
||||
@@ -96,34 +96,9 @@ struct command_function command_functions[COMMAND_ID_COUNT] = {
|
||||
{ lvmconfig_general_CMD, lvmconfig },
|
||||
};
|
||||
#if 0
|
||||
/* all raid-related type conversions */
|
||||
|
||||
{ lvconvert_raid_types_CMD, lvconvert_raid_types_fn },
|
||||
|
||||
/* raid-related utilities (move into lvconvert_raid_types?) */
|
||||
|
||||
{ lvconvert_split_mirror_images_CMD, lvconvert_split_mirror_images_fn },
|
||||
{ lvconvert_change_mirrorlog_CMD, lvconvert_change_mirrorlog_fn },
|
||||
|
||||
/* utilities for creating/maintaining thin and cache objects. */
|
||||
|
||||
{ lvconvert_to_thin_with_external_CMD, lvconvert_to_thin_with_external_fn },
|
||||
{ lvconvert_to_cache_vol_CMD, lvconvert_to_cache_vol_fn },
|
||||
{ lvconvert_to_thinpool_CMD, lvconvert_to_thinpool_fn },
|
||||
{ lvconvert_to_cachepool_CMD, lvconvert_to_cachepool_fn },
|
||||
{ lvconvert_split_and_keep_cachepool_CMD, lvconvert_split_and_keep_cachepool_fn },
|
||||
{ lvconvert_split_and_delete_cachepool_CMD, lvconvert_split_and_delete_cachepool_fn },
|
||||
{ lvconvert_swap_pool_metadata_CMD, lvconvert_swap_pool_metadata_fn },
|
||||
|
||||
/* utilities related to snapshots and repair. */
|
||||
|
||||
{ lvconvert_merge_CMD, lvconvert_merge_fn },
|
||||
{ lvconvert_combine_split_snapshot_CMD, lvconvert_combine_split_snapshot_fn },
|
||||
{ lvconvert_repair_pvs_or_thinpool_CMD, lvconvert_repair_pvs_or_thinpool_fn },
|
||||
{ lvconvert_replace_pv_CMD, lvconvert_replace_pv_fn },
|
||||
{ lvconvert_split_cow_snapshot_CMD, lvconvert_split_cow_snapshot_fn },
|
||||
{ lvconvert_poll_start_CMD, lvconvert_poll_start_fn },
|
||||
|
||||
{ lvchange_properties_CMD, lvchange_properties_cmd },
|
||||
{ lvchange_activate_CMD, lvchange_activate_cmd },
|
||||
{ lvchange_refresh_CMD, lvchange_refresh_cmd },
|
||||
#endif
|
||||
|
||||
/* Command line args */
|
||||
@@ -758,105 +733,23 @@ int readahead_arg(struct cmd_context *cmd __attribute__((unused)), struct arg_va
|
||||
/*
|
||||
* Non-zero, positive integer, "all", or "unmanaged"
|
||||
*/
|
||||
int vgmetadatacopies_arg(struct cmd_context *cmd, struct arg_values *av)
|
||||
int metadatacopies_arg(struct cmd_context *cmd, struct arg_values *av)
|
||||
{
|
||||
if (!strcasecmp(av->value, "all")) {
|
||||
av->ui_value = VGMETADATACOPIES_ALL;
|
||||
return 1;
|
||||
}
|
||||
if (!strncmp(cmd->name, "vg", 2)) {
|
||||
if (!strcasecmp(av->value, "all")) {
|
||||
av->ui_value = VGMETADATACOPIES_ALL;
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (!strcasecmp(av->value, "unmanaged")) {
|
||||
av->ui_value = VGMETADATACOPIES_UNMANAGED;
|
||||
return 1;
|
||||
if (!strcasecmp(av->value, "unmanaged")) {
|
||||
av->ui_value = VGMETADATACOPIES_UNMANAGED;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
return int_arg(cmd, av);
|
||||
}
|
||||
|
||||
int pvmetadatacopies_arg(struct cmd_context *cmd, struct arg_values *av)
|
||||
{
|
||||
int num;
|
||||
|
||||
if (!int_arg(cmd, av))
|
||||
return 0;
|
||||
|
||||
num = av->i_value;
|
||||
|
||||
if ((num != 0) && (num != 1) && (num != 2))
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int metadatacopies_arg(struct cmd_context *cmd, struct arg_values *av)
|
||||
{
|
||||
if (!strncmp(cmd->name, "pv", 2))
|
||||
return pvmetadatacopies_arg(cmd, av);
|
||||
if (!strncmp(cmd->name, "vg", 2))
|
||||
return vgmetadatacopies_arg(cmd, av);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int polloperation_arg(struct cmd_context *cmd, struct arg_values *av)
|
||||
{
|
||||
if (!strcmp(av->value, "pvmove") ||
|
||||
!strcmp(av->value, "convert") ||
|
||||
!strcmp(av->value, "merge") ||
|
||||
!strcmp(av->value, "merge_thin"))
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int writemostly_arg(struct cmd_context *cmd, struct arg_values *av)
|
||||
{
|
||||
/* Could we verify that a PV arg looks like /dev/foo ? */
|
||||
return 1;
|
||||
}
|
||||
|
||||
int syncaction_arg(struct cmd_context *cmd, struct arg_values *av)
|
||||
{
|
||||
if (!strcmp(av->value, "check") ||
|
||||
!strcmp(av->value, "repair"))
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int reportformat_arg(struct cmd_context *cmd, struct arg_values *av)
|
||||
{
|
||||
if (!strcmp(av->value, "basic") ||
|
||||
!strcmp(av->value, "json"))
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int configreport_arg(struct cmd_context *cmd, struct arg_values *av)
|
||||
{
|
||||
if (!strcmp(av->value, "log") ||
|
||||
!strcmp(av->value, "vg") ||
|
||||
!strcmp(av->value, "lv") ||
|
||||
!strcmp(av->value, "pv") ||
|
||||
!strcmp(av->value, "pvseg") ||
|
||||
!strcmp(av->value, "seg"))
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int configtype_arg(struct cmd_context *cmd, struct arg_values *av)
|
||||
{
|
||||
if (!strcmp(av->value, "current") ||
|
||||
!strcmp(av->value, "default") ||
|
||||
!strcmp(av->value, "diff") ||
|
||||
!strcmp(av->value, "full") ||
|
||||
!strcmp(av->value, "list") ||
|
||||
!strcmp(av->value, "missing") ||
|
||||
!strcmp(av->value, "new") ||
|
||||
!strcmp(av->value, "profilable") ||
|
||||
!strcmp(av->value, "profilable-command") ||
|
||||
!strcmp(av->value, "profilable-metadata"))
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* FIXME: there's been a confusing mixup among:
|
||||
* resizeable, resizable, allocatable, allocation.
|
||||
@@ -897,14 +790,6 @@ static int _opt_standard_to_synonym(const char *cmd_name, int opt)
|
||||
return raidwritebehind_ARG;
|
||||
case virtualsize_ARG:
|
||||
return virtualoriginsize_ARG;
|
||||
case pvmetadatacopies_ARG:
|
||||
if (!strncmp(cmd_name, "pv", 2))
|
||||
return metadatacopies_ARG;
|
||||
return 0;
|
||||
case vgmetadatacopies_ARG:
|
||||
if (!strncmp(cmd_name, "vg", 2))
|
||||
return metadatacopies_ARG;
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -934,12 +819,6 @@ static int _opt_synonym_to_standard(const char *cmd_name, int opt)
|
||||
return writebehind_ARG;
|
||||
case virtualoriginsize_ARG:
|
||||
return virtualsize_ARG;
|
||||
case metadatacopies_ARG:
|
||||
if (!strncmp(cmd_name, "pv", 2))
|
||||
return pvmetadatacopies_ARG;
|
||||
if (!strncmp(cmd_name, "vg", 2))
|
||||
return vgmetadatacopies_ARG;
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -1610,14 +1489,16 @@ static struct command *_find_command(struct cmd_context *cmd, const char *path,
|
||||
}
|
||||
|
||||
/*
|
||||
* If the user provided a positional arg that is not accepted by
|
||||
* the mached command, then fail.
|
||||
* Warn about positional args that are set but are not used by the command.
|
||||
*
|
||||
* If the last required_pos_arg or the last optional_pos_arg may repeat,
|
||||
* then there won't be unused positional args.
|
||||
*
|
||||
* FIXME: same question as above, should there be a config setting
|
||||
* to just warn/ignore about unused positional args?
|
||||
* Otherwise, warn about positional args that exist beyond the number of
|
||||
* required + optional pos_args.
|
||||
*
|
||||
* FIXME: should an unused positional arg cause the command to fail
|
||||
* like an unused option?
|
||||
*/
|
||||
|
||||
count = commands[best_i].rp_count;
|
||||
@@ -1633,15 +1514,10 @@ static struct command *_find_command(struct cmd_context *cmd, const char *path,
|
||||
break;
|
||||
|
||||
if (count >= (commands[best_i].rp_count + commands[best_i].op_count)) {
|
||||
log_error("Invalid positional argument for command (%s %d): %s.",
|
||||
commands[best_i].command_line_id, best_i, argv[count]);
|
||||
|
||||
/* FIXME: to warn/ignore, clear so it can't be used when processing. */
|
||||
/*
|
||||
log_warn("Ignoring positional argument which is not used by this command: %s.", argv[count]);
|
||||
/* clear so it can't be used when processing. */
|
||||
argv[count] = NULL;
|
||||
(*argc)--;
|
||||
*/
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
out:
|
||||
@@ -1672,9 +1548,6 @@ static int _usage(const char *name, int help_count)
|
||||
if (strcmp(_cmdline.commands[i].name, name))
|
||||
continue;
|
||||
|
||||
if ((_cmdline.commands[i].cmd_flags & CMD_FLAG_SECONDARY_SYNTAX) && (help_count < 3))
|
||||
continue;
|
||||
|
||||
if (strlen(_cmdline.commands[i].desc))
|
||||
_print_description(i);
|
||||
|
||||
@@ -1711,11 +1584,6 @@ static int _usage(const char *name, int help_count)
|
||||
log_print(". The _new suffix indicates the VG or LV must not yet exist.");
|
||||
log_print(". LV followed by _<type> indicates that an LV of the given type");
|
||||
log_print(" is required. (raid represents any raid<N> type.)");
|
||||
log_print(". The default output unit is specified by letter, followed by |unit");
|
||||
log_print(" which represents other possible units: hHbBsSkKmMgGtTpPeE.");
|
||||
log_print(". Output units are 1024 SI base, regardless of unit capitalization.");
|
||||
log_print(". Use --help --help --help to print secondary command syntax");
|
||||
log_print(" formats that are recognized, e.g. for compatibility.");
|
||||
log_print(". See man pages for short option equivalents of long option names,");
|
||||
log_print(" and for more detailed descriptions of variable parameters.");
|
||||
}
|
||||
|
||||
@@ -801,7 +801,10 @@ int vgcreate_params_set_from_args(struct cmd_context *cmd,
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (arg_is_set(cmd, vgmetadatacopies_ARG))
|
||||
if (arg_is_set(cmd, metadatacopies_ARG))
|
||||
vp_new->vgmetadatacopies = arg_int_value(cmd, metadatacopies_ARG,
|
||||
DEFAULT_VGMETADATACOPIES);
|
||||
else if (arg_is_set(cmd, vgmetadatacopies_ARG))
|
||||
vp_new->vgmetadatacopies = arg_int_value(cmd, vgmetadatacopies_ARG,
|
||||
DEFAULT_VGMETADATACOPIES);
|
||||
else
|
||||
@@ -4001,6 +4004,11 @@ int pvcreate_params_from_args(struct cmd_context *cmd, struct pvcreate_params *p
|
||||
if (pp->pva.pvmetadatacopies < 0)
|
||||
pp->pva.pvmetadatacopies = find_config_tree_int(cmd, metadata_pvmetadatacopies_CFG, NULL);
|
||||
|
||||
if (pp->pva.pvmetadatacopies > 2) {
|
||||
log_error("Metadatacopies may only be 0, 1 or 2");
|
||||
return 0;
|
||||
}
|
||||
|
||||
pp->pva.ba_size = arg_uint64_value(cmd, bootloaderareasize_ARG, pp->pva.ba_size);
|
||||
|
||||
return 1;
|
||||
|
||||
@@ -159,15 +159,7 @@ int segtype_arg(struct cmd_context *cmd, struct arg_values *av);
|
||||
int alloc_arg(struct cmd_context *cmd, struct arg_values *av);
|
||||
int locktype_arg(struct cmd_context *cmd, struct arg_values *av);
|
||||
int readahead_arg(struct cmd_context *cmd, struct arg_values *av);
|
||||
int vgmetadatacopies_arg(struct cmd_context *cmd __attribute__((unused)), struct arg_values *av);
|
||||
int pvmetadatacopies_arg(struct cmd_context *cmd __attribute__((unused)), struct arg_values *av);
|
||||
int metadatacopies_arg(struct cmd_context *cmd __attribute__((unused)), struct arg_values *av);
|
||||
int polloperation_arg(struct cmd_context *cmd __attribute__((unused)), struct arg_values *av);
|
||||
int writemostly_arg(struct cmd_context *cmd __attribute__((unused)), struct arg_values *av);
|
||||
int syncaction_arg(struct cmd_context *cmd __attribute__((unused)), struct arg_values *av);
|
||||
int reportformat_arg(struct cmd_context *cmd __attribute__((unused)), struct arg_values *av);
|
||||
int configreport_arg(struct cmd_context *cmd __attribute__((unused)), struct arg_values *av);
|
||||
int configtype_arg(struct cmd_context *cmd __attribute__((unused)), struct arg_values *av);
|
||||
|
||||
/* we use the enums to access the switches */
|
||||
unsigned arg_count(const struct cmd_context *cmd, int a);
|
||||
|
||||
37
tools/vals.h
37
tools/vals.h
@@ -57,13 +57,11 @@
|
||||
* words is not defined or stored in a consistent way,
|
||||
* but is just whatever the parsing function happens to look
|
||||
* for, so adding a new accepted value for the val type is
|
||||
* generally making the parsing function recognize a new
|
||||
* word, and making the implementation code also recognize
|
||||
* that word to do something different. This new word should
|
||||
* then also be added to the usage string for the val type here.
|
||||
* It would be nice if the accepted values could be defined in a
|
||||
* more consistent way, and perhaps in a single place, perhaps in
|
||||
* struct val_props.
|
||||
* often just making the parsing function recognize a new
|
||||
* word. This new word should then also be added to the
|
||||
* usage string for the val type here. It would be nice
|
||||
* if the accepted values could be defined in a more
|
||||
* consistent way, perhaps in struct val_props.
|
||||
*
|
||||
* The usage text for an option is not always the full
|
||||
* set of words accepted for an option, but may be a
|
||||
@@ -94,9 +92,9 @@
|
||||
* should avoid suggesting the upper case letters.
|
||||
*/
|
||||
|
||||
val(none_VAL, NULL, "None", "ERR") /* unused, for enum value 0 */
|
||||
val(conststr_VAL, NULL, "ConstString", "ERR") /* used only for command defs */
|
||||
val(constnum_VAL, NULL, "ConstNumber", "ERR") /* used only for command defs */
|
||||
val(none_VAL, NULL, "None", "") /* unused, for enum value 0 */
|
||||
val(conststr_VAL, NULL, "ConstString", "") /* used only for command defs */
|
||||
val(constnum_VAL, NULL, "ConstNumber", "") /* used only for command defs */
|
||||
val(bool_VAL, yes_no_arg, "Bool", "y|n")
|
||||
val(number_VAL, int_arg, "Number", NULL)
|
||||
val(string_VAL, string_arg, "String", NULL)
|
||||
@@ -121,16 +119,17 @@ val(segtype_VAL, segtype_arg, "SegType", "linear|striped|snapshot|mirror|raid*|t
|
||||
val(alloc_VAL, alloc_arg, "Alloc", "contiguous|cling|cling_by_tags|normal|anywhere|inherit")
|
||||
val(locktype_VAL, locktype_arg, "LockType", "sanlock|dlm|none")
|
||||
val(readahead_VAL, readahead_arg, "Readahead", "auto|none|NumberSectors")
|
||||
val(vgmetadatacopies_VAL, vgmetadatacopies_arg, "MetadataCopiesVG", "all|unmanaged|Number")
|
||||
val(pvmetadatacopies_VAL, pvmetadatacopies_arg, "MetadataCopiesPV", "0|1|2")
|
||||
val(metadatacopies_VAL, metadatacopies_arg, "unused", "unused")
|
||||
val(polloperation_VAL, polloperation_arg, "PollOp", "pvmove|convert|merge|merge_thin")
|
||||
val(writemostly_VAL, writemostly_arg, "WriteMostlyPV", "PV[:t|n|y]")
|
||||
val(syncaction_VAL, syncaction_arg, "SyncAction", "check|repair")
|
||||
val(reportformat_VAL, reportformat_arg, "ReportFmt", "basic|json")
|
||||
val(configreport_VAL, configreport_arg, "ConfigReport", "log|vg|lv|pv|pvseg|seg")
|
||||
val(configtype_VAL, configtype_arg, "ConfigType", "current|default|diff|full|list|missing|new|profilable|profilable-command|profilable-metadata")
|
||||
val(metadatacopies_VAL, metadatacopies_arg, "MetadataCopies", "all|unmanaged|Number")
|
||||
|
||||
/* this should always be last */
|
||||
val(VAL_COUNT, NULL, NULL, NULL)
|
||||
|
||||
/*
|
||||
* FIXME: I suspect many of the following are good candidates for a custom VAL
|
||||
* enum for the benefit of custom parsing, or custom usage, or both:
|
||||
*
|
||||
* configreport_ARG, configtype_ARG, polloperation_ARG, raidrebuild_ARG,
|
||||
* raidsyncaction_ARG, raidwritemostly_ARG, reportformat_ARG, syncaction_ARG,
|
||||
* cachepolicy_ARG, cachesettings_ARG, writemostly_ARG
|
||||
*/
|
||||
|
||||
|
||||
@@ -482,9 +482,6 @@ static int _vgchange_metadata_copies(struct cmd_context *cmd,
|
||||
{
|
||||
uint32_t mda_copies = arg_uint_value(cmd, vgmetadatacopies_ARG, DEFAULT_VGMETADATACOPIES);
|
||||
|
||||
log_warn("vgchange_metadata_copies new %u vg_mda_copies %u D %u",
|
||||
mda_copies, vg_mda_copies(vg), DEFAULT_VGMETADATACOPIES);
|
||||
|
||||
if (mda_copies == vg_mda_copies(vg)) {
|
||||
if (vg_mda_copies(vg) == VGMETADATACOPIES_UNMANAGED)
|
||||
log_warn("Number of metadata copies for VG %s is already unmanaged.",
|
||||
|
||||
@@ -157,12 +157,24 @@ int vgconvert(struct cmd_context *cmd, int argc, char **argv)
|
||||
return EINVALID_CMD_LINE;
|
||||
}
|
||||
|
||||
if (arg_is_set(cmd, metadatacopies_ARG)) {
|
||||
log_error("Invalid option --metadatacopies, "
|
||||
"use --pvmetadatacopies instead.");
|
||||
return EINVALID_CMD_LINE;
|
||||
}
|
||||
if (!(cmd->fmt->features & FMT_MDAS) &&
|
||||
arg_is_set(cmd, pvmetadatacopies_ARG)) {
|
||||
(arg_is_set(cmd, pvmetadatacopies_ARG) ||
|
||||
arg_is_set(cmd, metadatasize_ARG))) {
|
||||
log_error("Metadata parameters only apply to text format");
|
||||
return EINVALID_CMD_LINE;
|
||||
}
|
||||
|
||||
if (arg_is_set(cmd, pvmetadatacopies_ARG) &&
|
||||
arg_int_value(cmd, pvmetadatacopies_ARG, -1) > 2) {
|
||||
log_error("Metadatacopies may only be 0, 1 or 2");
|
||||
return EINVALID_CMD_LINE;
|
||||
}
|
||||
|
||||
if (!(cmd->fmt->features & FMT_BAS) &&
|
||||
arg_is_set(cmd, bootloaderareasize_ARG)) {
|
||||
log_error("Bootloader area parameters only apply to text format");
|
||||
|
||||
@@ -136,6 +136,12 @@ int vgextend(struct cmd_context *cmd, int argc, char **argv)
|
||||
return EINVALID_CMD_LINE;
|
||||
}
|
||||
|
||||
if (arg_is_set(cmd, metadatacopies_ARG)) {
|
||||
log_error("Invalid option --metadatacopies, "
|
||||
"use --pvmetadatacopies instead.");
|
||||
return EINVALID_CMD_LINE;
|
||||
}
|
||||
|
||||
vg_name = skip_dev_dir(cmd, argv[0], NULL);
|
||||
argc--;
|
||||
argv++;
|
||||
|
||||
Reference in New Issue
Block a user