From 780010a26827a65e56c789077813c7805738c97e Mon Sep 17 00:00:00 2001 From: Zdenek Kabelac Date: Fri, 21 May 2010 14:11:13 +0000 Subject: [PATCH] Replicator: use cmd_vg list for _process_one_vg() Patch modifes behavior of _process_one_vg(). In the first pass vg_read() collectis for replicator sorted list of additional VGs during lock_vol(). If any other VG is needed by the replicator and it is not yet opened then next iteration loop is taken with all collected VGs. Flag vg->cmd_missing_vgs detects missing VGs. --- WHATS_NEW | 1 + tools/toollib.c | 60 ++++++++++++++++++++++++++++++------------------- 2 files changed, 38 insertions(+), 23 deletions(-) diff --git a/WHATS_NEW b/WHATS_NEW index bcd2099da..1040bc554 100644 --- a/WHATS_NEW +++ b/WHATS_NEW @@ -1,5 +1,6 @@ Version 2.02.67 - =============================== + Update _process_one_vg() to work with cmd_vg struture. Add functions for read and release VGs list. Add find_replicator_vgs() to discover all needed VGs for replicator-dev LV. Add functions for handling cmd_vg structure. diff --git a/tools/toollib.c b/tools/toollib.c index 665d1633b..b56bdf73d 100644 --- a/tools/toollib.c +++ b/tools/toollib.c @@ -432,37 +432,51 @@ static int _process_one_vg(struct cmd_context *cmd, const char *vg_name, uint32_t flags, void *handle, int ret_max, process_single_vg_fn_t process_single_vg) { - struct volume_group *vg; + struct dm_list cmd_vgs; + struct cmd_vg *cvl_vg; int ret = 0; log_verbose("Finding volume group \"%s\"", vg_name); - vg = vg_read(cmd, vg_name, vgid, flags); - /* Allow FAILED_INCONSISTENT through only for vgcfgrestore */ - if (vg_read_error(vg) && - !((vg_read_error(vg) == FAILED_INCONSISTENT) && - (flags & READ_ALLOW_INCONSISTENT))) { - ret_max = ECMD_FAILED; - goto_out; - } + dm_list_init(&cmd_vgs); + if (!(cvl_vg = cmd_vg_add(cmd->mem, &cmd_vgs, vg_name, vgid, 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)) + 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; - if (!dm_list_empty(tags)) { - /* Only process if a tag matches or it's on arg_vgnames */ - if (!str_list_match_item(arg_vgnames, vg_name) && - !str_list_match_list(tags, &vg->tags)) - goto out; + cmd_vg_release(&cmd_vgs); } - if ((ret = process_single_vg(cmd, vg_name, vg, - handle)) > ret_max) - ret_max = ret; + cmd_vg_release(&cmd_vgs); -out: - if (vg_read_error(vg)) - vg_release(vg); - else - unlock_and_release_vg(cmd, vg, vg_name); - return ret_max; + return (ret > ret_max) ? ret : ret_max; } int process_each_vg(struct cmd_context *cmd, int argc, char **argv, -- 2.43.5