]> sourceware.org Git - lvm2.git/commitdiff
Patch to fix bug 586021 and mantain historical behavior of
authorJonathan Earl Brassow <jbrassow@redhat.com>
Tue, 27 Apr 2010 14:57:49 +0000 (14:57 +0000)
committerJonathan Earl Brassow <jbrassow@redhat.com>
Tue, 27 Apr 2010 14:57:49 +0000 (14:57 +0000)
being able to remove more images from a mirror than the
number of PVs directly specified for removal.

The effort to fix bug 581611 corrected a bug that was unnoticed
at the time.  The loop in _remove_mirror_images that looks over
the specified PVs was allowing devices that were previously
counted and moved to the end of the list to be double-counted.
This resulted in the number of devices needed for removal always
being satisfied - even if the user did not specify enough PVs
for removal to satisfy the request.  When 581611 was fixed, this
double-counting no longer took place and the result was to remove
only the minimum of the number of PVs specified or the number
that was asked to be removed.

By simply always setting 'new_area_count' (as used to be done
only in the else statement), we return to the previous behavior.
Indeed, this is exactly what the double-counting was allowing
to happen before the fix of 581611.

WHATS_NEW
lib/metadata/mirror.c

index d0844e41103f94156091fb6c023b6e978ee042f3..f0fd00c67d617f7f94f3ce73980392ffca0c135d 100644 (file)
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
 Version 2.02.64 -
 =================================
+  Fix regression in down-convert of mirror images with partial PV specification.
   Fix lvconvert error message when existing mirrored LV is not found.
   Disallow the direct removal of a merging snapshot.
   Set appropriate udev flags for reserved LVs.
index 3a32c4c614c95744cb5fa2b40b74b03a9376ec68..3d9bb0e6257374365eef067f1347e2e87c8d526b 100644 (file)
@@ -805,8 +805,15 @@ static int _remove_mirror_images(struct logical_volume *lv,
                }
                if (num_removed && old_area_count == new_area_count)
                        return 1;
-       } else
-               new_area_count = old_area_count - num_removed;
+       }
+
+       /*
+        * If removable_pvs were specified, then they have been shifted
+        * to the end to ensure they are removed.  The remaining balance
+        * of images left to remove will be taken from the unspecified.
+        * This may not be correct behavior, but it is historical.
+        */
+       new_area_count = old_area_count - num_removed;
 
        /* Remove mimage LVs from the segment */
        dm_list_init(&tmp_orphan_lvs);
This page took 0.038233 seconds and 5 git commands to generate.