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