r921 - in lvm2/trunk/debian: . patches
Bastian Blank
waldi at alioth.debian.org
Mon Nov 19 09:59:04 UTC 2012
Author: waldi
Date: Mon Nov 19 09:59:04 2012
New Revision: 921
Log:
* debian/changelog: Update.
* debian/patches: Fix discard.
Added:
lvm2/trunk/debian/patches/upstream-fix-discard-1.patch
lvm2/trunk/debian/patches/upstream-fix-discard-2.patch
lvm2/trunk/debian/patches/upstream-fix-discard-3.patch
Modified:
lvm2/trunk/debian/changelog
lvm2/trunk/debian/patches/series
Modified: lvm2/trunk/debian/changelog
==============================================================================
--- lvm2/trunk/debian/changelog Sun May 27 17:05:43 2012 (r920)
+++ lvm2/trunk/debian/changelog Mon Nov 19 09:59:04 2012 (r921)
@@ -1,3 +1,9 @@
+lvm2 (2.02.95-5) UNRELEASED; urgency=low
+
+ * Don't discard pv areas on pvmove commands. (closes: #691271)
+
+ -- Bastian Blank <waldi at debian.org> Wed, 14 Nov 2012 11:07:20 +0100
+
lvm2 (2.02.95-4) unstable; urgency=low
* Force building with -j1.
Modified: lvm2/trunk/debian/patches/series
==============================================================================
--- lvm2/trunk/debian/patches/series Sun May 27 17:05:43 2012 (r920)
+++ lvm2/trunk/debian/patches/series Mon Nov 19 09:59:04 2012 (r921)
@@ -6,3 +6,6 @@
implicit-pointer.patch
dm-event-api.patch
monitoring-default-off.patch
+upstream-fix-discard-1.patch
+upstream-fix-discard-2.patch
+upstream-fix-discard-3.patch
Added: lvm2/trunk/debian/patches/upstream-fix-discard-1.patch
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ lvm2/trunk/debian/patches/upstream-fix-discard-1.patch Mon Nov 19 09:59:04 2012 (r921)
@@ -0,0 +1,184 @@
+From: Alasdair G Kergon <agk at redhat.com>
+Subject: allocation: allow release_lv_segment_area to fail
+
+Allow release_lv_segment_area to fail as functions it calls can fail.
+
+Origin: upstream, https://lists.fedorahosted.org/pipermail/lvm2-commits/2012-June/000037.html
+Bug: https://bugzilla.redhat.com/show_bug.cgi?id=832392
+Bug-Debian: http://bugs.debian.org/691271
+---
+diff --git a/lib/metadata/lv_alloc.h b/lib/metadata/lv_alloc.h
+index 2ec0030..71ca1ab 100644
+--- a/lib/metadata/lv_alloc.h
++++ b/lib/metadata/lv_alloc.h
+@@ -40,8 +40,8 @@ int set_lv_segment_area_lv(struct lv_segment *seg, uint32_t area_num,
+ 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);
+
+ struct alloc_handle;
+ struct alloc_handle *allocate_extents(struct volume_group *vg,
+diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c
+index 5c715a8..bdcc925 100644
+--- a/lib/metadata/lv_manip.c
++++ b/lib/metadata/lv_manip.c
+@@ -299,24 +299,25 @@ struct lv_segment *alloc_snapshot_seg(struct logical_volume *lv,
+ return seg;
+ }
+
+-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)
+ {
+ 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 (!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 +329,12 @@ void release_lv_segment_area(struct lv_segment *seg, uint32_t s,
+ */
+ 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 +344,10 @@ void release_lv_segment_area(struct lv_segment *seg, uint32_t s,
+ 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 +361,8 @@ void release_lv_segment_area(struct lv_segment *seg, uint32_t s,
+ seg_le(seg, s) = 0;
+ seg_type(seg, s) = AREA_UNASSIGNED;
+ }
++
++ return 1;
+ }
+
+ /*
+@@ -377,9 +380,11 @@ int move_lv_segment_area(struct lv_segment *seg_to, uint32_t area_to,
+ 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 +395,11 @@ int move_lv_segment_area(struct lv_segment *seg_to, uint32_t area_to,
+ 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 +407,8 @@ int move_lv_segment_area(struct lv_segment *seg_to, uint32_t area_to,
+ 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 +501,8 @@ static int _lv_segment_reduce(struct lv_segment *seg, uint32_t reduction)
+ area_reduction = reduction;
+
+ for (s = 0; s < seg->area_count; s++)
+- release_lv_segment_area(seg, s, area_reduction);
++ if (!release_lv_segment_area(seg, s, area_reduction))
++ return_0;
+
+ seg->len -= reduction;
+ seg->area_len -= area_reduction;
+diff --git a/lib/metadata/mirror.c b/lib/metadata/mirror.c
+index 236edea..d943175 100644
+--- a/lib/metadata/mirror.c
++++ b/lib/metadata/mirror.c
+@@ -645,8 +645,8 @@ static int _split_mirror_images(struct logical_volume *lv,
+ 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 @@ static int _remove_mirror_images(struct logical_volume *lv,
+ }
+ 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 @@ int remove_mirrors_from_segments(struct logical_volume *lv,
+ }
+
+ for (s = new_mirrors + 1; s < seg->area_count; s++)
+- release_lv_segment_area(seg, s, seg->area_len);
++ if (!release_lv_segment_area(seg, s, seg->area_len))
++ return_0;
+
+ seg->area_count = new_mirrors + 1;
+
Added: lvm2/trunk/debian/patches/upstream-fix-discard-2.patch
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ lvm2/trunk/debian/patches/upstream-fix-discard-2.patch Mon Nov 19 09:59:04 2012 (r921)
@@ -0,0 +1,102 @@
+From: Alasdair G Kergon <agk at redhat.com>
+Subject: discards: split discard from release_pv_segment
+
+Separate discard_pv_segment out of release_pv_segment
+
+Origin: upstream, https://lists.fedorahosted.org/pipermail/lvm2-commits/2012-June/000038.html
+Bug: https://bugzilla.redhat.com/show_bug.cgi?id=832392
+Bug-Debian: http://bugs.debian.org/691271
+---
+diff --git a/lib/metadata/pv_alloc.h b/lib/metadata/pv_alloc.h
+index d894f31..2318473 100644
+--- a/lib/metadata/pv_alloc.h
++++ b/lib/metadata/pv_alloc.h
+@@ -23,6 +23,7 @@ struct pv_segment *assign_peg_to_lvseg(struct physical_volume *pv, uint32_t pe,
+ 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);
+diff --git a/lib/metadata/pv_manip.c b/lib/metadata/pv_manip.c
+index 9eca9e7..e3fe272 100644
+--- a/lib/metadata/pv_manip.c
++++ b/lib/metadata/pv_manip.c
+@@ -189,14 +189,13 @@ struct pv_segment *assign_peg_to_lvseg(struct physical_volume *pv,
+ 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 @@ int release_pv_segment(struct pv_segment *peg, uint32_t area_reduction)
+ * 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) {
Added: lvm2/trunk/debian/patches/upstream-fix-discard-3.patch
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ lvm2/trunk/debian/patches/upstream-fix-discard-3.patch Mon Nov 19 09:59:04 2012 (r921)
@@ -0,0 +1,93 @@
+From: Alasdair G Kergon <agk at redhat.com>
+Subject: discards: don't discard reconfigured extents
+
+Update release_lv_segment_area not to discard any PV extents,
+as it also gets used when moving extents between LVs.
+Instead, call a new function release_and_discard_lv_segment_area() in
+the two places where data should be discarded - lv_reduce() and
+remove_mirrors_from_segments().
+
+Origin: upstream, https://lists.fedorahosted.org/pipermail/lvm2-commits/2012-June/000039.html
+Bug: https://bugzilla.redhat.com/show_bug.cgi?id=832392
+Bug-Debian: http://bugs.debian.org/691271
+---
+diff --git a/lib/metadata/lv_alloc.h b/lib/metadata/lv_alloc.h
+index 71ca1ab..9f8e0e3 100644
+--- a/lib/metadata/lv_alloc.h
++++ b/lib/metadata/lv_alloc.h
+@@ -42,6 +42,7 @@ int move_lv_segment_area(struct lv_segment *seg_to, uint32_t area_to,
+ struct lv_segment *seg_from, uint32_t area_from);
+ 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,
+diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c
+index bdcc925..a0be887 100644
+--- a/lib/metadata/lv_manip.c
++++ b/lib/metadata/lv_manip.c
+@@ -299,17 +299,22 @@ struct lv_segment *alloc_snapshot_seg(struct logical_volume *lv,
+ return seg;
+ }
+
+-int 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 1;
+
+ if (seg_type(seg, s) == AREA_PV) {
++ 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 1;
+ }
+
+@@ -365,6 +370,16 @@ int release_lv_segment_area(struct lv_segment *seg, uint32_t s,
+ 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);
++}
++
+ /*
+ * Move a segment area from one segment to another
+ */
+@@ -501,7 +516,7 @@ static int _lv_segment_reduce(struct lv_segment *seg, uint32_t reduction)
+ area_reduction = reduction;
+
+ for (s = 0; s < seg->area_count; s++)
+- if (!release_lv_segment_area(seg, s, area_reduction))
++ if (!release_and_discard_lv_segment_area(seg, s, area_reduction))
+ return_0;
+
+ seg->len -= reduction;
+diff --git a/lib/metadata/mirror.c b/lib/metadata/mirror.c
+index d943175..61e4b47 100644
+--- a/lib/metadata/mirror.c
++++ b/lib/metadata/mirror.c
+@@ -1469,7 +1469,7 @@ int remove_mirrors_from_segments(struct logical_volume *lv,
+ }
+
+ for (s = new_mirrors + 1; s < seg->area_count; s++)
+- if (!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;
More information about the pkg-lvm-commits
mailing list