[lvm-devel] LVM2 ./WHATS_NEW doc/example.conf.in lib/metad ...

snitzer at sourceware.org snitzer at sourceware.org
Wed Apr 13 18:26:40 UTC 2011


CVSROOT:	/cvs/lvm2
Module name:	LVM2
Changes by:	snitzer at sourceware.org	2011-04-13 18:26:39

Modified files:
	.              : WHATS_NEW 
	doc            : example.conf.in 
	lib/metadata   : pv_manip.c 
	man            : lvm.conf.5.in 

Log message:
	Improve the discard documentation.  Also improve discard code in
	pv_manip.c to properly account for case when pe_start=0 and the first
	physical extent is to be released (currently skip the first extent to
	avoid discarding the PV label).

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/WHATS_NEW.diff?cvsroot=lvm2&r1=1.1971&r2=1.1972
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/doc/example.conf.in.diff?cvsroot=lvm2&r1=1.21&r2=1.22
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/metadata/pv_manip.c.diff?cvsroot=lvm2&r1=1.30&r2=1.31
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/man/lvm.conf.5.in.diff?cvsroot=lvm2&r1=1.19&r2=1.20

--- LVM2/WHATS_NEW	2011/04/12 21:59:01	1.1971
+++ LVM2/WHATS_NEW	2011/04/13 18:26:39	1.1972
@@ -1,7 +1,7 @@
 Version 2.02.85 - 
 ===================================
   Add "devices/issue_discards" to lvm.conf.
-  Issue discards on lvremove if enabled and both storage and kernel have support.
+  Issue discards on lvremove, lvreduce, etc if enabled and supported.
   Fix incorrect tests for dm_snprintf() failure.
   Fix some unmatching sign comparation gcc warnings in the code.
   Allow lv_extend() to work on zero length intrinsically layered LVs.
--- LVM2/doc/example.conf.in	2011/04/12 21:59:01	1.21
+++ LVM2/doc/example.conf.in	2011/04/13 18:26:39	1.22
@@ -152,11 +152,15 @@
     # pv_min_size = 2048
     pv_min_size = 512
 
-    # Issue discards to an LV's underlying PV(s) when the LV is removed.
-    # Discards inform the storage that a region is no longer in use.  If set
+    # Issue discards to a logical volumes's underlying physical volume(s) when
+    # the logical volume is no longer using the physical volumes' space (e.g.
+    # lvremove, lvreduce, etc).  Discards inform the storage that a region is
+    # no longer in use.  Storage that supports discards advertise the protocol
+    # specific way discards should be issued by the kernel (TRIM, UNMAP, or
+    # WRITE SAME with UNMAP bit set).  Not all storage will support or benefit
+    # from discards but SSDs and thinly provisioned LUNs generally do.  If set
     # to 1, discards will only be issued if both the storage and kernel provide
-    # support.  Not all storage will support or benefit from discards but SSDs
-    # or thinly provisioned LUNs generally do.
+    # support.
     # 1 enables; 0 disables.
     issue_discards = 0
 }
--- LVM2/lib/metadata/pv_manip.c	2011/04/12 22:04:04	1.30
+++ LVM2/lib/metadata/pv_manip.c	2011/04/13 18:26:39	1.31
@@ -191,9 +191,9 @@
 
 int release_pv_segment(struct pv_segment *peg, uint32_t area_reduction)
 {
-	uint64_t discard_offset;
+	uint64_t discard_offset_sectors;
 	uint64_t pe_start = peg->pv->pe_start;
-	uint32_t discard_area_reduction = area_reduction;
+	uint64_t discard_area_reduction = area_reduction;
 
 	if (!peg->lvseg) {
 		log_error("release_pv_segment with unallocated segment: "
@@ -209,16 +209,20 @@
 				  "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)) {
-		if (!pe_start) {
-			/* skip the first extent */
-			pe_start = peg->pv->vg->extent_size;
+		discard_offset_sectors = (peg->pe + peg->lvseg->area_len - area_reduction) *
+			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--;
 		}
-		discard_offset = peg->pe + peg->lvseg->area_len - area_reduction;
-		discard_offset = (discard_offset * peg->pv->vg->extent_size) + pe_start;
-		log_debug("Discarding %" PRIu32 " extents offset %" PRIu64 " sectors on %s.",
-			 discard_area_reduction, discard_offset, dev_name(peg->pv->dev));
-		if (!dev_discard_blocks(peg->pv->dev, discard_offset << SECTOR_SHIFT,
+		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 * peg->pv->vg->extent_size * SECTOR_SIZE))
 			return_0;
 	}
--- LVM2/man/lvm.conf.5.in	2011/04/12 21:59:02	1.19
+++ LVM2/man/lvm.conf.5.in	2011/04/13 18:26:39	1.20
@@ -181,11 +181,14 @@
 pv_min_size = 2048
 .IP
 \fBissue_discards\fP \(em
-Issue discards to an LV's underlying PV(s) when the LV is removed.  Discards
-inform the storage that a region is no longer in use.  If set to 1, discards will
-only be issued if both the storage and kernel provide support.  Not all storage
-will support or benefit from discards but SSDs or thinly provisioned LUNs
-generally do.
+Issue discards to a logical volumes's underlying physical volume(s) when the
+logical volume is no longer using the physical volumes' space (e.g. lvremove,
+lvreduce, etc).  Discards inform the storage that a region is no longer in use.
+Storage that supports discards advertise the protocol specific way discards
+should be issued by the kernel (TRIM, UNMAP, or WRITE SAME with UNMAP bit set).
+Not all storage will support or benefit from discards but SSDs and thinly
+provisioned LUNs generally do.  If set to 1, discards will only be issued if
+both the storage and kernel provide support.  
 .IP
 .TP
 \fBallocation\fP \(em Space allocation policies




More information about the lvm-devel mailing list