]> sourceware.org Git - lvm2.git/commitdiff
Fix vgsplit when there are mirrors that have mirrored logs.
authorJonathan Earl Brassow <jbrassow@redhat.com>
Thu, 6 Oct 2011 14:17:45 +0000 (14:17 +0000)
committerJonathan Earl Brassow <jbrassow@redhat.com>
Thu, 6 Oct 2011 14:17:45 +0000 (14:17 +0000)
The problem as reported by "ben <benscott@nwlink.com>" on lvm-devel:

vgsplit fails with mirrored mirror log

#lvs --all -o lv_name,lv_attr,devices
LV                       Attr   Devices
MyMirror                 mwi--
[MyMirror_mimage_0]      Iwi--- /dev/sdq(0)
[MyMirror_mimage_1]      Iwi--- /dev/sdo(0)
[MyMirror_mimage_2]      Iwi--- /dev/sdi(0)
[MyMirror_mlog]          mwi---
[MyMirror_mlog_mimage_0] Iwi--- /dev/sds(0)
[MyMirror_mlog_mimage_1] Iwi--- /dev/sde(0)

#vgsplit -v "TestA" "TestB" "/dev/sdq" "/dev/sdo" "/dev/sdi" "/dev/sds"
"/dev/sde"
  Checking for volume group "TestA"
  Checking for new volume group "TestB"
  Archiving volume group "TestA" metadata (seqno 213).
Can't split mirror MyMirror between two Volume Groups

AFTER FIX:

[root@bp-01 ~]# lvs -a -o name,vg_name,devices vg new
  Volume group "new" not found
  Skipping volume group new
  LV                 VG   Devices
  lv                 vg   lv_mimage_0(0),lv_mimage_1(0)
  [lv_mimage_0]      vg   /dev/sdb1(0)
  [lv_mimage_1]      vg   /dev/sdc1(0)
  [lv_mlog]          vg   lv_mlog_mimage_0(0),lv_mlog_mimage_1(0)
  [lv_mlog_mimage_0] vg   /dev/sdh1(0)
  [lv_mlog_mimage_1] vg   /dev/sdi1(0)
[root@bp-01 ~]# vgsplit vg new /dev/sd[bchi]1
  New volume group "new" successfully split from "vg"
[root@bp-01 ~]# lvs -a -o name,vg_name,devices vg new
  LV                 VG   Devices
  lv                 new  lv_mimage_0(0),lv_mimage_1(0)
  [lv_mimage_0]      new  /dev/sdb1(0)
  [lv_mimage_1]      new  /dev/sdc1(0)
  [lv_mlog]          new  lv_mlog_mimage_0(0),lv_mlog_mimage_1(0)
  [lv_mlog_mimage_0] new  /dev/sdh1(0)
  [lv_mlog_mimage_1] new  /dev/sdi1(0)

WHATS_NEW
test/t-vgsplit-operation.sh
tools/vgsplit.c

index 82c586c4e3db48e396976da55f428854b2e7305f..6ad6384bae7f688cd6fbc6d0c1a1fbe14c4ea590 100644 (file)
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
 Version 2.02.89 - 
 ==================================
+  Fix vgsplit when there are mirrors that have mirrored logs.
   Clarify multi-name device filter pattern matching explanation in lvm.conf.5.
   Introduce lv_send_message and dev_manager_send_message.
   Introduce revert_lv for better pvmove cleanup.
index 4ff5bce868e3915e38b7748eb9fbd0be859ca0ee..20a5cb2558f0160dda2030affd896f779964a05c 100755 (executable)
@@ -93,6 +93,31 @@ COMM "vgsplit correctly splits mirror LV into $i VG ($j args)"
                fi 
                lvremove -f $vg2/$lv1 
                vgremove -f $vg2
+# FIXME: ensure split /doesn't/ work when not all devs of mirror specified
+
+COMM "vgsplit correctly splits mirror LV with mirrored log into $i VG ($j args)"
+               vgcreate -c n $vg1 $dev1 $dev2 $dev3 $dev4
+               if [ $i = existing ]; then
+                 vgcreate -c n $vg2 $dev5
+               fi
+
+               lvcreate -l 64 --mirrorlog mirrored -m1 -n $lv1 $vg1 \
+                   $dev1 $dev2 $dev3 $dev4
+
+               vgchange -an $vg1
+               if [ $j = PV ]; then
+                 vgsplit $vg1 $vg2 $dev1 $dev2 $dev3 $dev4
+               else
+                 vgsplit -n $lv1 $vg1 $vg2
+               fi
+               if [ $i = existing ]; then
+                 check pvlv_counts $vg2 5 1 0
+               else
+                 check pvlv_counts $vg2 4 1 0
+               fi
+               lvremove -f $vg2/$lv1
+               vgremove -f $vg2
+# FIXME: ensure split /doesn't/ work when not all devs of mirror specified
 
 COMM "vgsplit correctly splits origin and snapshot LV into $i VG ($j args)" 
                vgcreate -c n $vg1 $dev1 $dev2 
index 95b7d38dc62bc8e53b130026570b9661596ece70..73f94a8d222cb52c6cd108311b44189289d94aac 100644 (file)
@@ -163,7 +163,7 @@ static int _move_mirrors(struct volume_group *vg_from,
 {
        struct dm_list *lvh, *lvht;
        struct logical_volume *lv;
-       struct lv_segment *seg;
+       struct lv_segment *seg, *log_seg;
        unsigned s, seg_in, log_in;
 
        dm_list_iterate_safe(lvh, lvht, &vg_from->lvs) {
@@ -179,7 +179,20 @@ static int _move_mirrors(struct volume_group *vg_from,
                        if (_lv_is_in_vg(vg_to, seg_lv(seg, s)))
                            seg_in++;
 
-               log_in = (!seg->log_lv || _lv_is_in_vg(vg_to, seg->log_lv));
+               log_in = !seg->log_lv;
+               if (seg->log_lv) {
+                       log_seg = first_seg(seg->log_lv);
+                       if (seg_is_mirrored(log_seg)) {
+                               log_in = 1;
+
+                               /* Ensure each log dev is in vg_to */
+                               for (s = 0; s < log_seg->area_count; s++)
+                                       log_in = log_in &&
+                                               _lv_is_in_vg(vg_to,
+                                                            seg_lv(log_seg, s));
+                       } else
+                               log_in = _lv_is_in_vg(vg_to, seg->log_lv);
+               }
 
                if ((seg_in && seg_in < seg->area_count) ||
                    (seg_in && seg->log_lv && !log_in) ||
This page took 0.042147 seconds and 5 git commands to generate.