]> sourceware.org Git - lvm2.git/commitdiff
Replicator: use cmd_vg list for _process_one_vg()
authorZdenek Kabelac <zkabelac@redhat.com>
Fri, 21 May 2010 14:11:13 +0000 (14:11 +0000)
committerZdenek Kabelac <zkabelac@redhat.com>
Fri, 21 May 2010 14:11:13 +0000 (14:11 +0000)
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
tools/toollib.c

index bcd2099da88e3aaba1380c603bfc227a8d1b6102..1040bc5546e56b004a609d98da6419f727921255 100644 (file)
--- 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.
index 665d1633b73a930a9a12698fe7d102ef7e7afc2c..b56bdf73ddd4243289bec5b6eb33dd9d07eebf32 100644 (file)
@@ -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,
This page took 0.049747 seconds and 5 git commands to generate.