Peter Rajnoha 10289a
 WHATS_NEW                     |  7 +++++++
Peter Rajnoha 10289a
 lib/activate/activate.c       | 14 +++-----------
Peter Rajnoha 10289a
 lib/metadata/pv_manip.c       |  2 +-
Peter Rajnoha 10289a
 lib/metadata/thin_manip.c     | 39 ++++++++++++++++++++++++++++++++++-----
Peter Rajnoha 10289a
 man/Makefile.in               |  3 +++
Peter Rajnoha 10289a
 scripts/clvmd_init_red_hat.in |  2 +-
Peter Rajnoha 10289a
 test/shell/listings.sh        |  5 +++++
Peter Rajnoha 10289a
 test/shell/lvcreate-thin.sh   | 16 ++++++++++++++++
Peter Rajnoha 10289a
 tools/toollib.c               |  6 +++---
Peter Rajnoha 10289a
 12 files changed, 78 insertions(+), 23 deletions(-)
Peter Rajnoha 10289a
Peter Rajnoha 10289a
diff --git a/WHATS_NEW b/WHATS_NEW
Peter Rajnoha 10289a
index 780050d..d90cd94 100644
Peter Rajnoha 10289a
--- a/WHATS_NEW
Peter Rajnoha 10289a
+++ b/WHATS_NEW
Peter Rajnoha 10289a
@@ -1,3 +1,10 @@
Peter Rajnoha 10289a
+Version 2.02.114 - 
Peter Rajnoha 10289a
+=====================================
Peter Rajnoha 10289a
+  Fix regression when parsing /dev/mapper dir (2.02.112).
Peter Rajnoha 10289a
+  Fix missing rounding to 64KB when estimating optimal thin pool chunk size.
Peter Rajnoha 10289a
+  Fix typo in clvmd initscript causing CLVMD_STOP_TIMEOUT variable to be ignored.
Peter Rajnoha 10289a
+  Fix size in pvresize "Resizing to ..." verbose msg to show proper result size.
Peter Rajnoha 10289a
+
Peter Rajnoha 10289a
 Version 2.02.113 - 24th November 2014
Peter Rajnoha 10289a
 =====================================
Peter Rajnoha 10289a
   Add --cachepolicy and --cachesettings options to lvchange.
Peter Rajnoha 10289a
diff --git a/lib/activate/activate.c b/lib/activate/activate.c
Peter Rajnoha 10289a
index 60dba1b..dd0a4f9 100644
Peter Rajnoha 10289a
--- a/lib/activate/activate.c
Peter Rajnoha 10289a
+++ b/lib/activate/activate.c
Peter Rajnoha 10289a
@@ -719,16 +719,12 @@ int lv_info_with_seg_status(struct cmd_context *cmd, const struct logical_volume
Peter Rajnoha 10289a
 			   struct lvinfo *lvinfo, struct lv_seg_status *lv_seg_status,
Peter Rajnoha 10289a
 			   int with_open_count, int with_read_ahead)
Peter Rajnoha 10289a
 {
Peter Rajnoha 10289a
-	int r = 0;
Peter Rajnoha 10289a
-
Peter Rajnoha 10289a
 	if (!activation())
Peter Rajnoha 10289a
 		return 0;
Peter Rajnoha 10289a
 
Peter Rajnoha 10289a
-	if (lv == lv_seg->lv) {
Peter Rajnoha 10289a
-		r = _lv_info(cmd, lv, use_layer, lvinfo, lv_seg, lv_seg_status,
Peter Rajnoha 10289a
-			     with_open_count, with_read_ahead);
Peter Rajnoha 10289a
-		goto out;
Peter Rajnoha 10289a
-	}
Peter Rajnoha 10289a
+	if (lv == lv_seg->lv)
Peter Rajnoha 10289a
+		return _lv_info(cmd, lv, use_layer, lvinfo, lv_seg, lv_seg_status,
Peter Rajnoha 10289a
+				with_open_count, with_read_ahead);
Peter Rajnoha 10289a
 
Peter Rajnoha 10289a
 	/*
Peter Rajnoha 10289a
 	 * If the info is requested for an LV and segment
Peter Rajnoha 10289a
@@ -737,10 +733,6 @@ int lv_info_with_seg_status(struct cmd_context *cmd, const struct logical_volume
Peter Rajnoha 10289a
 	 */
Peter Rajnoha 10289a
 	return _lv_info(cmd, lv, use_layer, lvinfo, NULL, NULL, with_open_count, with_read_ahead) &&
Peter Rajnoha 10289a
 	       _lv_info(cmd, lv_seg->lv, use_layer, NULL, lv_seg, lv_seg_status, 0, 0);
Peter Rajnoha 10289a
-
Peter Rajnoha 10289a
-	r = 1;
Peter Rajnoha 10289a
-out:
Peter Rajnoha 10289a
-	return r;
Peter Rajnoha 10289a
 }
Peter Rajnoha 10289a
 
Peter Rajnoha 10289a
 #define OPEN_COUNT_CHECK_RETRIES 25
Peter Rajnoha 10289a
diff --git a/lib/metadata/pv_manip.c b/lib/metadata/pv_manip.c
Peter Rajnoha 10289a
index 00a7fd5..6499e36 100644
Peter Rajnoha 10289a
--- a/lib/metadata/pv_manip.c
Peter Rajnoha 10289a
+++ b/lib/metadata/pv_manip.c
Peter Rajnoha 10289a
@@ -650,7 +650,7 @@ int pv_resize_single(struct cmd_context *cmd,
Peter Rajnoha 10289a
 	}
Peter Rajnoha 10289a
 
Peter Rajnoha 10289a
 	log_verbose("Resizing volume \"%s\" to %" PRIu64 " sectors.",
Peter Rajnoha 10289a
-		    pv_name, pv_size(pv));
Peter Rajnoha 10289a
+		    pv_name, size);
Peter Rajnoha 10289a
 
Peter Rajnoha 10289a
 	if (!pv_resize(pv, vg, size))
Peter Rajnoha 10289a
 		goto_out;
Peter Rajnoha 10289a
diff --git a/lib/metadata/thin_manip.c b/lib/metadata/thin_manip.c
Peter Rajnoha 10289a
index b4aec73..e617b3c 100644
Peter Rajnoha 10289a
--- a/lib/metadata/thin_manip.c
Peter Rajnoha 10289a
+++ b/lib/metadata/thin_manip.c
Peter Rajnoha 10289a
@@ -394,6 +394,33 @@ int update_pool_lv(struct logical_volume *lv, int activate)
Peter Rajnoha 10289a
 	return ret;
Peter Rajnoha 10289a
 }
Peter Rajnoha 10289a
 
Peter Rajnoha 10289a
+/* Estimate thin pool chunk size from data and metadata size (in sector units) */
Peter Rajnoha 10289a
+static size_t _estimate_chunk_size(uint64_t data_size, uint64_t metadata_size, int attr)
Peter Rajnoha 10289a
+{
Peter Rajnoha 10289a
+	/*
Peter Rajnoha 10289a
+	 * nr_pool_blocks = data_size / metadata_size
Peter Rajnoha 10289a
+	 * chunk_size = nr_pool_blocks * 64b / sector_size
Peter Rajnoha 10289a
+	 */
Peter Rajnoha 10289a
+	size_t chunk_size = data_size / (metadata_size * (SECTOR_SIZE / 64));
Peter Rajnoha 10289a
+
Peter Rajnoha 10289a
+	if (attr & THIN_FEATURE_BLOCK_SIZE) {
Peter Rajnoha 10289a
+		/* Round up to 64KB */
Peter Rajnoha 10289a
+		chunk_size += DM_THIN_MIN_DATA_BLOCK_SIZE - 1;
Peter Rajnoha 10289a
+		chunk_size &= ~(size_t)(DM_THIN_MIN_DATA_BLOCK_SIZE - 1);
Peter Rajnoha 10289a
+	} else {
Peter Rajnoha 10289a
+		/* Round up to nearest power of 2 */
Peter Rajnoha 10289a
+		chunk_size--;
Peter Rajnoha 10289a
+		chunk_size |= chunk_size >> 1;
Peter Rajnoha 10289a
+		chunk_size |= chunk_size >> 2;
Peter Rajnoha 10289a
+		chunk_size |= chunk_size >> 4;
Peter Rajnoha 10289a
+		chunk_size |= chunk_size >> 8;
Peter Rajnoha 10289a
+		chunk_size |= chunk_size >> 16;
Peter Rajnoha 10289a
+		chunk_size++;
Peter Rajnoha 10289a
+	}
Peter Rajnoha 10289a
+
Peter Rajnoha 10289a
+	return chunk_size;
Peter Rajnoha 10289a
+}
Peter Rajnoha 10289a
+
Peter Rajnoha 10289a
 int update_thin_pool_params(const struct segment_type *segtype,
Peter Rajnoha 10289a
 			    struct volume_group *vg,
Peter Rajnoha 10289a
 			    unsigned attr, int passed_args,
Peter Rajnoha 10289a
@@ -465,18 +492,20 @@ int update_thin_pool_params(const struct segment_type *segtype,
Peter Rajnoha 10289a
 				    display_size(cmd, *chunk_size));
Peter Rajnoha 10289a
 		} else if (pool_metadata_size > (DEFAULT_THIN_POOL_MAX_METADATA_SIZE * 2)) {
Peter Rajnoha 10289a
 			/* Suggest bigger chunk size */
Peter Rajnoha 10289a
-			estimate_chunk_size = (uint64_t) pool_data_extents * extent_size /
Peter Rajnoha 10289a
-				(DEFAULT_THIN_POOL_MAX_METADATA_SIZE * 2 * (SECTOR_SIZE / UINT64_C(64)));
Peter Rajnoha 10289a
+			estimate_chunk_size =
Peter Rajnoha 10289a
+				_estimate_chunk_size((uint64_t) pool_data_extents * extent_size,
Peter Rajnoha 10289a
+						     (DEFAULT_THIN_POOL_MAX_METADATA_SIZE * 2), attr);
Peter Rajnoha 10289a
 			log_warn("WARNING: Chunk size is too small for pool, suggested minimum is %s.",
Peter Rajnoha 10289a
-				 display_size(cmd, UINT64_C(1) << (ffs(estimate_chunk_size) + 1)));
Peter Rajnoha 10289a
+				 display_size(cmd, estimate_chunk_size));
Peter Rajnoha 10289a
 		}
Peter Rajnoha 10289a
 
Peter Rajnoha 10289a
 		/* Round up to extent size silently */
Peter Rajnoha 10289a
 		if (pool_metadata_size % extent_size)
Peter Rajnoha 10289a
 			pool_metadata_size += extent_size - pool_metadata_size % extent_size;
Peter Rajnoha 10289a
 	} else {
Peter Rajnoha 10289a
-		estimate_chunk_size = (uint64_t) pool_data_extents * extent_size /
Peter Rajnoha 10289a
-			(pool_metadata_size * (SECTOR_SIZE / UINT64_C(64)));
Peter Rajnoha 10289a
+		estimate_chunk_size =
Peter Rajnoha 10289a
+			_estimate_chunk_size((uint64_t) pool_data_extents * extent_size,
Peter Rajnoha 10289a
+					     pool_metadata_size, attr);
Peter Rajnoha 10289a
 		if (estimate_chunk_size < DM_THIN_MIN_DATA_BLOCK_SIZE)
Peter Rajnoha 10289a
 			estimate_chunk_size = DM_THIN_MIN_DATA_BLOCK_SIZE;
Peter Rajnoha 10289a
 		else if (estimate_chunk_size > DM_THIN_MAX_DATA_BLOCK_SIZE)
Peter Rajnoha 10289a
diff --git a/man/Makefile.in b/man/Makefile.in
Peter Rajnoha 10289a
index 40bf7a2..c42f07a 100644
Peter Rajnoha 10289a
--- a/man/Makefile.in
Peter Rajnoha 10289a
+++ b/man/Makefile.in
Peter Rajnoha 10289a
@@ -92,6 +92,9 @@ man: $(MAN5) $(MAN7) $(MAN8) $(MAN8CLUSTER) $(MAN8SYSTEMD_GENERATORS)
Peter Rajnoha 10289a
 
Peter Rajnoha 10289a
 $(MAN5) $(MAN7) $(MAN8) $(MAN8DM) $(MAN8CLUSTER):	Makefile
Peter Rajnoha 10289a
 
Peter Rajnoha 10289a
+Makefile: Makefile.in
Peter Rajnoha 10289a
+	@:
Peter Rajnoha 10289a
+
Peter Rajnoha 10289a
 %: %.in
Peter Rajnoha 10289a
 	@case "$@" in \
Peter Rajnoha 10289a
 	  */*) ;; \
Peter Rajnoha 10289a
diff --git a/scripts/clvmd_init_red_hat.in b/scripts/clvmd_init_red_hat.in
Peter Rajnoha 10289a
index 86dea4c..8c46c06 100644
Peter Rajnoha 10289a
--- a/scripts/clvmd_init_red_hat.in
Peter Rajnoha 10289a
+++ b/scripts/clvmd_init_red_hat.in
Peter Rajnoha 10289a
@@ -38,7 +38,7 @@ CLVMDOPTS="-T30"
Peter Rajnoha 10289a
 # allow up to $CLVMD_STOP_TIMEOUT seconds to clvmd to complete exit operations
Peter Rajnoha 10289a
 # default to 10 seconds
Peter Rajnoha 10289a
 
Peter Rajnoha 10289a
-[ -z $CLMVD_STOP_TIMEOUT ] && CLVMD_STOP_TIMEOUT=10
Peter Rajnoha 10289a
+[ -z $CLVMD_STOP_TIMEOUT ] && CLVMD_STOP_TIMEOUT=10
Peter Rajnoha 10289a
 
Peter Rajnoha 10289a
 LOCK_FILE="/var/lock/subsys/$DAEMON"
Peter Rajnoha 10289a
 
Peter Rajnoha 10289a
diff --git a/test/shell/listings.sh b/test/shell/listings.sh
Peter Rajnoha 10289a
index fbd4af7..fcf6308 100644
Peter Rajnoha 10289a
--- a/test/shell/listings.sh
Peter Rajnoha 10289a
+++ b/test/shell/listings.sh
Peter Rajnoha 10289a
@@ -68,6 +68,11 @@ test $(lvs --noheadings $vg | wc -l) -eq 2
Peter Rajnoha 10289a
 test $(lvs -a --noheadings $vg | wc -l) -eq 6
Peter Rajnoha 10289a
 dmsetup ls | grep "$PREFIX" | grep -v "LVMTEST.*pv."
Peter Rajnoha 10289a
 
Peter Rajnoha 10289a
+# Check we parse /dev/mapper/vg-lv
Peter Rajnoha 10289a
+lvdisplay "$DM_DEV_DIR/mapper/$vg-$lv3"
Peter Rajnoha 10289a
+# Check we parse /dev/vg/lv
Peter Rajnoha 10289a
+lvdisplay "$DM_DEV_DIR/$vg/$lv3"
Peter Rajnoha 10289a
+
Peter Rajnoha 10289a
 lvcreate -l2 -s $vg/$lv3
Peter Rajnoha 10289a
 lvcreate -l1 -s -n inval $vg/$lv3
Peter Rajnoha 10289a
 lvcreate -l4 -I4 -i2 -n stripe $vg
Peter Rajnoha 10289a
diff --git a/test/shell/lvcreate-thin.sh b/test/shell/lvcreate-thin.sh
Peter Rajnoha 10289a
index 0433ac8..2884d53 100644
Peter Rajnoha 10289a
--- a/test/shell/lvcreate-thin.sh
Peter Rajnoha 10289a
+++ b/test/shell/lvcreate-thin.sh
Peter Rajnoha 10289a
@@ -261,4 +261,20 @@ lvcreate -L10G --chunksize 256 -T $vg/pool1
Peter Rajnoha 10289a
 lvcreate -L60G --chunksize 1024 -T $vg/pool2
Peter Rajnoha 10289a
 check lv_field $vg/pool1_tmeta size "2.50m"
Peter Rajnoha 10289a
 check lv_field $vg/pool2_tmeta size "3.75m"
Peter Rajnoha 10289a
+lvremove -ff $vg
Peter Rajnoha 10289a
+
Peter Rajnoha 10289a
+# Block size of multiple 64KB needs >= 1.4
Peter Rajnoha 10289a
+if aux have_thin 1 4 0 ; then
Peter Rajnoha 10289a
+# Test chunk size is rounded to 64KB boundary
Peter Rajnoha 10289a
+lvcreate -L10G --poolmetadatasize 4M -T $vg/pool
Peter Rajnoha 10289a
+check lv_field $vg/pool chunk_size "192.00k"
Peter Rajnoha 10289a
+fi
Peter Rajnoha 10289a
+# Old thinpool target required rounding to power of 2
Peter Rajnoha 10289a
+aux lvmconf "global/thin_disabled_features = [ \"block_size\" ]"
Peter Rajnoha 10289a
+lvcreate -L10G --poolmetadatasize 4M -T $vg/pool_old
Peter Rajnoha 10289a
+check lv_field $vg/pool_old chunk_size "256.00k"
Peter Rajnoha 10289a
+lvremove -ff $vg
Peter Rajnoha 10289a
+# reset
Peter Rajnoha 10289a
+#aux lvmconf "global/thin_disabled_features = []"
Peter Rajnoha 10289a
+
Peter Rajnoha 10289a
 vgremove -ff $vg
Peter Rajnoha 10289a
diff --git a/tools/toollib.c b/tools/toollib.c
Peter Rajnoha 10289a
index ddf2dcf..6d409a9 100644
Peter Rajnoha 10289a
--- a/tools/toollib.c
Peter Rajnoha 10289a
+++ b/tools/toollib.c
Peter Rajnoha 10289a
@@ -130,8 +130,8 @@ const char *skip_dev_dir(struct cmd_context *cmd, const char *vg_name,
Peter Rajnoha 10289a
 			vg_name++;
Peter Rajnoha 10289a
 
Peter Rajnoha 10289a
 		/* Reformat string if /dev/mapper found */
Peter Rajnoha 10289a
-		if (!strncmp(vg_name, dmdir, dmdir_len) && vg_name[dmdir_len + 1] == '/') {
Peter Rajnoha 10289a
-			vg_name += devdir_len + 1;
Peter Rajnoha 10289a
+		if (!strncmp(vg_name, dmdir, dmdir_len) && vg_name[dmdir_len] == '/') {
Peter Rajnoha 10289a
+			vg_name += dmdir_len + 1;
Peter Rajnoha 10289a
 			while (*vg_name == '/')
Peter Rajnoha 10289a
 				vg_name++;
Peter Rajnoha 10289a
 
Peter Rajnoha 10289a
@@ -1175,7 +1175,7 @@ struct dm_config_tree *get_cachepolicy_params(struct cmd_context *cmd)
Peter Rajnoha 10289a
 	ok = 1;
Peter Rajnoha 10289a
 
Peter Rajnoha 10289a
 out:
Peter Rajnoha 10289a
-	if (!ok) {
Peter Rajnoha 10289a
+	if (!ok && result) {
Peter Rajnoha 10289a
 		dm_config_destroy(result);
Peter Rajnoha 10289a
 		result = NULL;
Peter Rajnoha 10289a
 	}