[lvm-devel] LVM2 lib/metadata/lv_manip.c lib/thin/thin.c m ...

zkabelac at sourceware.org zkabelac at sourceware.org
Fri Oct 21 09:55:08 UTC 2011


CVSROOT:	/cvs/lvm2
Module name:	LVM2
Changes by:	zkabelac at sourceware.org	2011-10-21 09:55:07

Modified files:
	lib/metadata   : lv_manip.c 
	lib/thin       : thin.c 
	man            : lvcreate.8.in 
	tools          : lvcreate.c 

Log message:
	Thin pool now support chunk size as well
	
	Use chunksize option to specify data_block_size for thin pool target.
	Drop low_water_mark to zero.

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/metadata/lv_manip.c.diff?cvsroot=lvm2&r1=1.297&r2=1.298
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/thin/thin.c.diff?cvsroot=lvm2&r1=1.22&r2=1.23
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/man/lvcreate.8.in.diff?cvsroot=lvm2&r1=1.24&r2=1.25
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/tools/lvcreate.c.diff?cvsroot=lvm2&r1=1.243&r2=1.244

--- LVM2/lib/metadata/lv_manip.c	2011/10/20 10:35:14	1.297
+++ LVM2/lib/metadata/lv_manip.c	2011/10/21 09:55:07	1.298
@@ -4160,9 +4160,12 @@
 		       seg_is_thin_volume(lp) ? lp->pool : NULL, lp->pvh, lp->alloc))
 		return_NULL;
 
-	if (seg_is_thin_pool(lp) && lp->zero)
-		first_seg(lv)->zero_new_blocks = 1;
-	else if (seg_is_thin_volume(lp)) {
+	if (seg_is_thin_pool(lp)) {
+		first_seg(lv)->zero_new_blocks = lp->zero ? 1 : 0;
+		first_seg(lv)->data_block_size = lp->chunk_size;
+		/* FIXME: use lowwatermark  via lvm.conf global for all thinpools ? */
+		first_seg(lv)->low_water_mark = 0;
+	} else if (seg_is_thin_volume(lp)) {
 		pool_lv = first_seg(lv)->pool_lv;
 
 		if (!(first_seg(lv)->device_id =
@@ -4184,13 +4187,6 @@
 		 */
 	}
 
-	if (seg_is_thin_pool(lp)) {
-		/* FIXME: add lvcreate params - maybe -c/--chunksize?,
-		 * use lowwatermark  via lvm.conf global for all thinpools ?*/
-		first_seg(lv)->data_block_size = 128;
-		first_seg(lv)->low_water_mark = 4096;
-	}
-
 	if (lp->log_count &&
 	    !seg_is_raid(first_seg(lv)) && seg_is_mirrored(first_seg(lv))) {
 		if (!add_mirror_log(cmd, lv, lp->log_count,
@@ -4217,7 +4213,9 @@
 	if (seg_is_thin_pool(lp)) {
 		/* FIXME: skipping in test mode is not going work */
 		if (!activate_lv_excl(cmd, first_seg(lv)->pool_metadata_lv) ||
-		    /* First 4KB of metadata device must be cleared. */
+		    /* Clear 4KB of metadata device for new thin-pool. */
+		    // FIXME: maybe -zero n  should  allow to recreate same thin pool
+		    // and different option should be used for zero_new_blocks
 		    !set_lv(cmd, first_seg(lv)->pool_metadata_lv, UINT64_C(0), 0)) {
 			log_error("Aborting. Failed to wipe pool metadata %s.",
 				  lv->name);
--- LVM2/lib/thin/thin.c	2011/10/20 10:32:29	1.22
+++ LVM2/lib/thin/thin.c	2011/10/21 09:55:07	1.23
@@ -155,7 +155,7 @@
 	outf(f, "pool = \"%s\"", seg_lv(seg, 0)->name);
 	outf(f, "metadata = \"%s\"", seg->pool_metadata_lv->name);
 	outf(f, "transaction_id = %" PRIu64, seg->transaction_id);
-	outf(f, "data_block_size = %d", seg->data_block_size);
+	outf(f, "data_block_size = %u", seg->data_block_size);
 
 	if (seg->low_water_mark)
 		outf(f, "low_water_mark = %" PRIu64, seg->low_water_mark);
--- LVM2/man/lvcreate.8.in	2011/10/21 09:53:16	1.24
+++ LVM2/man/lvcreate.8.in	2011/10/21 09:55:07	1.25
@@ -132,6 +132,8 @@
 Power of 2 chunk size in sector units (512b).
 For snapshot logical volume the value must be between 8 (4KB) and 1024 (512KB)
 and the default value is 8.
+For thin pool logical volume the value must be between 128 (64KB) and
+2097152 (1MB) and the default value is 128.
 .TP
 .BR \-C ", " \-\-contiguous " {" \fIy | \fIn }
 Sets or resets the contiguous allocation policy for
--- LVM2/tools/lvcreate.c	2011/09/27 12:37:07	1.243
+++ LVM2/tools/lvcreate.c	2011/10/21 09:55:07	1.244
@@ -690,14 +690,26 @@
 			log_error("Negative chunk size is invalid");
 			return 0;
 		}
-		lp->chunk_size = arg_uint_value(cmd, chunksize_ARG, 8);
-		if (lp->chunk_size < 8 || lp->chunk_size > 1024 ||
-		    (lp->chunk_size & (lp->chunk_size - 1))) {
-			log_error("Chunk size must be a power of 2 in the "
-				  "range 4K to 512K");
-			return 0;
+		if (lp->snapshot) {
+			lp->chunk_size = arg_uint_value(cmd, chunksize_ARG, 8);
+			if (lp->chunk_size < 8 || lp->chunk_size > 1024 ||
+			    (lp->chunk_size & (lp->chunk_size - 1))) {
+				log_error("Chunk size must be a power of 2 in the "
+					  "range 4K to 512K");
+				return 0;
+			}
+		} else {
+			lp->chunk_size = arg_uint_value(cmd, chunksize_ARG, DM_THIN_MIN_DATA_BLOCK_SIZE);
+			if ((lp->chunk_size < DM_THIN_MIN_DATA_BLOCK_SIZE) ||
+			    (lp->chunk_size > DM_THIN_MAX_DATA_BLOCK_SIZE) ||
+			    (lp->chunk_size & (lp->chunk_size - 1))) {
+				log_error("Chunk size must be a power of 2 in the "
+					  "range %uK to %uK", (DM_THIN_MIN_DATA_BLOCK_SIZE / 2),
+					  (DM_THIN_MIN_DATA_BLOCK_SIZE / 2));
+				return 0;
+			}
 		}
-		log_verbose("Setting chunksize to %d sectors.", lp->chunk_size);
+		log_verbose("Setting chunksize to %u sectors.", lp->chunk_size);
 
 		if (!lp->thin && lp->snapshot && !(lp->segtype = get_segtype_from_string(cmd, "snapshot")))
 			return_0;




More information about the lvm-devel mailing list