mirror of
git://sourceware.org/git/lvm2.git
synced 2024-12-21 13:34:40 +03:00
command: futher move to single struct
Refactor code to not allocate memory for rule->opts, instead use uint16_t array of MAX_RULE_OPTS within cmd_rule. Also print more info if array would not be enough (>= 8).
This commit is contained in:
parent
d3c22aedc4
commit
1c396598ff
@ -1094,8 +1094,6 @@ static void _add_autotype(struct cmd_context *cmdtool, struct command *cmd,
|
||||
cmd->autotype = dm_pool_strdup(cmdtool->libmem, line_argv[1]);
|
||||
}
|
||||
|
||||
#define MAX_RULE_OPTS 64
|
||||
|
||||
static void _add_rule(struct cmd_context *cmdtool, struct command *cmd,
|
||||
int line_argc, char *line_argv[])
|
||||
{
|
||||
@ -1105,7 +1103,7 @@ static void _add_rule(struct cmd_context *cmdtool, struct command *cmd,
|
||||
int check = 0;
|
||||
|
||||
if (cmd->rule_count == CMD_MAX_RULES) {
|
||||
log_error("Parsing command defs: too many rules for cmd.");
|
||||
log_error("Parsing command defs: too many rules for cmd, increate CMD_MAX_RULES.");
|
||||
cmd->cmd_flags |= CMD_FLAG_PARSE_ERROR;
|
||||
return;
|
||||
}
|
||||
@ -1131,22 +1129,10 @@ static void _add_rule(struct cmd_context *cmdtool, struct command *cmd,
|
||||
}
|
||||
|
||||
else if (!strncmp(arg, "--", 2)) {
|
||||
if (!rule->opts) {
|
||||
if (!(rule->opts = dm_pool_alloc(cmdtool->libmem, MAX_RULE_OPTS * sizeof(int)))) {
|
||||
log_error("Parsing command defs: no mem.");
|
||||
cmd->cmd_flags |= CMD_FLAG_PARSE_ERROR;
|
||||
return;
|
||||
}
|
||||
memset(rule->opts, 0, MAX_RULE_OPTS * sizeof(int));
|
||||
}
|
||||
|
||||
if (!rule->check_opts) {
|
||||
if (!(rule->check_opts = dm_pool_alloc(cmdtool->libmem, MAX_RULE_OPTS * sizeof(int)))) {
|
||||
log_error("Parsing command defs: no mem.");
|
||||
cmd->cmd_flags |= CMD_FLAG_PARSE_ERROR;
|
||||
return;
|
||||
}
|
||||
memset(rule->check_opts, 0, MAX_RULE_OPTS * sizeof(int));
|
||||
if (rule->opts_count >= MAX_RULE_OPTS || rule->check_opts_count >= MAX_RULE_OPTS) {
|
||||
log_error("Parsing command defs: too many cmd_rule options for cmd, increase MAX_RULE_OPTS.");
|
||||
cmd->cmd_flags |= CMD_FLAG_PARSE_ERROR;
|
||||
return;
|
||||
}
|
||||
|
||||
if (check)
|
||||
|
@ -131,16 +131,18 @@ struct pos_arg {
|
||||
|
||||
#define RULE_INVALID 1
|
||||
#define RULE_REQUIRE 2
|
||||
#define MAX_RULE_OPTS 8
|
||||
|
||||
struct cmd_rule {
|
||||
int *opts; /* if any option in this list is set, the check may apply */
|
||||
uint64_t lvt_bits; /* if LV has one of these types (lvt_enum_to_bit), the check may apply */
|
||||
uint64_t lvp_bits; /* if LV has all of these properties (lvp_enum_to_bit), the check may apply */
|
||||
|
||||
int *check_opts; /* used options must [not] be in this list */
|
||||
uint64_t check_lvt_bits; /* LV must [not] have one of these type */
|
||||
uint64_t check_lvp_bits; /* LV must [not] have all of these properties */
|
||||
|
||||
uint16_t opts[MAX_RULE_OPTS]; /* if any option in this list is set, the check may apply */
|
||||
uint16_t check_opts[MAX_RULE_OPTS];/* used options must [not] be in this list */
|
||||
|
||||
uint16_t rule; /* RULE_INVALID, RULE_REQUIRE: check values must [not] be true */
|
||||
uint16_t opts_count; /* entries in opts[] */
|
||||
uint16_t check_opts_count; /* entries in check_opts[] */
|
||||
|
@ -2612,7 +2612,7 @@ static struct lv_segment _historical_lv_segment = {
|
||||
.origin_list = DM_LIST_HEAD_INIT(_historical_lv_segment.origin_list),
|
||||
};
|
||||
|
||||
int opt_in_list_is_set(struct cmd_context *cmd, int *opts, int count,
|
||||
int opt_in_list_is_set(struct cmd_context *cmd, const uint16_t *opts, int count,
|
||||
int *match_count, int *unmatch_count)
|
||||
{
|
||||
int match = 0;
|
||||
@ -2634,7 +2634,7 @@ int opt_in_list_is_set(struct cmd_context *cmd, int *opts, int count,
|
||||
return match ? 1 : 0;
|
||||
}
|
||||
|
||||
void opt_array_to_str(struct cmd_context *cmd, int *opts, int count,
|
||||
void opt_array_to_str(struct cmd_context *cmd, const uint16_t *opts, int count,
|
||||
char *buf, int len)
|
||||
{
|
||||
int pos = 0;
|
||||
@ -3105,7 +3105,7 @@ static int _check_lv_rules(struct cmd_context *cmd, struct logical_volume *lv)
|
||||
* Check the options, LV types, LV properties.
|
||||
*/
|
||||
|
||||
if (rule->check_opts)
|
||||
if (rule->check_opts_count)
|
||||
opt_in_list_is_set(cmd, rule->check_opts, rule->check_opts_count,
|
||||
&opts_match_count, &opts_unmatch_count);
|
||||
|
||||
@ -3127,7 +3127,7 @@ static int _check_lv_rules(struct cmd_context *cmd, struct logical_volume *lv)
|
||||
|
||||
/* Fail if any invalid options are set. */
|
||||
|
||||
if (rule->check_opts && (rule->rule == RULE_INVALID) && opts_match_count) {
|
||||
if (rule->check_opts_count && (rule->rule == RULE_INVALID) && opts_match_count) {
|
||||
memset(buf, 0, sizeof(buf));
|
||||
opt_array_to_str(cmd, rule->check_opts, rule->check_opts_count, buf, sizeof(buf));
|
||||
log_warn("WARNING: Command on LV %s has invalid use of option %s.",
|
||||
@ -3137,7 +3137,7 @@ static int _check_lv_rules(struct cmd_context *cmd, struct logical_volume *lv)
|
||||
|
||||
/* Fail if any required options are not set. */
|
||||
|
||||
if (rule->check_opts && (rule->rule == RULE_REQUIRE) && opts_unmatch_count) {
|
||||
if (rule->check_opts_count && (rule->rule == RULE_REQUIRE) && opts_unmatch_count) {
|
||||
memset(buf, 0, sizeof(buf));
|
||||
opt_array_to_str(cmd, rule->check_opts, rule->check_opts_count, buf, sizeof(buf));
|
||||
log_warn("WARNING: Command on LV %s requires option %s.",
|
||||
|
@ -173,10 +173,10 @@ const char *extract_vgname(struct cmd_context *cmd, const char *lv_name);
|
||||
const char *skip_dev_dir(struct cmd_context *cmd, const char *vg_name,
|
||||
unsigned *dev_dir_found);
|
||||
|
||||
int opt_in_list_is_set(struct cmd_context *cmd, int *opts, int count,
|
||||
int opt_in_list_is_set(struct cmd_context *cmd, const uint16_t *opts, int count,
|
||||
int *match_count, int *unmatch_count);
|
||||
|
||||
void opt_array_to_str(struct cmd_context *cmd, int *opts, int count,
|
||||
void opt_array_to_str(struct cmd_context *cmd, const uint16_t *opts, int count,
|
||||
char *buf, int len);
|
||||
|
||||
int pvcreate_params_from_args(struct cmd_context *cmd, struct pvcreate_params *pp);
|
||||
|
Loading…
Reference in New Issue
Block a user