Am Sonntag, den 18.11.2012, 13:52 +0100 schrieb Bastian Blank:
On Sun, Nov 18, 2012 at 12:27:12PM +0100, t...@coldtobi.de wrote:
> > I've prepared an NMU for lvm2 (versioned as 2.02.95-4.1) and
> > will be uploaded via my sponsor to DELAYED/5. Please feel free to tell me 
> > if I
> > should delay it longer.
>
> How does this work without any change except of the changelog? Or is the
> patch incomplete?
>
> Bastian
> 
No, of course not.
It seems, that I was unable to use nmudiff properly ...
However, lets retry:

diff -Nru lvm2-2.02.95/debian/changelog lvm2-2.02.95/debian/changelog
--- lvm2-2.02.95/debian/changelog       2012-05-27 19:05:43.000000000 +0200
+++ lvm2-2.02.95/debian/changelog       2012-11-18 12:29:14.000000000 +0100
@@ -1,3 +1,11 @@
+lvm2 (2.02.95-4.1) unstable; urgency=low
+
+  * Non-maintainer upload.
+  * Fix "Losing data when moving LV between regular HD -> SSD"
+    Applied upstream patch (from 2.02.97) (Closes: #691271)
+
+ -- Tobias Frost <t...@coldtobi.de>  Sun, 18 Nov 2012 12:12:22 +0100
+
 lvm2 (2.02.95-4) unstable; urgency=low
 
   * Force building with -j1.
diff -Nru lvm2-2.02.95/debian/patches/lvm-patch-691271.patch 
lvm2-2.02.95/debian/patches/lvm-patch-691271.patch
--- lvm2-2.02.95/debian/patches/lvm-patch-691271.patch  1970-01-01 
01:00:00.000000000 +0100
+++ lvm2-2.02.95/debian/patches/lvm-patch-691271.patch  2012-11-18 
11:43:09.000000000 +0100
@@ -0,0 +1,280 @@
+# Subject: pmmove leads to data-loss when used with issue_discards=1
+# Bug: https://bugzilla.redhat.com/show_bug.cgi?id=832392
+# Origin: 
https://lists.fedorahosted.org/pipermail/lvm2-commits/2012-June/000037.html
+#  https://lists.fedorahosted.org/pipermail/lvm2-commits/2012-June/000038.html
+#  https://lists.fedorahosted.org/pipermail/lvm2-commits/2012-June/000039.html
+# Applied-Upstream: lvm2-2.02.97-2
+--- a/lib/metadata/lv_alloc.h
++++ b/lib/metadata/lv_alloc.h
+@@ -40,8 +40,9 @@
+                          uint64_t status);
+ int move_lv_segment_area(struct lv_segment *seg_to, uint32_t area_to,
+                        struct lv_segment *seg_from, uint32_t area_from);
+-void release_lv_segment_area(struct lv_segment *seg, uint32_t s,
+-                           uint32_t area_reduction);
++int release_lv_segment_area(struct lv_segment *seg, uint32_t s,
++                          uint32_t area_reduction);
++int release_and_discard_lv_segment_area(struct lv_segment *seg, uint32_t s, 
uint32_t area_reduction);
+ 
+ struct alloc_handle;
+ struct alloc_handle *allocate_extents(struct volume_group *vg,
+--- a/lib/metadata/lv_manip.c
++++ b/lib/metadata/lv_manip.c
+@@ -299,24 +299,30 @@
+       return seg;
+ }
+ 
+-void release_lv_segment_area(struct lv_segment *seg, uint32_t s,
+-                           uint32_t area_reduction)
++static int _release_and_discard_lv_segment_area(struct lv_segment *seg, 
uint32_t s,
++                                              uint32_t area_reduction, int 
with_discard)
+ {
+       if (seg_type(seg, s) == AREA_UNASSIGNED)
+-              return;
++              return 1;
+ 
+       if (seg_type(seg, s) == AREA_PV) {
+-              if (release_pv_segment(seg_pvseg(seg, s), area_reduction) &&
+-                  seg->area_len == area_reduction)
++              if (with_discard && !discard_pv_segment(seg_pvseg(seg, s), 
area_reduction))
++                      return_0;
++
++              if (!release_pv_segment(seg_pvseg(seg, s), area_reduction))
++                      return_0;
++
++              if (seg->area_len == area_reduction)
+                       seg_type(seg, s) = AREA_UNASSIGNED;
+-              return;
++
++              return 1;
+       }
+ 
+       if ((seg_lv(seg, s)->status & MIRROR_IMAGE) ||
+           (seg_lv(seg, s)->status & THIN_POOL_DATA)) {
+               if (!lv_reduce(seg_lv(seg, s), area_reduction))
+-                      stack; /* FIXME: any upper level reporting */
+-              return;
++                      return_0; /* FIXME: any upper level reporting */
++              return 1;
+       }
+ 
+       if (seg_lv(seg, s)->status & RAID_IMAGE) {
+@@ -328,12 +334,12 @@
+               */
+               if (area_reduction != seg->area_len) {
+                       log_error("Unable to reduce RAID LV - operation not 
implemented.");
+-                      return;
++                      return_0;
+               } else {
+                       if (!lv_remove(seg_lv(seg, s))) {
+                               log_error("Failed to remove RAID image %s",
+                                         seg_lv(seg, s)->name);
+-                              return;
++                              return 0;
+                       }
+               }
+ 
+@@ -343,10 +349,10 @@
+                                      seg_metalv(seg, s)->le_count)) {
+                               log_error("Failed to remove RAID meta-device 
%s",
+                                         seg_metalv(seg, s)->name);
+-                              return;
++                              return 0;
+                       }
+               }
+-              return;
++              return 1;
+       }
+ 
+       if (area_reduction == seg->area_len) {
+@@ -360,6 +366,18 @@
+               seg_le(seg, s) = 0;
+               seg_type(seg, s) = AREA_UNASSIGNED;
+       }
++
++      return 1;
++}
++
++int release_and_discard_lv_segment_area(struct lv_segment *seg, uint32_t s, 
uint32_t area_reduction)
++{
++      return _release_and_discard_lv_segment_area(seg, s, area_reduction, 1);
++}
++
++int release_lv_segment_area(struct lv_segment *seg, uint32_t s, uint32_t 
area_reduction)
++{
++      return _release_and_discard_lv_segment_area(seg, s, area_reduction, 0);
+ }
+ 
+ /*
+@@ -377,9 +395,11 @@
+               pv = seg_pv(seg_from, area_from);
+               pe = seg_pe(seg_from, area_from);
+ 
+-              release_lv_segment_area(seg_from, area_from,
+-                                      seg_from->area_len);
+-              release_lv_segment_area(seg_to, area_to, seg_to->area_len);
++              if (!release_lv_segment_area(seg_from, area_from, 
seg_from->area_len))
++                      return_0;
++
++              if (!release_lv_segment_area(seg_to, area_to, seg_to->area_len))
++                      return_0;
+ 
+               if (!set_lv_segment_area_pv(seg_to, area_to, pv, pe))
+                       return_0;
+@@ -390,9 +410,11 @@
+               lv = seg_lv(seg_from, area_from);
+               le = seg_le(seg_from, area_from);
+ 
+-              release_lv_segment_area(seg_from, area_from,
+-                                      seg_from->area_len);
+-              release_lv_segment_area(seg_to, area_to, seg_to->area_len);
++              if (!release_lv_segment_area(seg_from, area_from, 
seg_from->area_len))
++                      return_0;
++
++              if (!release_lv_segment_area(seg_to, area_to, seg_to->area_len))
++                      return_0;
+ 
+               if (!set_lv_segment_area_lv(seg_to, area_to, lv, le, 0))
+                       return_0;
+@@ -400,7 +422,8 @@
+               break;
+ 
+       case AREA_UNASSIGNED:
+-              release_lv_segment_area(seg_to, area_to, seg_to->area_len);
++              if (!release_lv_segment_area(seg_to, area_to, seg_to->area_len))
++                      return_0;
+       }
+ 
+       return 1;
+@@ -493,7 +516,8 @@
+               area_reduction = reduction;
+ 
+       for (s = 0; s < seg->area_count; s++)
+-              release_lv_segment_area(seg, s, area_reduction);
++              if (!release_and_discard_lv_segment_area(seg, s, 
area_reduction))
++                      return_0;
+ 
+       seg->len -= reduction;
+       seg->area_len -= area_reduction;
+--- a/lib/metadata/mirror.c
++++ b/lib/metadata/mirror.c
+@@ -645,8 +645,8 @@
+               sub_lv = seg_lv(mirrored_seg, mirrored_seg->area_count);
+ 
+               sub_lv->status &= ~MIRROR_IMAGE;
+-              release_lv_segment_area(mirrored_seg, mirrored_seg->area_count,
+-                                      mirrored_seg->area_len);
++              if (!release_lv_segment_area(mirrored_seg, 
mirrored_seg->area_count, mirrored_seg->area_len))
++                      return_0;
+ 
+               log_very_verbose("%s assigned to be split", sub_lv->name);
+ 
+@@ -906,7 +906,8 @@
+               }
+               lvl->lv = seg_lv(mirrored_seg, m);
+               dm_list_add(&tmp_orphan_lvs, &lvl->list);
+-              release_lv_segment_area(mirrored_seg, m, 
mirrored_seg->area_len);
++              if (!release_lv_segment_area(mirrored_seg, m, 
mirrored_seg->area_len))
++                      return_0;
+       }
+       mirrored_seg->area_count = new_area_count;
+ 
+@@ -1468,7 +1469,8 @@
+               }
+ 
+               for (s = new_mirrors + 1; s < seg->area_count; s++)
+-                      release_lv_segment_area(seg, s, seg->area_len);
++                      if (!release_and_discard_lv_segment_area(seg, s, 
seg->area_len))
++                              return_0;
+ 
+               seg->area_count = new_mirrors + 1;
+ 
+--- a/lib/metadata/pv_alloc.h
++++ b/lib/metadata/pv_alloc.h
+@@ -23,6 +23,7 @@
+ int pv_split_segment(struct dm_pool *mem,
+                    struct physical_volume *pv, uint32_t pe,
+                    struct pv_segment **pvseg_allocated);
++int discard_pv_segment(struct pv_segment *peg, uint32_t 
discard_area_reduction);
+ int release_pv_segment(struct pv_segment *peg, uint32_t area_reduction);
+ int check_pv_segments(struct volume_group *vg);
+ void merge_pv_segments(struct pv_segment *peg1, struct pv_segment *peg2);
+--- a/lib/metadata/pv_manip.c
++++ b/lib/metadata/pv_manip.c
+@@ -189,14 +189,13 @@
+       return peg;
+ }
+ 
+-int release_pv_segment(struct pv_segment *peg, uint32_t area_reduction)
++int discard_pv_segment(struct pv_segment *peg, uint32_t 
discard_area_reduction)
+ {
+       uint64_t discard_offset_sectors;
+       uint64_t pe_start = peg->pv->pe_start;
+-      uint64_t discard_area_reduction = area_reduction;
+ 
+       if (!peg->lvseg) {
+-              log_error("release_pv_segment with unallocated segment: "
++              log_error("discard_pv_segment with unallocated segment: "
+                         "%s PE %" PRIu32, pv_dev_name(peg->pv), peg->pe);
+               return 0;
+       }
+@@ -205,26 +204,39 @@
+        * Only issue discards if enabled in lvm.conf and both
+        * the device and kernel (>= 2.6.35) supports discards.
+        */
+-      if (find_config_tree_bool(peg->pv->fmt->cmd,
+-                                "devices/issue_discards", 
DEFAULT_ISSUE_DISCARDS) &&
+-          dev_discard_max_bytes(peg->pv->fmt->cmd->sysfs_dir, peg->pv->dev) &&
+-          dev_discard_granularity(peg->pv->fmt->cmd->sysfs_dir, 
peg->pv->dev)) {
+-              discard_offset_sectors = (peg->pe + peg->lvseg->area_len - 
area_reduction) *
+-                      (uint64_t) peg->pv->vg->extent_size + pe_start;
+-              if (!discard_offset_sectors) {
+-                      /*
+-                       * pe_start=0 and the PV's first extent contains the 
label.
+-                       * Must skip past the first extent.
+-                       */
+-                      discard_offset_sectors = peg->pv->vg->extent_size;
+-                      discard_area_reduction--;
+-              }
+-              log_debug("Discarding %" PRIu64 " extents offset %" PRIu64 " 
sectors on %s.",
+-                        discard_area_reduction, discard_offset_sectors, 
dev_name(peg->pv->dev));
+-              if (discard_area_reduction &&
+-                  !dev_discard_blocks(peg->pv->dev, discard_offset_sectors << 
SECTOR_SHIFT,
+-                                      discard_area_reduction * (uint64_t) 
peg->pv->vg->extent_size * SECTOR_SIZE))
+-                      return_0;
++      if (!find_config_tree_bool(peg->pv->fmt->cmd,
++                                 "devices/issue_discards", 
DEFAULT_ISSUE_DISCARDS) ||
++          !dev_discard_max_bytes(peg->pv->fmt->cmd->sysfs_dir, peg->pv->dev) 
||
++          !dev_discard_granularity(peg->pv->fmt->cmd->sysfs_dir, 
peg->pv->dev))
++              return 1;
++
++      discard_offset_sectors = (peg->pe + peg->lvseg->area_len - 
discard_area_reduction) *
++                               (uint64_t) peg->pv->vg->extent_size + pe_start;
++      if (!discard_offset_sectors) {
++              /*
++               * pe_start=0 and the PV's first extent contains the label.
++               * Must skip past the first extent.
++               */
++              discard_offset_sectors = peg->pv->vg->extent_size;
++              discard_area_reduction--;
++      }
++
++      log_debug("Discarding %" PRIu32 " extents offset %" PRIu64 " sectors on 
%s.",
++                discard_area_reduction, discard_offset_sectors, 
dev_name(peg->pv->dev));
++      if (discard_area_reduction &&
++          !dev_discard_blocks(peg->pv->dev, discard_offset_sectors << 
SECTOR_SHIFT,
++                              discard_area_reduction * (uint64_t) 
peg->pv->vg->extent_size * SECTOR_SIZE))
++              return_0;
++
++      return 1;
++}
++
++int release_pv_segment(struct pv_segment *peg, uint32_t area_reduction)
++{
++      if (!peg->lvseg) {
++              log_error("release_pv_segment with unallocated segment: "
++                        "%s PE %" PRIu32, pv_dev_name(peg->pv), peg->pe);
++              return 0;
+       }
+ 
+       if (peg->lvseg->area_len == area_reduction) {
diff -Nru lvm2-2.02.95/debian/patches/series lvm2-2.02.95/debian/patches/series
--- lvm2-2.02.95/debian/patches/series  2012-05-27 14:27:52.000000000 +0200
+++ lvm2-2.02.95/debian/patches/series  2012-11-18 11:31:32.000000000 +0100
@@ -6,3 +6,4 @@
 implicit-pointer.patch
 dm-event-api.patch
 monitoring-default-off.patch
+lvm-patch-691271.patch


-- 
To UNSUBSCRIBE, email to debian-bugs-rc-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org

Reply via email to