]> sourceware.org Git - lvm2.git/commitdiff
Committing Taka's patch... He found a problem during
authorJonathan Earl Brassow <jbrassow@redhat.com>
Wed, 23 Jun 2010 20:32:29 +0000 (20:32 +0000)
committerJonathan Earl Brassow <jbrassow@redhat.com>
Wed, 23 Jun 2010 20:32:29 +0000 (20:32 +0000)
the failure of a device that contained both a image of
a mirror and an image of the mirrored log.  The order
of the handling of those faults was important (and
wrong), this patch corrects that.

Patch-From: Takahiro Yasui <tyasui@redhat.com>

tools/lvconvert.c

index 0d602064278b0a8e3826a8e0cacf22ead5243fd1..d7b48d090d391fb296377c6d1346aa692310634d 100644 (file)
@@ -689,6 +689,27 @@ static int _get_log_count(struct logical_volume *lv)
        return lv_mirror_count(log_lv);
 }
 
+static int _lv_update_mirrored_log(struct logical_volume *lv,
+                                  struct dm_list *operable_pvs,
+                                  int log_count)
+{
+       int old_log_count;
+       struct logical_volume *log_lv;
+
+       log_lv = first_seg(_original_lv(lv))->log_lv;
+       if (!log_lv || !(log_lv->status & MIRRORED))
+               return 1;
+
+       old_log_count = _get_log_count(lv);
+       if (old_log_count == log_count)
+               return 1;
+
+       /* Reducing redundancy of the log */
+       return remove_mirror_images(log_lv, log_count,
+                                   is_mirror_image_removable,
+                                   operable_pvs, 0U);
+}
+
 static int _lv_update_log_type(struct cmd_context *cmd,
                               struct lvconvert_params *lp,
                               struct logical_volume *lv,
@@ -1218,15 +1239,23 @@ static int _lvconvert_mirrors_repair(struct cmd_context *cmd,
         * We must adjust the log first, or the entire mirror
         * will get stuck during a suspend.
         */
-       if (!_lv_update_log_type(cmd, lp, lv, failed_pvs, new_log_count))
+       if (!_lv_update_mirrored_log(lv, failed_pvs, new_log_count))
                return 0;
 
+       if (lp->mirrors == 1)
+               new_log_count = 0;
+
        if (failed_mirrors) {
-               if (!lv_remove_mirrors(cmd, lv, failed_mirrors, new_log_count,
+               if (!lv_remove_mirrors(cmd, lv, failed_mirrors,
+                                      new_log_count ? 0U : 1U,
                                       _is_partial_lv, NULL, 0))
                        return 0;
        }
 
+       if (!_lv_update_log_type(cmd, lp, lv, failed_pvs,
+                                new_log_count))
+               return 0;
+
        if (!_reload_lv(cmd, lv))
                return 0;
 
This page took 0.046012 seconds and 5 git commands to generate.