summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Teigland <teigland@redhat.com>2013-03-13 15:10:16 -0500
committerPetr Rockai <prockai@redhat.com>2013-04-11 15:24:55 +0200
commit5f9f63e6395fbed130ab3e71ad511a12123a576f (patch)
tree1bd353e99266a339655c93a91592bb00204610e6
parentf3375bf202e5d9c755b9b2a4f953bf5daecbd134 (diff)
downloadlvm2-5f9f63e6395fbed130ab3e71ad511a12123a576f.tar.gz
toollib: remove replicator wrappers in vg processing
The cmd_vg wrappers were not serving any purpose because a single vg was only ever added to the cmd_vg set. Remove the cmd_vg layer in process_each_vg to simplify the code. Pull the previous _process_one_vg into the calling function and clarify some of the logic.
-rw-r--r--tools/toollib.c97
1 files changed, 41 insertions, 56 deletions
diff --git a/tools/toollib.c b/tools/toollib.c
index f6824063f..2ecc05eb8 100644
--- a/tools/toollib.c
+++ b/tools/toollib.c
@@ -274,58 +274,6 @@ int process_each_segment_in_lv(struct cmd_context *cmd,
return ret_max;
}
-static int _process_one_vg(struct cmd_context *cmd, const char *vg_name,
- struct dm_list *tags, struct dm_list *arg_vgnames,
- uint32_t flags, void *handle, int ret_max,
- process_single_vg_fn_t process_single_vg)
-{
- struct dm_list cmd_vgs;
- struct cmd_vg *cvl_vg;
- int ret = 0;
-
- log_verbose("Finding volume group \"%s\"", vg_name);
-
- dm_list_init(&cmd_vgs);
- if (!(cvl_vg = cmd_vg_add(cmd->mem, &cmd_vgs, vg_name, NULL, flags)))
- return_0;
-
- for (;;) {
- /* FIXME: consistent handling of command break */
- if (sigint_caught()) {
- ret = ECMD_FAILED;
- break;
- }
- if (!cmd_vg_read(cmd, &cmd_vgs))
- /* Allow FAILED_INCONSISTENT through only for vgcfgrestore */
- if (vg_read_error(cvl_vg->vg) &&
- (!((flags & READ_ALLOW_INCONSISTENT) &&
- (vg_read_error(cvl_vg->vg) == FAILED_INCONSISTENT)))) {
- ret = ECMD_FAILED;
- break;
- }
-
- if (!dm_list_empty(tags) &&
- /* Only process if a tag matches or it's on arg_vgnames */
- !str_list_match_item(arg_vgnames, vg_name) &&
- !str_list_match_list(tags, &cvl_vg->vg->tags, NULL))
- break;
-
- ret = process_single_vg(cmd, vg_name, cvl_vg->vg, handle);
-
- if (vg_read_error(cvl_vg->vg)) /* FAILED_INCONSISTENT */
- break;
-
- if (!cvl_vg->vg->cmd_missing_vgs)
- break;
-
- free_cmd_vgs(&cmd_vgs);
- }
-
- free_cmd_vgs(&cmd_vgs);
-
- return (ret > ret_max) ? ret : ret_max;
-}
-
int process_each_pv_in_vg(struct cmd_context *cmd, struct volume_group *vg,
const struct dm_list *tags, void *handle,
process_single_pv_fn_t process_single_pv)
@@ -1530,17 +1478,54 @@ static int process_vg_name_list(struct cmd_context *cmd, uint32_t flags,
void *handle,
process_single_vg_fn_t process_single_vg)
{
+ struct volume_group *vg;
struct str_list *sl;
const char *vgname;
int ret_max = ECMD_PROCESSED;
+ int ret = 0;
+ int process_all = 0;
+ int process_vg;
+
+ if (dm_list_empty(arg_vgnames) && dm_list_empty(arg_tags))
+ process_all = 1;
dm_list_iterate_items(sl, vg_name_list) {
vgname = sl->str;
- ret_max = _process_one_vg(cmd, vgname,
- arg_tags, arg_vgnames,
- flags, handle, ret_max,
- process_single_vg);
+ vg = vg_read(cmd, vgname, NULL, flags);
+ if (vg_read_error(vg)) {
+ if (!((flags & READ_ALLOW_INCONSISTENT) &&
+ (vg_read_error(vg) == FAILED_INCONSISTENT))) {
+ ret_max = ECMD_FAILED;
+ release_vg(vg);
+ stack;
+ continue;
+ }
+ }
+
+ process_vg = 0;
+
+ if (process_all)
+ process_vg = 1;
+
+ if (!process_vg && !dm_list_empty(arg_vgnames) &&
+ str_list_match_item(arg_vgnames, vgname))
+ process_vg = 1;
+
+ if (!process_vg && !dm_list_empty(arg_tags) &&
+ str_list_match_list(arg_tags, &vg->tags, NULL))
+ process_vg = 1;
+
+ if (process_vg)
+ ret = process_single_vg(cmd, vgname, vg, handle);
+
+ if (vg_read_error(vg))
+ release_vg(vg);
+ else
+ unlock_and_release_vg(cmd, vg, vgname);
+
+ if (ret > ret_max)
+ ret_max = ret;
if (sigint_caught())
break;
}