[lvm-devel] master - config: refer to config nodes using assigned IDs

Peter Rajnoha prajnoha at fedoraproject.org
Wed Mar 6 11:15:26 UTC 2013


Gitweb:        http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=386886f71c3da0945f47edf1a7063a04ba9b56d1
Commit:        386886f71c3da0945f47edf1a7063a04ba9b56d1
Parent:        a3d891a29042e51a0f43ed02273a6dce194d6569
Author:        Peter Rajnoha <prajnoha at redhat.com>
AuthorDate:    Tue Mar 5 17:00:43 2013 +0100
Committer:     Peter Rajnoha <prajnoha at redhat.com>
CommitterDate: Wed Mar 6 10:14:33 2013 +0100

config: refer to config nodes using assigned IDs

For example, the old call and reference:

  find_config_tree_str(cmd, "devices/dir", DEFAULT_DEV_DIR)

...now becomes:

  find_config_tree_str(cmd, devices_dir_CFG)

So we're referring to the named configuration ID instead
of passing the configuration path and the default value
is taken from central config definition in config_settings.h
automatically.
---
 daemons/clvmd/lvm-functions.c  |    7 +-
 lib/activate/activate.c        |   18 +++--
 lib/activate/dev_manager.c     |    6 +-
 lib/commands/toolcontext.c     |  175 ++++++++++++++++------------------------
 lib/commands/toolcontext.h     |    1 +
 lib/config/config.c            |   71 ++++++++++++-----
 lib/config/config.h            |   21 ++---
 lib/config/defaults.h          |    1 -
 lib/device/dev-cache.c         |    2 +-
 lib/display/display.c          |    3 +-
 lib/format_text/format-text.c  |    8 +-
 lib/locking/external_locking.c |    4 +-
 lib/locking/file_locking.c     |    6 +-
 lib/locking/locking.c          |   13 +--
 lib/metadata/lv_manip.c        |   17 ++---
 lib/metadata/metadata.c        |   15 +---
 lib/metadata/mirror.c          |   15 ++--
 lib/metadata/pv_manip.c        |    3 +-
 lib/metadata/thin_manip.c      |    4 +-
 lib/mirror/mirrored.c          |    3 +-
 lib/misc/sharedlib.c           |    2 +-
 lib/mm/memlock.c               |   15 +---
 lib/raid/raid.c                |    3 +-
 lib/snapshot/snapshot.c        |    3 +-
 lib/thin/thin.c                |    5 +-
 liblvm/lvm_base.c              |    4 +-
 tools/lvconvert.c              |   13 +--
 tools/lvcreate.c               |    8 +-
 tools/lvm.c                    |    3 +-
 tools/lvmcmdline.c             |    3 +-
 tools/lvresize.c               |   16 +---
 tools/polldaemon.c             |    6 +-
 tools/pvcreate.c               |    4 +-
 tools/pvscan.c                 |    4 +-
 tools/reporter.c               |   76 +++++------------
 tools/toollib.c                |   46 +++-------
 tools/vgconvert.c              |    8 +--
 37 files changed, 246 insertions(+), 366 deletions(-)

diff --git a/daemons/clvmd/lvm-functions.c b/daemons/clvmd/lvm-functions.c
index 6793752..416d4f0 100644
--- a/daemons/clvmd/lvm-functions.c
+++ b/daemons/clvmd/lvm-functions.c
@@ -808,7 +808,7 @@ static void check_config(void)
 {
 	int locking_type;
 
-	locking_type = find_config_tree_int(cmd, "global/locking_type", 1);
+	locking_type = find_config_tree_int(cmd, global_locking_type_CFG);
 
 	if (locking_type == 3) /* compiled-in cluster support */
 		return;
@@ -816,9 +816,8 @@ static void check_config(void)
 	if (locking_type == 2) { /* External library, check name */
 		const char *libname;
 
-		libname = find_config_tree_str(cmd, "global/locking_library",
-					  "");
-		if (strstr(libname, "liblvm2clusterlock.so"))
+		libname = find_config_tree_str(cmd, global_locking_library_CFG);
+		if (libname && strstr(libname, "liblvm2clusterlock.so"))
 			return;
 
 		log_error("Incorrect LVM locking library specified in lvm.conf, cluster operations may not work.");
diff --git a/lib/activate/activate.c b/lib/activate/activate.c
index f19dff7..26d357b 100644
--- a/lib/activate/activate.c
+++ b/lib/activate/activate.c
@@ -333,12 +333,14 @@ int activation(void)
 }
 
 static int _lv_passes_volumes_filter(struct cmd_context *cmd, struct logical_volume *lv,
-				     const struct dm_config_node *cn, const char *config_path)
+				     const struct dm_config_node *cn, const int cfg_id)
 {
 	const struct dm_config_value *cv;
 	const char *str;
+	static char config_path[PATH_MAX];
 	static char path[PATH_MAX];
 
+	config_def_get_path(config_path, sizeof(config_path), cfg_id);
 	log_verbose("%s configuration setting defined: "
 		    "Checking the list to match %s/%s",
 		    config_path, lv->vg->name, lv->name);
@@ -413,7 +415,7 @@ static int _passes_activation_filter(struct cmd_context *cmd,
 {
 	const struct dm_config_node *cn;
 
-	if (!(cn = find_config_tree_node(cmd, "activation/volume_list"))) {
+	if (!(cn = find_config_tree_node(cmd, activation_volume_list_CFG))) {
 		log_verbose("activation/volume_list configuration setting "
 			    "not defined: Checking only host tags for %s/%s",
 			    lv->vg->name, lv->name);
@@ -434,7 +436,7 @@ static int _passes_activation_filter(struct cmd_context *cmd,
 		return 0;
 	}
 
-	return _lv_passes_volumes_filter(cmd, lv, cn, "activation/volume_list");
+	return _lv_passes_volumes_filter(cmd, lv, cn, activation_volume_list_CFG);
 }
 
 static int _passes_readonly_filter(struct cmd_context *cmd,
@@ -442,10 +444,10 @@ static int _passes_readonly_filter(struct cmd_context *cmd,
 {
 	const struct dm_config_node *cn;
 
-	if (!(cn = find_config_tree_node(cmd, "activation/read_only_volume_list")))
+	if (!(cn = find_config_tree_node(cmd, activation_read_only_volume_list_CFG)))
 		return 0;
 
-	return _lv_passes_volumes_filter(cmd, lv, cn, "activation/read_only_volume_list");
+	return _lv_passes_volumes_filter(cmd, lv, cn, activation_read_only_volume_list_CFG);
 }
 
 
@@ -453,13 +455,13 @@ int lv_passes_auto_activation_filter(struct cmd_context *cmd, struct logical_vol
 {
 	const struct dm_config_node *cn;
 
-	if (!(cn = find_config_tree_node(cmd, "activation/auto_activation_volume_list"))) {
+	if (!(cn = find_config_tree_node(cmd, activation_auto_activation_volume_list_CFG))) {
 		log_verbose("activation/auto_activation_volume_list configuration setting "
 			    "not defined: All logical volumes will be auto-activated.");
 		return 1;
 	}
 
-	return _lv_passes_volumes_filter(cmd, lv, cn, "activation/auto_activation_volume_list");
+	return _lv_passes_volumes_filter(cmd, lv, cn, activation_auto_activation_volume_list_CFG);
 }
 
 int library_version(char *version, size_t size)
@@ -1152,7 +1154,7 @@ static struct dm_event_handler *_create_dm_event_handler(struct cmd_context *cmd
 	if (!(dmevh = dm_event_handler_create()))
 		return_NULL;
 
-	if (dm_event_handler_set_dmeventd_path(dmevh, find_config_tree_str(cmd, "dmeventd/executable", NULL)))
+	if (dm_event_handler_set_dmeventd_path(dmevh, find_config_tree_str(cmd, dmeventd_executable_CFG)))
 		goto_bad;
 
 	if (dm_event_handler_set_dso(dmevh, dso))
diff --git a/lib/activate/dev_manager.c b/lib/activate/dev_manager.c
index bffa8a5..8aa49fc 100644
--- a/lib/activate/dev_manager.c
+++ b/lib/activate/dev_manager.c
@@ -1450,9 +1450,7 @@ static int _thin_pool_callback(struct dm_tree_node *node,
 	const struct dm_config_node *cn;
 	const struct dm_config_value *cv;
 	const char *thin_check =
-		find_config_tree_str_allow_empty(data->pool_lv->vg->cmd,
-						 "global/thin_check_executable",
-						 THIN_CHECK_CMD);
+		find_config_tree_str_allow_empty(data->pool_lv->vg->cmd, global_thin_check_executable_CFG);
 	const struct logical_volume *mlv = first_seg(data->pool_lv)->metadata_lv;
 	size_t len = strlen(dmdir) + 2 * (strlen(mlv->vg->name) + strlen(mlv->name)) + 3;
 	char meta_path[len];
@@ -1470,7 +1468,7 @@ static int _thin_pool_callback(struct dm_tree_node *node,
 		return 0;
 	}
 
-	if ((cn = find_config_tree_node(mlv->vg->cmd, "global/thin_check_options"))) {
+	if ((cn = find_config_tree_node(mlv->vg->cmd, global_thin_check_options_CFG))) {
 		for (cv = cn->v; cv && args < 16; cv = cv->next) {
 			if (cv->type != DM_CFG_STRING) {
 				log_error("Invalid string in config file: "
diff --git a/lib/commands/toolcontext.c b/lib/commands/toolcontext.c
index d5dd430..1cee204 100644
--- a/lib/commands/toolcontext.c
+++ b/lib/commands/toolcontext.c
@@ -128,7 +128,7 @@ static int _parse_debug_classes(struct cmd_context *cmd)
 	const struct dm_config_value *cv;
 	int debug_classes = 0;
 
-	if (!(cn = find_config_tree_node(cmd, "log/debug_classes")))
+	if (!(cn = find_config_tree_node(cmd, log_debug_classes_CFG)))
 		return DEFAULT_LOGGED_DEBUG_CLASSES;
 
 	for (cv = cn->v; cv; cv = cv->next) {
@@ -173,8 +173,7 @@ static void _init_logging(struct cmd_context *cmd)
 	char timebuf[26];
 
 	/* Syslog */
-	cmd->default_settings.syslog =
-	    find_config_tree_int(cmd, "log/syslog", DEFAULT_SYSLOG);
+	cmd->default_settings.syslog = find_config_tree_bool(cmd, log_syslog_CFG);
 	if (cmd->default_settings.syslog != 1)
 		fin_syslog();
 
@@ -182,8 +181,7 @@ static void _init_logging(struct cmd_context *cmd)
 		init_syslog(cmd->default_settings.syslog);
 
 	/* Debug level for log file output */
-	cmd->default_settings.debug =
-	    find_config_tree_int(cmd, "log/level", DEFAULT_LOGLEVEL);
+	cmd->default_settings.debug = find_config_tree_int(cmd, log_level_CFG);
 	init_debug(cmd->default_settings.debug);
 
 	/*
@@ -192,40 +190,33 @@ static void _init_logging(struct cmd_context *cmd)
 	 * Once set to 1, there is no facility to change it back to 0.
 	 */
 	cmd->default_settings.silent = silent_mode() ? :
-	    find_config_tree_int(cmd, "log/silent", DEFAULT_SILENT);
+	    find_config_tree_bool(cmd, log_silent_CFG);
 	init_silent(cmd->default_settings.silent);
 
 	/* Verbose level for tty output */
-	cmd->default_settings.verbose =
-	    find_config_tree_int(cmd, "log/verbose", DEFAULT_VERBOSE);
+	cmd->default_settings.verbose = find_config_tree_bool(cmd, log_verbose_CFG);
 	init_verbose(cmd->default_settings.verbose + VERBOSE_BASE_LEVEL);
 
 	/* Log message formatting */
-	init_indent(find_config_tree_int(cmd, "log/indent",
-					 DEFAULT_INDENT));
-	init_abort_on_internal_errors(find_config_tree_int(cmd, "global/abort_on_internal_errors",
-							   DEFAULT_ABORT_ON_INTERNAL_ERRORS));
-
-	cmd->default_settings.msg_prefix =
-		find_config_tree_str_allow_empty(cmd, "log/prefix", DEFAULT_MSG_PREFIX);
+	init_indent(find_config_tree_bool(cmd, log_indent_CFG));
+	init_abort_on_internal_errors(find_config_tree_bool(cmd, global_abort_on_internal_errors_CFG));
 
+	cmd->default_settings.msg_prefix = find_config_tree_str_allow_empty(cmd, log_prefix_CFG);
 	init_msg_prefix(cmd->default_settings.msg_prefix);
 
-	cmd->default_settings.cmd_name = find_config_tree_int(cmd,
-							 "log/command_names",
-							 DEFAULT_CMD_NAME);
+	cmd->default_settings.cmd_name = find_config_tree_bool(cmd, log_command_names_CFG);
 	init_cmd_name(cmd->default_settings.cmd_name);
 
 	/* Test mode */
 	cmd->default_settings.test =
-	    find_config_tree_int(cmd, "global/test", 0);
+	    find_config_tree_bool(cmd, global_test_CFG);
 	init_test(cmd->default_settings.test);
 
 	/* Settings for logging to file */
-	if (find_config_tree_int(cmd, "log/overwrite", DEFAULT_OVERWRITE))
+	if (find_config_tree_bool(cmd, log_overwrite_CFG))
 		append = 0;
 
-	log_file = find_config_tree_str(cmd, "log/file", 0);
+	log_file = find_config_tree_str(cmd, log_file_CFG);
 
 	if (log_file) {
 		release_log_memory();
@@ -233,12 +224,11 @@ static void _init_logging(struct cmd_context *cmd)
 		init_log_file(log_file, append);
 	}
 
-	log_file = find_config_tree_str(cmd, "log/activate_file", 0);
+	log_file = find_config_tree_str(cmd, log_activate_file_CFG);
 	if (log_file)
 		init_log_direct(log_file, append);
 
-	init_log_while_suspended(find_config_tree_int(cmd,
-						 "log/activation", 0));
+	init_log_while_suspended(find_config_tree_bool(cmd, log_activation_CFG));
 
 	cmd->default_settings.debug_classes = _parse_debug_classes(cmd);
 	log_debug("Setting log debug classes to %d", cmd->default_settings.debug_classes);
@@ -301,9 +291,7 @@ static int _process_config(struct cmd_context *cmd)
 	int udev_disabled = 0;
 
 	/* umask */
-	cmd->default_settings.umask = find_config_tree_int(cmd,
-						      "global/umask",
-						      DEFAULT_UMASK);
+	cmd->default_settings.umask = find_config_tree_int(cmd, global_umask_CFG);
 
 	if ((old_umask = umask((mode_t) cmd->default_settings.umask)) !=
 	    (mode_t) cmd->default_settings.umask)
@@ -312,8 +300,7 @@ static int _process_config(struct cmd_context *cmd)
 
 	/* dev dir */
 	if (dm_snprintf(cmd->dev_dir, sizeof(cmd->dev_dir), "%s/",
-			 find_config_tree_str(cmd, "devices/dir",
-					 DEFAULT_DEV_DIR)) < 0) {
+			 find_config_tree_str(cmd, devices_dir_CFG)) < 0) {
 		log_error("Device directory given in config file too long");
 		return 0;
 	}
@@ -326,8 +313,7 @@ static int _process_config(struct cmd_context *cmd)
 
 	/* proc dir */
 	if (dm_snprintf(cmd->proc_dir, sizeof(cmd->proc_dir), "%s",
-			 find_config_tree_str(cmd, "global/proc",
-					 DEFAULT_PROC_DIR)) < 0) {
+			 find_config_tree_str(cmd, global_proc_CFG)) < 0) {
 		log_error("Device directory given in config file too long");
 		return 0;
 	}
@@ -344,25 +330,19 @@ static int _process_config(struct cmd_context *cmd)
 	dm_set_sysfs_dir(cmd->sysfs_dir);
 
 	/* activation? */
-	cmd->default_settings.activation = find_config_tree_int(cmd,
-							   "global/activation",
-							   DEFAULT_ACTIVATION);
+	cmd->default_settings.activation = find_config_tree_bool(cmd, global_activation_CFG);
 	set_activation(cmd->default_settings.activation);
 
-	cmd->default_settings.suffix = find_config_tree_int(cmd,
-						       "global/suffix",
-						       DEFAULT_SUFFIX);
+	cmd->default_settings.suffix = find_config_tree_bool(cmd, global_suffix_CFG);
 
 	if (!(cmd->default_settings.unit_factor =
-	      units_to_bytes(find_config_tree_str(cmd,
-					     "global/units",
-					     DEFAULT_UNITS),
+	      units_to_bytes(find_config_tree_str(cmd, global_units_CFG),
 			     &cmd->default_settings.unit_type))) {
 		log_error("Invalid units specification");
 		return 0;
 	}
 
-	read_ahead = find_config_tree_str(cmd, "activation/readahead", DEFAULT_READ_AHEAD);
+	read_ahead = find_config_tree_str(cmd, activation_readahead_CFG);
 	if (!strcasecmp(read_ahead, "auto"))
 		cmd->default_settings.read_ahead = DM_READ_AHEAD_AUTO;
 	else if (!strcasecmp(read_ahead, "none"))
@@ -382,16 +362,14 @@ static int _process_config(struct cmd_context *cmd)
 	udev_disabled = _check_disable_udev("manage logical volume symlinks in device directory");
 
 	cmd->default_settings.udev_rules = udev_disabled ? 0 :
-		find_config_tree_int(cmd, "activation/udev_rules", DEFAULT_UDEV_RULES);
+		find_config_tree_bool(cmd, activation_udev_rules_CFG);
 
 	cmd->default_settings.udev_sync = udev_disabled ? 0 :
-		find_config_tree_int(cmd, "activation/udev_sync", DEFAULT_UDEV_SYNC);
+		find_config_tree_bool(cmd, activation_udev_sync_CFG);
 
-	init_retry_deactivation(find_config_tree_int(cmd, "activation/retry_deactivation",
-							DEFAULT_RETRY_DEACTIVATION));
+	init_retry_deactivation(find_config_tree_bool(cmd, activation_retry_deactivation_CFG));
 
-	init_activation_checks(find_config_tree_int(cmd, "activation/checks",
-						      DEFAULT_ACTIVATION_CHECKS));
+	init_activation_checks(find_config_tree_bool(cmd, activation_checks_CFG));
 
 #ifdef UDEV_SYNC_SUPPORT
 	/*
@@ -400,7 +378,7 @@ static int _process_config(struct cmd_context *cmd)
 	 * variable or udev rules are switched off.
 	 */
 	cmd->default_settings.udev_fallback = !cmd->default_settings.udev_rules || udev_disabled ? 1 :
-		find_config_tree_int(cmd, "activation/verify_udev_operations", DEFAULT_VERIFY_UDEV_OPERATIONS);
+		find_config_tree_bool(cmd, activation_verify_udev_operations_CFG);
 
 	/* Do not rely fully on udev if the udev support is known to be incomplete. */
 	if (!cmd->default_settings.udev_fallback && !_dm_driver_has_stable_udev_support()) {
@@ -414,13 +392,9 @@ static int _process_config(struct cmd_context *cmd)
 	cmd->default_settings.udev_fallback = 1;
 #endif
 
-	cmd->use_linear_target = find_config_tree_int(cmd,
-						      "activation/use_linear_target",
-						       DEFAULT_USE_LINEAR_TARGET);
+	cmd->use_linear_target = find_config_tree_bool(cmd, activation_use_linear_target_CFG);
 
-	cmd->stripe_filler = find_config_tree_str(cmd,
-						  "activation/missing_stripe_filler",
-						  DEFAULT_STRIPE_FILLER);
+	cmd->stripe_filler = find_config_tree_str(cmd, activation_missing_stripe_filler_CFG);
 
 	/* FIXME Missing error code checks from the stats, not log_warn?, notify if setting overridden, delay message/check till it is actually used (eg consider if lvm shell - file could appear later after this check)? */
 	if (!strcmp(cmd->stripe_filler, "/dev/ioerror") &&
@@ -442,19 +416,16 @@ static int _process_config(struct cmd_context *cmd)
 		}
 	}
 
-	cmd->si_unit_consistency = find_config_tree_int(cmd,
-						  "global/si_unit_consistency",
-						  DEFAULT_SI_UNIT_CONSISTENCY);
+	cmd->si_unit_consistency = find_config_tree_bool(cmd, global_si_unit_consistency_CFG);
 
-	if ((cn = find_config_tree_node(cmd, "activation/mlock_filter")))
+	if ((cn = find_config_tree_node(cmd, activation_mlock_filter_CFG)))
 		for (cv = cn->v; cv; cv = cv->next) 
 			if ((cv->type != DM_CFG_STRING) || !cv->v.str[0]) 
 				log_error("Ignoring invalid activation/mlock_filter entry in config file");
 
-	cmd->metadata_read_only = find_config_tree_int(cmd, "global/metadata_read_only",
-						       DEFAULT_METADATA_READ_ONLY);
+	cmd->metadata_read_only = find_config_tree_bool(cmd, global_metadata_read_only_CFG);
 
-	pv_min_kb = find_config_tree_int64(cmd, "devices/pv_min_size", DEFAULT_PV_MIN_SIZE_KB);
+	pv_min_kb = find_config_tree_int64(cmd, devices_pv_min_size_CFG);
 	if (pv_min_kb < PV_MIN_SIZE_KB) {
 		log_warn("Ignoring too small pv_min_size %" PRId64 "KB, using default %dKB.",
 			 pv_min_kb, PV_MIN_SIZE_KB);
@@ -464,8 +435,7 @@ static int _process_config(struct cmd_context *cmd)
 	init_pv_min_size((uint64_t)pv_min_kb * (1024 >> SECTOR_SHIFT));
 
 	init_detect_internal_vg_cache_corruption
-		(find_config_tree_int(cmd, "global/detect_internal_vg_cache_corruption",
-				      DEFAULT_DETECT_INTERNAL_VG_CACHE_CORRUPTION));
+		(find_config_tree_bool(cmd, global_detect_internal_vg_cache_corruption_CFG));
 
 	lvmetad_disconnect();
 
@@ -478,16 +448,16 @@ static int _process_config(struct cmd_context *cmd)
 						      DEFAULT_RUN_DIR "/lvmetad.socket");
 	*/
 	lvmetad_set_socket(lvmetad_socket);
-	cn = find_config_tree_node(cmd, "devices/global_filter");
+	cn = find_config_tree_node(cmd, devices_global_filter_CFG);
 	lvmetad_set_token(cn ? cn->v : NULL);
 
-	if (find_config_tree_int(cmd, "global/locking_type", 1) == 3 &&
-	    find_config_tree_int(cmd, "global/use_lvmetad", 0)) {
+	if (find_config_tree_int(cmd, global_locking_type_CFG) == 3 &&
+	    find_config_tree_bool(cmd, global_use_lvmetad_CFG)) {
 		log_warn("WARNING: configuration setting use_lvmetad overriden to 0 due to locking_type 3. "
 			 "Clustered environment not supported by lvmetad yet.");
 		lvmetad_set_active(0);
 	} else
-		lvmetad_set_active(find_config_tree_int(cmd, "global/use_lvmetad", 0));
+		lvmetad_set_active(find_config_tree_bool(cmd, global_use_lvmetad_CFG));
 
 	lvmetad_init(cmd);
 
@@ -548,12 +518,11 @@ static int _init_tags(struct cmd_context *cmd, struct dm_config_tree *cft)
 	const char *tag;
 	int passes;
 
-	if (!(tn = dm_config_find_node(cft->root, "tags")) || !tn->child)
+	if (!(tn = find_config_tree_node(cmd, tags_CFG_SECTION)) || !tn->child)
 		return 1;
 
 	/* NB hosttags 0 when already 1 intentionally does not delete the tag */
-	if (!cmd->hosttags && dm_config_find_int(cft->root, "tags/hosttags",
-					      DEFAULT_HOSTTAGS)) {
+	if (!cmd->hosttags && find_config_tree_bool(cmd, tags_hosttags_CFG)) {
 		/* FIXME Strip out invalid chars: only A-Za-z0-9_+.- */
 		if (!_set_tag(cmd, cmd->hostname))
 			return_0;
@@ -754,8 +723,7 @@ static int _init_dev_cache(struct cmd_context *cmd)
 	int device_list_from_udev;
 
 	init_dev_disable_after_error_count(
-		find_config_tree_int(cmd, "devices/disable_after_error_count",
-				     DEFAULT_DISABLE_AFTER_ERROR_COUNT));
+		find_config_tree_int(cmd, devices_disable_after_error_count_CFG));
 
 	if (!dev_cache_init(cmd))
 		return_0;
@@ -769,12 +737,11 @@ static int _init_dev_cache(struct cmd_context *cmd)
 		device_list_from_udev = 0;
 	else
 		device_list_from_udev = udev_is_running() ?
-			find_config_tree_bool(cmd, "devices/obtain_device_list_from_udev",
-					      DEFAULT_OBTAIN_DEVICE_LIST_FROM_UDEV) : 0;
+			find_config_tree_bool(cmd, devices_obtain_device_list_from_udev_CFG) : 0;
 
 	init_obtain_device_list_from_udev(device_list_from_udev);
 
-	if (!(cn = find_config_tree_node(cmd, "devices/scan"))) {
+	if (!(cn = find_config_tree_node(cmd, devices_scan_CFG))) {
 		if (!dev_cache_add_dir("/dev")) {
 			log_error("Failed to add /dev to internal "
 				  "device cache");
@@ -817,7 +784,7 @@ static int _init_dev_cache(struct cmd_context *cmd)
 		}
 	}
 
-	if (!(cn = find_config_tree_node(cmd, "devices/loopfiles")))
+	if (!(cn = find_config_tree_node(cmd, devices_loopfiles_CFG)))
 		return 1;
 
 	for (cv = cn->v; cv; cv = cv->next) {
@@ -858,14 +825,13 @@ static struct dev_filter *_init_filter_components(struct cmd_context *cmd)
 	 * Listed first because it's very efficient at eliminating
 	 * unavailable devices.
 	 */
-	if (find_config_tree_bool(cmd, "devices/sysfs_scan",
-			     DEFAULT_SYSFS_SCAN)) {
+	if (find_config_tree_bool(cmd, devices_sysfs_scan_CFG)) {
 		if ((filters[nr_filt] = sysfs_filter_create(cmd->sysfs_dir)))
 			nr_filt++;
 	}
 
 	/* regex filter. Optional. */
-	if (!(cn = find_config_tree_node(cmd, "devices/filter")))
+	if (!(cn = find_config_tree_node(cmd, devices_filter_CFG)))
 		log_very_verbose("devices/filter not found in config file: "
 				 "no regex filter installed");
 
@@ -876,7 +842,7 @@ static struct dev_filter *_init_filter_components(struct cmd_context *cmd)
 		nr_filt++;
 
 	/* device type filter. Required. */
-	cn = find_config_tree_node(cmd, "devices/types");
+	cn = find_config_tree_node(cmd, devices_types_CFG);
 	if (!(filters[nr_filt] = lvm_type_filter_create(cmd->proc_dir, cn))) {
 		log_error("Failed to create lvm type filter");
 		goto bad;
@@ -884,16 +850,14 @@ static struct dev_filter *_init_filter_components(struct cmd_context *cmd)
 	nr_filt++;
 
 	/* md component filter. Optional, non-critical. */
-	if (find_config_tree_bool(cmd, "devices/md_component_detection",
-			     DEFAULT_MD_COMPONENT_DETECTION)) {
+	if (find_config_tree_bool(cmd, devices_md_component_detection_CFG)) {
 		init_md_filtering(1);
 		if ((filters[nr_filt] = md_filter_create()))
 			nr_filt++;
 	}
 
 	/* mpath component filter. Optional, non-critical. */
-	if (find_config_tree_bool(cmd, "devices/multipath_component_detection",
-			     DEFAULT_MULTIPATH_COMPONENT_DETECTION)) {
+	if (find_config_tree_bool(cmd, devices_multipath_component_detection_CFG)) {
 		if ((filters[nr_filt] = mpath_filter_create(cmd->sysfs_dir)))
 			nr_filt++;
 	}
@@ -926,14 +890,13 @@ static int _init_filters(struct cmd_context *cmd, unsigned load_persistent_cache
 	if (!(f3 = _init_filter_components(cmd)))
 		goto_bad;
 
-	init_ignore_suspended_devices(find_config_tree_int(cmd,
-	    "devices/ignore_suspended_devices", DEFAULT_IGNORE_SUSPENDED_DEVICES));
+	init_ignore_suspended_devices(find_config_tree_bool(cmd, devices_ignore_suspended_devices_CFG));
 
 	/*
 	 * If 'cache_dir' or 'cache_file_prefix' is set, ignore 'cache'.
 	 */
-	cache_dir = find_config_tree_str(cmd, "devices/cache_dir", NULL);
-	cache_file_prefix = find_config_tree_str(cmd, "devices/cache_file_prefix", NULL);
+	cache_dir = find_config_tree_str(cmd, devices_cache_dir_CFG);
+	cache_file_prefix = find_config_tree_str(cmd, devices_cache_file_prefix_CFG);
 
 	if (cache_dir || cache_file_prefix) {
 		if (dm_snprintf(cache_file, sizeof(cache_file),
@@ -945,7 +908,7 @@ static int _init_filters(struct cmd_context *cmd, unsigned load_persistent_cache
 			log_error("Persistent cache filename too long.");
 			goto bad;
 		}
-	} else if (!(dev_cache = find_config_tree_str(cmd, "devices/cache", NULL)) &&
+	} else if (!(dev_cache = find_config_tree_str(cmd, devices_cache_CFG)) &&
 		   (dm_snprintf(cache_file, sizeof(cache_file),
 				"%s/%s/%s.cache",
 				cmd->system_dir, DEFAULT_CACHE_SUBDIR,
@@ -964,7 +927,7 @@ static int _init_filters(struct cmd_context *cmd, unsigned load_persistent_cache
 	}
 
 	/* Should we ever dump persistent filter state? */
-	if (find_config_tree_int(cmd, "devices/write_cache_state", 1))
+	if (find_config_tree_bool(cmd, devices_write_cache_state_CFG));
 		cmd->dump_filter = 1;
 
 	if (!*cmd->system_dir)
@@ -981,7 +944,7 @@ static int _init_filters(struct cmd_context *cmd, unsigned load_persistent_cache
 		log_verbose("Failed to load existing device cache from %s",
 			    dev_cache);
 
-	if (!(cn = find_config_tree_node(cmd, "devices/global_filter"))) {
+	if (!(cn = find_config_tree_node(cmd, devices_global_filter_CFG))) {
 		cmd->filter = f4;
 	} else if (!(cmd->lvmetad_filter = regex_filter_create(cn->v)))
 		goto_bad;
@@ -1043,7 +1006,7 @@ static int _init_formats(struct cmd_context *cmd)
 #ifdef HAVE_LIBDL
 	/* Load any formats in shared libs if not static */
 	if (!is_static() &&
-	    (cn = find_config_tree_node(cmd, "global/format_libraries"))) {
+	    (cn = find_config_tree_node(cmd, global_format_libraries_CFG))) {
 
 		const struct dm_config_value *cv;
 		struct format_type *(*init_format_fn) (struct cmd_context *);
@@ -1084,8 +1047,7 @@ static int _init_formats(struct cmd_context *cmd)
 
 	cmd->fmt_backup = fmt;
 
-	format = find_config_tree_str(cmd, "global/format",
-				 DEFAULT_FORMAT);
+	format = find_config_tree_str(cmd, global_format_CFG);
 
 	dm_list_iterate_items(fmt, &cmd->formats) {
 		if (!strcasecmp(fmt->name, format) ||
@@ -1206,7 +1168,7 @@ static int _init_segtypes(struct cmd_context *cmd)
 #ifdef HAVE_LIBDL
 	/* Load any formats in shared libs unless static */
 	if (!is_static() &&
-	    (cn = find_config_tree_node(cmd, "global/segment_libraries"))) {
+	    (cn = find_config_tree_node(cmd, global_segment_libraries_CFG))) {
 
 		const struct dm_config_value *cv;
 		int (*init_multiple_segtypes_fn) (struct cmd_context *,
@@ -1294,14 +1256,11 @@ static int _init_backup(struct cmd_context *cmd)
 
 	/* set up archiving */
 	cmd->default_settings.archive =
-	    find_config_tree_bool(cmd, "backup/archive",
-			     DEFAULT_ARCHIVE_ENABLED);
+	    find_config_tree_bool(cmd, backup_archive_CFG);
 
-	days = (uint32_t) find_config_tree_int(cmd, "backup/retain_days",
-					  DEFAULT_ARCHIVE_DAYS);
+	days = (uint32_t) find_config_tree_int(cmd, backup_retain_days_CFG);
 
-	min = (uint32_t) find_config_tree_int(cmd, "backup/retain_min",
-					 DEFAULT_ARCHIVE_NUMBER);
+	min = (uint32_t) find_config_tree_int(cmd, backup_retain_min_CFG);
 
 	if (dm_snprintf
 	    (default_dir, sizeof(default_dir), "%s/%s", cmd->system_dir,
@@ -1311,8 +1270,8 @@ static int _init_backup(struct cmd_context *cmd)
 		return 0;
 	}
 
-	dir = find_config_tree_str(cmd, "backup/archive_dir",
-			      default_dir);
+	if (!(dir = find_config_tree_str(cmd, backup_archive_dir_CFG)))
+		dir = default_dir;
 
 	if (!archive_init(cmd, dir, days, min,
 			  cmd->default_settings.archive)) {
@@ -1321,9 +1280,7 @@ static int _init_backup(struct cmd_context *cmd)
 	}
 
 	/* set up the backup */
-	cmd->default_settings.backup =
-	    find_config_tree_bool(cmd, "backup/backup",
-			     DEFAULT_BACKUP_ENABLED);
+	cmd->default_settings.backup = find_config_tree_bool(cmd, backup_backup_CFG);
 
 	if (dm_snprintf
 	    (default_dir, sizeof(default_dir), "%s/%s", cmd->system_dir,
@@ -1333,7 +1290,8 @@ static int _init_backup(struct cmd_context *cmd)
 		return 0;
 	}
 
-	dir = find_config_tree_str(cmd, "backup/backup_dir", default_dir);
+	if (!(dir = find_config_tree_str(cmd, backup_backup_dir_CFG)))
+		dir = default_dir;
 
 	if (!backup_init(cmd, dir, cmd->default_settings.backup)) {
 		log_debug("backup_init failed.");
@@ -1758,6 +1716,9 @@ void destroy_toolcontext(struct cmd_context *cmd)
 	}
 #endif
 
+	if (cmd->cft_def_hash)
+		dm_hash_destroy(cmd->cft_def_hash);
+
 	dm_free(cmd);
 
 	lvmetad_release_token();
diff --git a/lib/commands/toolcontext.h b/lib/commands/toolcontext.h
index c21ec13..b79ebe2 100644
--- a/lib/commands/toolcontext.h
+++ b/lib/commands/toolcontext.h
@@ -100,6 +100,7 @@ struct cmd_context {
 	struct dm_config_tree *cft;
 	struct config_info default_settings;
 	struct config_info current_settings;
+	struct dm_hash_table *cft_def_hash; /* cft definition hash used for validity check */
 
 	struct archive_params *archive_params;
 	struct backup_params *backup_params;
diff --git a/lib/config/config.c b/lib/config/config.c
index f2ee9e7..8234cf4 100644
--- a/lib/config/config.c
+++ b/lib/config/config.c
@@ -334,44 +334,77 @@ int config_def_get_path(char *buf, size_t buf_size, int id)
 	return _cfg_def_make_path(buf, buf_size, id, cfg_def_get_item_p(id));
 }
 
-const struct dm_config_node *find_config_tree_node(struct cmd_context *cmd,
-						   const char *path)
+const struct dm_config_node *find_config_tree_node(struct cmd_context *cmd, int id)
 {
-	return dm_config_tree_find_node(cmd->cft, path);
+	return dm_config_tree_find_node(cmd->cft, cfg_def_get_path(cfg_def_get_item_p(id)));
 }
 
-const char *find_config_tree_str(struct cmd_context *cmd,
-				 const char *path, const char *fail)
+const char *find_config_tree_str(struct cmd_context *cmd, int id)
 {
-	return dm_config_tree_find_str(cmd->cft, path, fail);
+	cfg_def_item_t *item = cfg_def_get_item_p(id);
+	const char *path = cfg_def_get_path(item);
+
+	if (item->type != CFG_TYPE_STRING)
+		log_error(INTERNAL_ERROR "%s cfg tree element not declared as string.", path);
+
+	return dm_config_tree_find_str(cmd->cft, path, cfg_def_get_default_value(item, CFG_TYPE_STRING));
 }
 
-const char *find_config_tree_str_allow_empty(struct cmd_context *cmd,
-					     const char *path, const char *fail)
+const char *find_config_tree_str_allow_empty(struct cmd_context *cmd, int id)
 {
-	return dm_config_tree_find_str_allow_empty(cmd->cft, path, fail);
+	cfg_def_item_t *item = cfg_def_get_item_p(id);
+	const char *path = cfg_def_get_path(item);
+
+	if (item->type != CFG_TYPE_STRING)
+		log_error(INTERNAL_ERROR "%s cfg tree element not declared as string.", path);
+	if (!(item->flags & CFG_ALLOW_EMPTY))
+		log_error(INTERNAL_ERROR "%s cfg tree element not declared to allow empty values.", path);
+
+	return dm_config_tree_find_str_allow_empty(cmd->cft, path, cfg_def_get_default_value(item, CFG_TYPE_STRING));
 }
 
-int find_config_tree_int(struct cmd_context *cmd, const char *path,
-			 int fail)
+int find_config_tree_int(struct cmd_context *cmd, int id)
 {
-	return dm_config_tree_find_int(cmd->cft, path, fail);
+	cfg_def_item_t *item = cfg_def_get_item_p(id);
+	const char *path = cfg_def_get_path(item);
+
+	if (item->type != CFG_TYPE_INT)
+		log_error(INTERNAL_ERROR "%s cfg tree element not declared as integer.", path);
+
+	return dm_config_tree_find_int(cmd->cft, path, cfg_def_get_default_value(item, CFG_TYPE_INT));
 }
 
-int64_t find_config_tree_int64(struct cmd_context *cmd, const char *path, int64_t fail)
+int64_t find_config_tree_int64(struct cmd_context *cmd, int id)
 {
-	return dm_config_tree_find_int64(cmd->cft, path, fail);
+	cfg_def_item_t *item = cfg_def_get_item_p(id);
+	const char *path = cfg_def_get_path(item);
+
+	if (item->type != CFG_TYPE_INT)
+		log_error(INTERNAL_ERROR "%s cfg tree element not declared as integer.", path);
+
+	return dm_config_tree_find_int64(cmd->cft, path, cfg_def_get_default_value(item, CFG_TYPE_INT));
 }
 
-float find_config_tree_float(struct cmd_context *cmd, const char *path,
-			     float fail)
+float find_config_tree_float(struct cmd_context *cmd, int id)
 {
-	return dm_config_tree_find_float(cmd->cft, path, fail);
+	cfg_def_item_t *item = cfg_def_get_item_p(id);
+	const char *path = cfg_def_get_path(item);
+
+	if (item->type != CFG_TYPE_FLOAT)
+		log_error(INTERNAL_ERROR "%s cfg tree element not declared as float.", path);
+
+	return dm_config_tree_find_float(cmd->cft, path, cfg_def_get_default_value(item, CFG_TYPE_FLOAT));
 }
 
-int find_config_tree_bool(struct cmd_context *cmd, const char *path, int fail)
+int find_config_tree_bool(struct cmd_context *cmd, int id)
 {
-	return dm_config_tree_find_bool(cmd->cft, path, fail);
+	cfg_def_item_t *item = cfg_def_get_item_p(id);
+	const char *path = cfg_def_get_path(item);
+
+	if (item->type != CFG_TYPE_BOOL)
+		log_error(INTERNAL_ERROR "%s cfg tree element not declared as boolean.", path);
+
+	return dm_config_tree_find_bool(cmd->cft, path, cfg_def_get_default_value(item, CFG_TYPE_BOOL));
 }
 
 /* Insert cn2 after cn1 */
diff --git a/lib/config/config.h b/lib/config/config.h
index 2317348..a239e1d 100644
--- a/lib/config/config.h
+++ b/lib/config/config.h
@@ -113,19 +113,12 @@ int merge_config_tree(struct cmd_context *cmd, struct dm_config_tree *cft,
 /*
  * These versions check an override tree, if present, first.
  */
-const struct dm_config_node *find_config_tree_node(struct cmd_context *cmd,
-						   const char *path);
-const char *find_config_tree_str(struct cmd_context *cmd,
-				 const char *path, const char *fail);
-const char *find_config_tree_str_allow_empty(struct cmd_context *cmd,
-					     const char *path, const char *fail);
-int find_config_tree_int(struct cmd_context *cmd, const char *path,
-			 int fail);
-int64_t find_config_tree_int64(struct cmd_context *cmd, const char *path,
-			     int64_t fail);
-float find_config_tree_float(struct cmd_context *cmd, const char *path,
-			     float fail);
-
-int find_config_tree_bool(struct cmd_context *cmd, const char *path, int fail);
+const struct dm_config_node *find_config_tree_node(struct cmd_context *cmd, int id);
+const char *find_config_tree_str(struct cmd_context *cmd, int id);
+const char *find_config_tree_str_allow_empty(struct cmd_context *cmd, int id);
+int find_config_tree_int(struct cmd_context *cmd, int id);
+int64_t find_config_tree_int64(struct cmd_context *cmd, int id);
+float find_config_tree_float(struct cmd_context *cmd, int id);
+int find_config_tree_bool(struct cmd_context *cmd, int id);
 
 #endif
diff --git a/lib/config/defaults.h b/lib/config/defaults.h
index d39995e..cad9862 100644
--- a/lib/config/defaults.h
+++ b/lib/config/defaults.h
@@ -86,7 +86,6 @@
 
 #define DEFAULT_STRIPESIZE 64	/* KB */
 #define DEFAULT_PVMETADATAIGNORE 0
-#define DEFAULT_PVMETADATAIGNORE_STR "n"
 #define DEFAULT_PVMETADATASIZE 255
 #define DEFAULT_PVMETADATACOPIES 1
 #define DEFAULT_VGMETADATACOPIES 0
diff --git a/lib/device/dev-cache.c b/lib/device/dev-cache.c
index 9905045..0933549 100644
--- a/lib/device/dev-cache.c
+++ b/lib/device/dev-cache.c
@@ -675,7 +675,7 @@ static int _init_preferred_names(struct cmd_context *cmd)
 
 	_cache.preferred_names_matcher = NULL;
 
-	if (!(cn = find_config_tree_node(cmd, "devices/preferred_names")) ||
+	if (!(cn = find_config_tree_node(cmd, devices_preferred_names_CFG)) ||
 	    cn->v->type == DM_CFG_EMPTY_ARRAY) {
 		log_very_verbose("devices/preferred_names not found in config file: "
 				 "using built-in preferences");
diff --git a/lib/display/display.c b/lib/display/display.c
index c0d0cd9..c766674 100644
--- a/lib/display/display.c
+++ b/lib/display/display.c
@@ -526,8 +526,7 @@ int lvdisplay_full(struct cmd_context *cmd,
 
 	log_print("--- Logical volume ---");
 
-	lvm1compat = find_config_tree_int(cmd, "global/lvdisplay_shows_full_device_path",
-					  DEFAULT_LVDISPLAY_SHOWS_FULL_DEVICE_PATH);
+	lvm1compat = find_config_tree_bool(cmd, global_lvdisplay_shows_full_device_path_CFG);
 
 	if (lvm1compat)
 		/* /dev/vgname/lvname doen't actually exist for internal devices */
diff --git a/lib/format_text/format-text.c b/lib/format_text/format-text.c
index 774f6ce..951ec76 100644
--- a/lib/format_text/format-text.c
+++ b/lib/format_text/format-text.c
@@ -1477,9 +1477,7 @@ static int _text_pv_initialise(const struct format_type *fmt,
 	unsigned long adjustment, final_alignment = 0;
 
 	if (!data_alignment)
-		data_alignment = find_config_tree_int(pv->fmt->cmd,
-					      "devices/data_alignment",
-					      0) * 2;
+		data_alignment = find_config_tree_int(pv->fmt->cmd, devices_data_alignment_CFG) * 2;
 
 	if (set_pe_align(pv, data_alignment) != data_alignment &&
 	    data_alignment) {
@@ -2443,7 +2441,7 @@ struct format_type *create_text_format(struct cmd_context *cmd)
 		goto bad;
 	}
 
-	if ((cn = find_config_tree_node(cmd, "metadata/dirs"))) {
+	if ((cn = find_config_tree_node(cmd, metadata_dirs_CFG))) {
 		for (cv = cn->v; cv; cv = cv->next) {
 			if (cv->type != DM_CFG_STRING) {
 				log_error("Invalid string in config file: "
@@ -2460,7 +2458,7 @@ struct format_type *create_text_format(struct cmd_context *cmd)
 		}
 	}
 
-	if ((cn = find_config_tree_node(cmd, "metadata/disk_areas"))) {
+	if ((cn = find_config_tree_node(cmd, metadata_disk_areas_CFG))) {
 		for (cn = cn->child; cn; cn = cn->sib) {
 			if (!_get_config_disk_area(cmd, cn, &mda_lists->raws))
 				goto_bad;
diff --git a/lib/locking/external_locking.c b/lib/locking/external_locking.c
index 4dacbe4..1076174 100644
--- a/lib/locking/external_locking.c
+++ b/lib/locking/external_locking.c
@@ -80,8 +80,8 @@ int init_external_locking(struct locking_type *locking, struct cmd_context *cmd,
 	locking->reset_locking = _reset_external_locking;
 	locking->flags = 0;
 
-	libname = find_config_tree_str(cmd, "global/locking_library",
-				       DEFAULT_LOCKING_LIB);
+	if (!(libname = find_config_tree_str(cmd, global_locking_library_CFG)))
+		libname = DEFAULT_LOCKING_LIB;
 
 	if (!(_locking_lib = load_shared_library(cmd, libname, "locking", 1)))
 		return_0;
diff --git a/lib/locking/file_locking.c b/lib/locking/file_locking.c
index 2b7bfe2..4711fa2 100644
--- a/lib/locking/file_locking.c
+++ b/lib/locking/file_locking.c
@@ -346,8 +346,7 @@ int init_file_locking(struct locking_type *locking, struct cmd_context *cmd,
 	locking->flags = 0;
 
 	/* Get lockfile directory from config file */
-	locking_dir = find_config_tree_str(cmd, "global/locking_dir",
-					   DEFAULT_LOCK_DIR);
+	locking_dir = find_config_tree_str(cmd, global_locking_dir_CFG);
 	if (strlen(locking_dir) >= sizeof(_lock_dir)) {
 		log_error("Path for locking_dir %s is invalid.", locking_dir);
 		return 0;
@@ -356,8 +355,7 @@ int init_file_locking(struct locking_type *locking, struct cmd_context *cmd,
 	strcpy(_lock_dir, locking_dir);
 
 	_prioritise_write_locks =
-	    find_config_tree_bool(cmd, "global/prioritise_write_locks",
-				  DEFAULT_PRIORITISE_WRITE_LOCKS);
+	    find_config_tree_bool(cmd, global_prioritise_write_locks_CFG);
 
 	(void) dm_prepare_selinux_context(_lock_dir, S_IFDIR);
 	r = dm_create_dir(_lock_dir);
diff --git a/lib/locking/locking.c b/lib/locking/locking.c
index 6f31ba8..63f946f 100644
--- a/lib/locking/locking.c
+++ b/lib/locking/locking.c
@@ -225,10 +225,9 @@ int init_locking(int type, struct cmd_context *cmd, int suppress_messages)
 		suppress_messages = 1;
 
 	if (type < 0)
-		type = find_config_tree_int(cmd, "global/locking_type", 1);
+		type = find_config_tree_int(cmd, global_locking_type_CFG);
 
-	_blocking_supported = find_config_tree_int(cmd,
-	    "global/wait_for_locks", DEFAULT_WAIT_FOR_LOCKS);
+	_blocking_supported = find_config_tree_bool(cmd, global_wait_for_locks_CFG);
 
 	switch (type) {
 	case 0:
@@ -255,9 +254,7 @@ int init_locking(int type, struct cmd_context *cmd, int suppress_messages)
 			if (init_external_locking(&_locking, cmd, suppress_messages))
 				return 1;
 		}
-		if (!find_config_tree_int(cmd, "locking/fallback_to_clustered_locking",
-			    find_config_tree_int(cmd, "global/fallback_to_clustered_locking",
-						 DEFAULT_FALLBACK_TO_CLUSTERED_LOCKING))) {
+		if (!find_config_tree_bool(cmd, global_fallback_to_clustered_locking_CFG)) {
 			log_error_suppress(suppress_messages, "External locking initialisation failed.");
 			break;
 		}
@@ -290,9 +287,7 @@ int init_locking(int type, struct cmd_context *cmd, int suppress_messages)
 	}
 
 	if ((type == 2 || type == 3) &&
-	    find_config_tree_int(cmd, "locking/fallback_to_local_locking",
-	    	    find_config_tree_int(cmd, "global/fallback_to_local_locking",
-					 DEFAULT_FALLBACK_TO_LOCAL_LOCKING))) {
+	    find_config_tree_bool(cmd, global_fallback_to_local_locking_CFG)) {
 		log_warn_suppress(suppress_messages, "WARNING: Falling back to local file-based locking.");
 		log_warn_suppress(suppress_messages,
 				  "Volume Groups with the clustered attribute will "
diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c
index ef9f643..ad8160e 100644
--- a/lib/metadata/lv_manip.c
+++ b/lib/metadata/lv_manip.c
@@ -95,8 +95,8 @@ int get_default_region_size(struct cmd_context *cmd)
 	 * 'mirror_region_size' is the old setting.  It is overridden
 	 * by the new setting, 'raid_region_size'.
 	 */
-	mrs = 2 * find_config_tree_int(cmd, "activation/mirror_region_size", 0);
-	rrs = 2 * find_config_tree_int(cmd, "activation/raid_region_size", 0);
+	mrs = 2 * find_config_tree_int(cmd, activation_mirror_region_size_CFG);
+	rrs = 2 * find_config_tree_int(cmd, activation_raid_region_size_CFG);
 
 	if (!mrs && !rrs)
 		return DEFAULT_RAID_REGION_SIZE * 2;
@@ -921,8 +921,7 @@ static struct alloc_handle *_alloc_init(struct cmd_context *cmd,
 	 * a correct area_multiple.
 	 */
 	ah->area_multiple = _calc_area_multiple(segtype, area_count + parity_count, stripes);
-	ah->mirror_logs_separate = find_config_tree_bool(cmd, "allocation/mirror_logs_require_separate_pvs",
-							 DEFAULT_MIRROR_LOGS_REQUIRE_SEPARATE_PVS);
+	ah->mirror_logs_separate = find_config_tree_bool(cmd, allocation_mirror_logs_require_separate_pvs_CFG);
 
 	if (segtype_is_raid(segtype)) {
 		if (metadata_area_count) {
@@ -949,8 +948,7 @@ static struct alloc_handle *_alloc_init(struct cmd_context *cmd,
 		ah->log_len = ah->region_size;
 		ah->region_size = 0;
 		ah->mirror_logs_separate =
-			find_config_tree_bool(cmd, "allocation/thin_pool_metadata_require_separate_pvs",
-					      DEFAULT_THIN_POOL_METADATA_REQUIRE_SEPARATE_PVS);
+			find_config_tree_bool(cmd, allocation_thin_pool_metadata_require_separate_pvs_CFG);
 	} else {
 		ah->log_area_count = metadata_area_count;
 		ah->log_len = !metadata_area_count ? 0 :
@@ -963,9 +961,9 @@ static struct alloc_handle *_alloc_init(struct cmd_context *cmd,
 
 	ah->parallel_areas = parallel_areas;
 
-	ah->cling_tag_list_cn = find_config_tree_node(cmd, "allocation/cling_tag_list");
+	ah->cling_tag_list_cn = find_config_tree_node(cmd, allocation_cling_tag_list_CFG);
 
-	ah->maximise_cling = find_config_tree_bool(cmd, "allocation/maximise_cling", DEFAULT_MAXIMISE_CLING);
+	ah->maximise_cling = find_config_tree_bool(cmd, allocation_maximise_cling_CFG);
 
 	return ah;
 }
@@ -3389,8 +3387,7 @@ int lv_remove_single(struct cmd_context *cmd, struct logical_volume *lv,
 	}
 
 	/* FIXME Ensure not referred to by another existing LVs */
-	ask_discard = find_config_tree_bool(cmd,
-					    "devices/issue_discards", DEFAULT_ISSUE_DISCARDS);
+	ask_discard = find_config_tree_bool(cmd, devices_issue_discards_CFG);
 
 	if (lv_info(cmd, lv, 0, &info, 1, 0)) {
 		if (!lv_check_not_in_use(cmd, lv, &info))
diff --git a/lib/metadata/metadata.c b/lib/metadata/metadata.c
index 0996184..403d86d 100644
--- a/lib/metadata/metadata.c
+++ b/lib/metadata/metadata.c
@@ -74,9 +74,7 @@ unsigned long set_pe_align(struct physical_volume *pv, unsigned long data_alignm
 		goto out;
 	}
 
-	default_pe_align = find_config_tree_int(pv->fmt->cmd,
-						"devices/default_data_alignment",
-						DEFAULT_DATA_ALIGNMENT);
+	default_pe_align = find_config_tree_int(pv->fmt->cmd, devices_default_data_alignment_CFG);
 
 	if (default_pe_align)
 		/* align on 1 MiB multiple */
@@ -94,8 +92,7 @@ unsigned long set_pe_align(struct physical_volume *pv, unsigned long data_alignm
 	/*
 	 * Align to stripe-width of underlying md device if present
 	 */
-	if (find_config_tree_bool(pv->fmt->cmd, "devices/md_chunk_alignment",
-				  DEFAULT_MD_CHUNK_ALIGNMENT)) {
+	if (find_config_tree_bool(pv->fmt->cmd, devices_md_chunk_alignment_CFG)) {
 		temp_pe_align = dev_md_stripe_width(pv->fmt->cmd->sysfs_dir, pv->dev);
 		if (_alignment_overrides_default(temp_pe_align, default_pe_align))
 			pv->pe_align = MAX(pv->pe_align, temp_pe_align);
@@ -108,9 +105,7 @@ unsigned long set_pe_align(struct physical_volume *pv, unsigned long data_alignm
 	 * - optimal_io_size - the device's preferred unit of receiving I/O
 	 *   (e.g. MD's stripe width)
 	 */
-	if (find_config_tree_bool(pv->fmt->cmd,
-				  "devices/data_alignment_detection",
-				  DEFAULT_DATA_ALIGNMENT_DETECTION)) {
+	if (find_config_tree_bool(pv->fmt->cmd, devices_data_alignment_detection_CFG)) {
 		temp_pe_align = dev_minimum_io_size(pv->fmt->cmd->sysfs_dir, pv->dev);
 		if (_alignment_overrides_default(temp_pe_align, default_pe_align))
 			pv->pe_align = MAX(pv->pe_align, temp_pe_align);
@@ -142,9 +137,7 @@ unsigned long set_pe_align_offset(struct physical_volume *pv,
 	if (!pv->dev)
 		goto out;
 
-	if (find_config_tree_bool(pv->fmt->cmd,
-				  "devices/data_alignment_offset_detection",
-				  DEFAULT_DATA_ALIGNMENT_OFFSET_DETECTION)) {
+	if (find_config_tree_bool(pv->fmt->cmd, devices_data_alignment_offset_detection_CFG)) {
 		int align_offset = dev_alignment_offset(pv->fmt->cmd->sysfs_dir,
 							pv->dev);
 		/* must handle a -1 alignment_offset; means dev is misaligned */
diff --git a/lib/metadata/mirror.c b/lib/metadata/mirror.c
index 2a78508..04a5638 100644
--- a/lib/metadata/mirror.c
+++ b/lib/metadata/mirror.c
@@ -1230,19 +1230,16 @@ int collapse_mirrored_lv(struct logical_volume *lv)
 static int _get_mirror_fault_policy(struct cmd_context *cmd __attribute__((unused)),
 				   int log_policy)
 {
-	const char *policy;
-
+	const char *policy = NULL;
+/*
 	if (log_policy)
-		policy = dm_config_find_str(NULL, "activation/mirror_log_fault_policy",
-					 DEFAULT_MIRROR_LOG_FAULT_POLICY);
+		policy = find_config_tree_str(cmd, activation_mirror_log_fault_policy_CFG);
 	else {
-		policy = dm_config_find_str(NULL, "activation/mirror_image_fault_policy",
-					 NULL);
+		policy = find_config_tree_str(cmd, activation_mirror_image_fault_policy_CFG);
 		if (!policy)
-			policy = dm_config_find_str(NULL, "activation/mirror_device_fault_policy",
-						 DEFAULT_MIRROR_IMAGE_FAULT_POLICY);
+			policy = find_config_tree_str(cmd, activation_mirror_device_fault_policy_CFG);
 	}
-
+*/
 	if (!strcmp(policy, "remove"))
 		return MIRROR_REMOVE;
 	else if (!strcmp(policy, "allocate"))
diff --git a/lib/metadata/pv_manip.c b/lib/metadata/pv_manip.c
index 83aa9af..4a65a3e 100644
--- a/lib/metadata/pv_manip.c
+++ b/lib/metadata/pv_manip.c
@@ -203,8 +203,7 @@ int discard_pv_segment(struct pv_segment *peg, uint32_t discard_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))
+	if (!find_config_tree_bool(peg->pv->fmt->cmd, devices_issue_discards_CFG))
 		return 1;
  
 	/* Missing PV? */
diff --git a/lib/metadata/thin_manip.c b/lib/metadata/thin_manip.c
index 59748de..c994a2e 100644
--- a/lib/metadata/thin_manip.c
+++ b/lib/metadata/thin_manip.c
@@ -312,9 +312,7 @@ int pool_below_threshold(const struct lv_segment *pool_seg)
 {
 	percent_t percent;
 	int threshold = PERCENT_1 *
-		find_config_tree_int(pool_seg->lv->vg->cmd,
-				     "activation/thin_pool_autoextend_threshold",
-				     DEFAULT_THIN_POOL_AUTOEXTEND_THRESHOLD);
+		find_config_tree_int(pool_seg->lv->vg->cmd, activation_thin_pool_autoextend_threshold_CFG);
 
 	/* Data */
 	if (!lv_thin_pool_percent(pool_seg->lv, 0, &percent))
diff --git a/lib/mirror/mirrored.c b/lib/mirror/mirrored.c
index 58afab3..6ce929d 100644
--- a/lib/mirror/mirrored.c
+++ b/lib/mirror/mirrored.c
@@ -540,8 +540,7 @@ static int _mirrored_target_present(struct cmd_context *cmd,
 #ifdef DMEVENTD
 static const char *_get_mirror_dso_path(struct cmd_context *cmd)
 {
-	return get_monitor_dso_path(cmd, find_config_tree_str(cmd, "dmeventd/mirror_library",
-							      DEFAULT_DMEVENTD_MIRROR_LIB));
+	return get_monitor_dso_path(cmd, find_config_tree_str(cmd, dmeventd_mirror_library_CFG));
 }
 
 /* FIXME Cache this */
diff --git a/lib/misc/sharedlib.c b/lib/misc/sharedlib.c
index 4c2d178..b899781 100644
--- a/lib/misc/sharedlib.c
+++ b/lib/misc/sharedlib.c
@@ -30,7 +30,7 @@ void get_shared_library_path(struct cmd_context *cmd, const char *libname,
 	/* If libname doesn't begin with '/' then use lib_dir/libname,
 	 * if present */
 	if (libname[0] == '/' ||
-	    !(lib_dir = find_config_tree_str(cmd, "global/library_dir", 0)) ||
+	    !(lib_dir = find_config_tree_str(cmd, global_library_dir_CFG)) ||
 	    (dm_snprintf(path, path_len, "%s/%s", lib_dir,
 			 libname) == -1) || stat(path, &info) == -1) {
 		strncpy(path, libname, path_len - 1);
diff --git a/lib/mm/memlock.c b/lib/mm/memlock.c
index 6defa66..098de9e 100644
--- a/lib/mm/memlock.c
+++ b/lib/mm/memlock.c
@@ -290,7 +290,7 @@ static int _memlock_maps(struct cmd_context *cmd, lvmlock_t lock, size_t *mstats
 	}
 
 	line = _maps_buffer;
-	cn = find_config_tree_node(cmd, "activation/mlock_filter");
+	cn = find_config_tree_node(cmd, activation_mlock_filter_CFG);
 
 	while ((line_end = strchr(line, '\n'))) {
 		*line_end = '\0'; /* remove \n */
@@ -317,7 +317,7 @@ static void _lock_mem(struct cmd_context *cmd)
 	 * Note: assuming _memlock_count_daemon is updated before _memlock_count
          */
 	_use_mlockall = _memlock_count_daemon ? 1 :
-		find_config_tree_bool(cmd, "activation/use_mlockall", DEFAULT_USE_MLOCKALL);
+		find_config_tree_bool(cmd, activation_use_mlockall_CFG);
 
 	if (!_use_mlockall) {
 		if (!*_procselfmaps &&
@@ -453,14 +453,9 @@ void memlock_init(struct cmd_context *cmd)
 {
 	/* When threaded, caller already limited stack size so just use the default. */
 	_size_stack = 1024ULL * (cmd->threaded ? DEFAULT_RESERVED_STACK :
-				 find_config_tree_int(cmd, "activation/reserved_stack",
-						      DEFAULT_RESERVED_STACK));
-	_size_malloc_tmp = find_config_tree_int(cmd,
-					   "activation/reserved_memory",
-					   DEFAULT_RESERVED_MEMORY) * 1024ULL;
-	_default_priority = find_config_tree_int(cmd,
-					    "activation/process_priority",
-					    DEFAULT_PROCESS_PRIORITY);
+				 find_config_tree_int(cmd, activation_reserved_stack_CFG));
+	_size_malloc_tmp = find_config_tree_int(cmd, activation_reserved_memory_CFG) * 1024ULL;
+	_default_priority = find_config_tree_int(cmd, activation_process_priority_CFG);
 }
 
 void memlock_reset(void)
diff --git a/lib/raid/raid.c b/lib/raid/raid.c
index 78fe074..1e28c73 100644
--- a/lib/raid/raid.c
+++ b/lib/raid/raid.c
@@ -282,8 +282,7 @@ static void _raid_destroy(struct segment_type *segtype)
 #ifdef DMEVENTD
 static const char *_get_raid_dso_path(struct cmd_context *cmd)
 {
-	const char *config_str = find_config_tree_str(cmd, "dmeventd/raid_library",
-						      DEFAULT_DMEVENTD_RAID_LIB);
+	const char *config_str = find_config_tree_str(cmd, dmeventd_raid_library_CFG);
 	return get_monitor_dso_path(cmd, config_str);
 }
 
diff --git a/lib/snapshot/snapshot.c b/lib/snapshot/snapshot.c
index 662614c..3c03ea9 100644
--- a/lib/snapshot/snapshot.c
+++ b/lib/snapshot/snapshot.c
@@ -175,8 +175,7 @@ static int _snap_target_present(struct cmd_context *cmd,
 
 static const char *_get_snapshot_dso_path(struct cmd_context *cmd)
 {
-	return get_monitor_dso_path(cmd, find_config_tree_str(cmd, "dmeventd/snapshot_library",
-							      DEFAULT_DMEVENTD_SNAPSHOT_LIB));
+	return get_monitor_dso_path(cmd, find_config_tree_str(cmd, dmeventd_snapshot_library_CFG));
 }
 
 /* FIXME Cache this */
diff --git a/lib/thin/thin.c b/lib/thin/thin.c
index 3e1da91..4bfae33 100644
--- a/lib/thin/thin.c
+++ b/lib/thin/thin.c
@@ -379,8 +379,7 @@ static int _thin_pool_target_percent(void **target_state __attribute__((unused))
 #  ifdef DMEVENTD
 static const char *_get_thin_dso_path(struct cmd_context *cmd)
 {
-	return get_monitor_dso_path(cmd, find_config_tree_str(cmd, "dmeventd/thin_library",
-							      DEFAULT_DMEVENTD_THIN_LIB));
+	return get_monitor_dso_path(cmd, find_config_tree_str(cmd, dmeventd_thin_library_CFG));
 }
 
 /* FIXME Cache this */
@@ -596,7 +595,7 @@ static int _thin_target_present(struct cmd_context *cmd,
 	if (attributes) {
 		if (!_feature_mask) {
 			/* Support runtime lvm.conf changes, N.B. avoid 32 feature */
-			if ((cn = find_config_tree_node(cmd, _lvmconf))) {
+			if ((cn = find_config_tree_node(cmd, global_thin_disabled_features_CFG))) {
 				for (cv = cn->v; cv; cv = cv->next) {
 					if (cv->type != DM_CFG_STRING) {
 						log_error("Ignoring invalid string in config file %s.",
diff --git a/liblvm/lvm_base.c b/liblvm/lvm_base.c
index b4911df..53be709 100644
--- a/liblvm/lvm_base.c
+++ b/liblvm/lvm_base.c
@@ -96,7 +96,9 @@ int lvm_config_override(lvm_t libh, const char *config_settings)
 
 int lvm_config_find_bool(lvm_t libh, const char *config_path, int fail)
 {
-	return find_config_tree_bool((struct cmd_context *)libh, config_path, fail);
+	struct cmd_context *cmd = (struct cmd_context *)libh;
+
+	return dm_config_tree_find_bool(cmd->cft, config_path, fail);
 }
 
 int lvm_errno(lvm_t libh)
diff --git a/tools/lvconvert.c b/tools/lvconvert.c
index 234eb41..fcfcddb 100644
--- a/tools/lvconvert.c
+++ b/tools/lvconvert.c
@@ -837,15 +837,10 @@ static void _lvconvert_mirrors_repair_ask(struct cmd_context *cmd,
 	*replace_log = *replace_mirrors = 1;
 
 	if (arg_count(cmd, use_policies_ARG)) {
-		leg_policy = find_config_tree_str(cmd,
-					"activation/mirror_image_fault_policy", NULL);
+		leg_policy = find_config_tree_str(cmd, activation_mirror_image_fault_policy_CFG);
 		if (!leg_policy)
-			leg_policy = find_config_tree_str(cmd,
-					"activation/mirror_device_fault_policy",
-					DEFAULT_MIRROR_DEVICE_FAULT_POLICY);
-		log_policy = find_config_tree_str(cmd,
-					"activation/mirror_log_fault_policy",
-					DEFAULT_MIRROR_LOG_FAULT_POLICY);
+			leg_policy = find_config_tree_str(cmd, activation_mirror_device_fault_policy_CFG);
+		log_policy = find_config_tree_str(cmd, activation_mirror_log_fault_policy_CFG);
 		*replace_mirrors = strcmp(leg_policy, "remove");
 		*replace_log = strcmp(log_policy, "remove");
 		return;
@@ -1571,7 +1566,7 @@ static void _lvconvert_raid_repair_ask(struct cmd_context *cmd, int *replace_dev
 	*replace_dev = 1;
 
 	if (arg_count(cmd, use_policies_ARG)) {
-		dev_policy = find_config_tree_str(cmd, "activation/raid_fault_policy", DEFAULT_RAID_FAULT_POLICY);
+		dev_policy = find_config_tree_str(cmd, activation_raid_fault_policy_CFG);
 
 		if (!strcmp(dev_policy, "allocate") ||
 		    !strcmp(dev_policy, "replace"))
diff --git a/tools/lvcreate.c b/tools/lvcreate.c
index a2626c0..4618321 100644
--- a/tools/lvcreate.c
+++ b/tools/lvcreate.c
@@ -506,9 +506,7 @@ static int _read_raid_params(struct lvcreate_params *lp,
 		}
 		/* No stripe argument was given - default to 2 */
 		lp->stripes = 2;
-		lp->stripe_size = find_config_tree_int(cmd,
-						       "metadata/stripesize",
-						       DEFAULT_STRIPESIZE) * 2;
+		lp->stripe_size = find_config_tree_int(cmd, metadata_stripesize_CFG) * 2;
 	}
 
 	/*
@@ -675,9 +673,9 @@ static int _lvcreate_params(struct lvcreate_params *lp,
 	if (arg_count(cmd, mirrors_ARG))
 		if (arg_uint_value(cmd, arg_count(cmd, stripes_long_ARG) ?
 				   stripes_long_ARG : stripes_ARG, 1) > 1) {
-			segtype_str = find_config_tree_str(cmd, "global/raid10_segtype_default", DEFAULT_RAID10_SEGTYPE);
+			segtype_str = find_config_tree_str(cmd, global_raid10_segtype_default_CFG);;
 		} else {
-			segtype_str = find_config_tree_str(cmd, "global/mirror_segtype_default", DEFAULT_MIRROR_SEGTYPE);
+			segtype_str = find_config_tree_str(cmd, global_mirror_segtype_default_CFG);
 		}
 	else if (arg_count(cmd, thin_ARG) || arg_count(cmd, thinpool_ARG))
 		segtype_str = "thin";
diff --git a/tools/lvm.c b/tools/lvm.c
index ec9674e..9b66516 100644
--- a/tools/lvm.c
+++ b/tools/lvm.c
@@ -158,8 +158,7 @@ static void _read_history(struct cmd_context *cmd)
 	if (read_history(hist_file))
 		log_very_verbose("Couldn't read history from %s.", hist_file);
 
-	stifle_history(find_config_tree_int(cmd, "shell/history_size",
-				       DEFAULT_MAX_HISTORY));
+	stifle_history(find_config_tree_int(cmd, shell_history_size_CFG));
 }
 
 static void _write_history(void)
diff --git a/tools/lvmcmdline.c b/tools/lvmcmdline.c
index c37ae25..c7820e0 100644
--- a/tools/lvmcmdline.c
+++ b/tools/lvmcmdline.c
@@ -1443,8 +1443,7 @@ static int _lvm1_fallback(struct cmd_context *cmd)
 	char vsn[80];
 	int dm_present;
 
-	if (!find_config_tree_int(cmd, "global/fallback_to_lvm1",
-			     DEFAULT_FALLBACK_TO_LVM1) ||
+	if (!find_config_tree_bool(cmd, global_fallback_to_lvm1_CFG) ||
 	    strncmp(cmd->kernel_vsn, "2.4.", 4))
 		return 0;
 
diff --git a/tools/lvresize.c b/tools/lvresize.c
index d49da8a..e44fd82 100644
--- a/tools/lvresize.c
+++ b/tools/lvresize.c
@@ -288,20 +288,16 @@ static int _adjust_policy_params(struct cmd_context *cmd,
 
 	if (lv_is_thin_pool(lv)) {
 		policy_threshold =
-			find_config_tree_int(cmd, "activation/thin_pool_autoextend_threshold",
-					     DEFAULT_THIN_POOL_AUTOEXTEND_THRESHOLD) * PERCENT_1;
+			find_config_tree_int(cmd, activation_thin_pool_autoextend_threshold_CFG) * PERCENT_1;
 		policy_amount =
-			find_config_tree_int(cmd, "activation/thin_pool_autoextend_percent",
-					     DEFAULT_THIN_POOL_AUTOEXTEND_PERCENT);
+			find_config_tree_int(cmd, activation_thin_pool_autoextend_percent_CFG);
 		if (!policy_amount && policy_threshold < PERCENT_100)
                         return 0;
 	} else {
 		policy_threshold =
-			find_config_tree_int(cmd, "activation/snapshot_autoextend_threshold",
-					     DEFAULT_SNAPSHOT_AUTOEXTEND_THRESHOLD) * PERCENT_1;
+			find_config_tree_int(cmd, activation_snapshot_autoextend_threshold_CFG) * PERCENT_1;
 		policy_amount =
-			find_config_tree_int(cmd, "activation/snapshot_autoextend_percent",
-					     DEFAULT_SNAPSHOT_AUTOEXTEND_PERCENT);
+			find_config_tree_int(cmd, activation_snapshot_autoextend_percent_CFG);
 	}
 
 	if (policy_threshold >= PERCENT_100)
@@ -652,9 +648,7 @@ static int _lvresize(struct cmd_context *cmd, struct volume_group *vg,
 				lp->stripe_size = seg_stripesize;
 			} else {
 				lp->stripe_size =
-					find_config_tree_int(cmd,
-							"metadata/stripesize",
-							DEFAULT_STRIPESIZE) * 2;
+					find_config_tree_int(cmd, metadata_stripesize_CFG) * 2;
 				log_print_unless_silent("Using default stripesize %s",
 							display_size(cmd, (uint64_t) lp->stripe_size));
 			}
diff --git a/tools/polldaemon.c b/tools/polldaemon.c
index a9138a1..5724623 100644
--- a/tools/polldaemon.c
+++ b/tools/polldaemon.c
@@ -319,8 +319,7 @@ int poll_daemon(struct cmd_context *cmd, const char *name, const char *uuid,
 	if (interval_sign == SIGN_MINUS)
 		log_error("Argument to --interval cannot be negative");
 	parms.interval = arg_uint_value(cmd, interval_ARG,
-					find_config_tree_int(cmd, "activation/polling_interval",
-							     DEFAULT_INTERVAL));
+					find_config_tree_int(cmd, activation_polling_interval_CFG));
 	parms.wait_before_testing = (interval_sign == SIGN_PLUS);
 	parms.progress_display = 1;
 	parms.progress_title = progress_title;
@@ -337,8 +336,7 @@ int poll_daemon(struct cmd_context *cmd, const char *name, const char *uuid,
 
 		/* FIXME Disabled multiple-copy wait_event */
 		if (!name)
-			parms.interval = find_config_tree_int(cmd, "activation/polling_interval",
-							      DEFAULT_INTERVAL);
+			parms.interval = find_config_tree_int(cmd, activation_polling_interval_CFG);
 	}
 
 	if (parms.background) {
diff --git a/tools/pvcreate.c b/tools/pvcreate.c
index 5b83a18..da51eec 100644
--- a/tools/pvcreate.c
+++ b/tools/pvcreate.c
@@ -38,9 +38,7 @@ static int pvcreate_restore_params_validate(struct cmd_context *cmd,
 
 	if (!arg_count(cmd, restorefile_ARG) && arg_count(cmd, uuidstr_ARG)) {
 		if (!arg_count(cmd, norestorefile_ARG) &&
-		    find_config_tree_bool(cmd,
-					  "devices/require_restorefile_with_uuid",
-					  DEFAULT_REQUIRE_RESTOREFILE_WITH_UUID)) {
+		    find_config_tree_bool(cmd, devices_require_restorefile_with_uuid_CFG)) {
 			log_error("--restorefile is required with --uuid");
 			return 0;
 		}
diff --git a/tools/pvscan.c b/tools/pvscan.c
index ff5ced2..ab58c5f 100644
--- a/tools/pvscan.c
+++ b/tools/pvscan.c
@@ -146,8 +146,8 @@ static int _pvscan_lvmetad(struct cmd_context *cmd, int argc, char **argv)
 	 * and to prevent hangs in clustered environment.
 	 */
 	/* TODO: Remove this once lvmetad + cluster supported! */
-	if (find_config_tree_int(cmd, "global/locking_type", 1) == 3 ||
-	    !find_config_tree_int(cmd, "global/use_lvmetad", 0)) {
+	if (find_config_tree_int(cmd, global_locking_type_CFG) == 3 ||
+	    !find_config_tree_bool(cmd, global_use_lvmetad_CFG)) {
 		log_debug_lvmetad("_pvscan_lvmetad: immediate return");
 		return ret;
 	}
diff --git a/tools/reporter.c b/tools/reporter.c
index 1c8e39d..3db8b83 100644
--- a/tools/reporter.c
+++ b/tools/reporter.c
@@ -234,20 +234,13 @@ static int _report(struct cmd_context *cmd, int argc, char **argv,
 	int columns_as_rows;
 	unsigned args_are_pvs;
 
-	aligned = find_config_tree_int(cmd, "report/aligned",
-				  DEFAULT_REP_ALIGNED);
-	buffered = find_config_tree_int(cmd, "report/buffered",
-				   DEFAULT_REP_BUFFERED);
-	headings = find_config_tree_int(cmd, "report/headings",
-				   DEFAULT_REP_HEADINGS);
-	separator = find_config_tree_str(cmd, "report/separator",
-				    DEFAULT_REP_SEPARATOR);
-	field_prefixes = find_config_tree_int(cmd, "report/prefixes",
-					      DEFAULT_REP_PREFIXES);
-	quoted = find_config_tree_int(cmd, "report/quoted",
-				     DEFAULT_REP_QUOTED);
-	columns_as_rows = find_config_tree_int(cmd, "report/columns_as_rows",
-					       DEFAULT_REP_COLUMNS_AS_ROWS);
+	aligned = find_config_tree_bool(cmd, report_aligned_CFG);
+	buffered = find_config_tree_bool(cmd, report_buffered_CFG);
+	headings = find_config_tree_bool(cmd, report_headings_CFG);
+	separator = find_config_tree_str(cmd, report_separator_CFG);
+	field_prefixes = find_config_tree_bool(cmd, report_prefixes_CFG);
+	quoted = find_config_tree_bool(cmd, report_quoted_CFG);
+	columns_as_rows = find_config_tree_bool(cmd, report_colums_as_rows_CFG);
 
 	args_are_pvs = (report_type == PVS ||
 			report_type == LABEL ||
@@ -255,65 +248,40 @@ static int _report(struct cmd_context *cmd, int argc, char **argv,
 
 	switch (report_type) {
 	case LVS:
-		keys = find_config_tree_str(cmd, "report/lvs_sort",
-				       DEFAULT_LVS_SORT);
+		keys = find_config_tree_str(cmd, report_lvs_sort_CFG);
 		if (!arg_count(cmd, verbose_ARG))
-			options = find_config_tree_str(cmd,
-						  "report/lvs_cols",
-						  DEFAULT_LVS_COLS);
+			options = find_config_tree_str(cmd, report_lvs_cols_CFG);
 		else
-			options = find_config_tree_str(cmd,
-						  "report/lvs_cols_verbose",
-						  DEFAULT_LVS_COLS_VERB);
+			options = find_config_tree_str(cmd, report_lvs_cols_verbose_CFG);
 		break;
 	case VGS:
-		keys = find_config_tree_str(cmd, "report/vgs_sort",
-				       DEFAULT_VGS_SORT);
+		keys = find_config_tree_str(cmd, report_vgs_sort_CFG);
 		if (!arg_count(cmd, verbose_ARG))
-			options = find_config_tree_str(cmd,
-						  "report/vgs_cols",
-						  DEFAULT_VGS_COLS);
+			options = find_config_tree_str(cmd, report_vgs_cols_CFG);
 		else
-			options = find_config_tree_str(cmd,
-						  "report/vgs_cols_verbose",
-						  DEFAULT_VGS_COLS_VERB);
+			options = find_config_tree_str(cmd, report_vgs_cols_verbose_CFG);
 		break;
 	case LABEL:
 	case PVS:
-		keys = find_config_tree_str(cmd, "report/pvs_sort",
-				       DEFAULT_PVS_SORT);
+		keys = find_config_tree_str(cmd, report_pvs_sort_CFG);
 		if (!arg_count(cmd, verbose_ARG))
-			options = find_config_tree_str(cmd,
-						  "report/pvs_cols",
-						  DEFAULT_PVS_COLS);
+			options = find_config_tree_str(cmd, report_pvs_cols_CFG);
 		else
-			options = find_config_tree_str(cmd,
-						  "report/pvs_cols_verbose",
-						  DEFAULT_PVS_COLS_VERB);
+			options = find_config_tree_str(cmd, report_pvs_cols_verbose_CFG);
 		break;
 	case SEGS:
-		keys = find_config_tree_str(cmd, "report/segs_sort",
-				       DEFAULT_SEGS_SORT);
+		keys = find_config_tree_str(cmd, report_segs_sort_CFG);
 		if (!arg_count(cmd, verbose_ARG))
-			options = find_config_tree_str(cmd,
-						  "report/segs_cols",
-						  DEFAULT_SEGS_COLS);
+			options = find_config_tree_str(cmd, report_segs_cols_CFG);
 		else
-			options = find_config_tree_str(cmd,
-						  "report/segs_cols_verbose",
-						  DEFAULT_SEGS_COLS_VERB);
+			options = find_config_tree_str(cmd, report_segs_cols_verbose_CFG);
 		break;
 	case PVSEGS:
-		keys = find_config_tree_str(cmd, "report/pvsegs_sort",
-				       DEFAULT_PVSEGS_SORT);
+		keys = find_config_tree_str(cmd, report_pvsegs_sort_CFG);
 		if (!arg_count(cmd, verbose_ARG))
-			options = find_config_tree_str(cmd,
-						  "report/pvsegs_cols",
-						  DEFAULT_PVSEGS_COLS);
+			options = find_config_tree_str(cmd, report_pvsegs_cols_CFG);
 		else
-			options = find_config_tree_str(cmd,
-						  "report/pvsegs_cols_verbose",
-						  DEFAULT_PVSEGS_COLS_VERB);
+			options = find_config_tree_str(cmd, report_pvsegs_cols_verbose_CFG);
 		break;
 	default:
 		log_error(INTERNAL_ERROR "Unknown report type.");
diff --git a/tools/toollib.c b/tools/toollib.c
index 7043ea4..6b00155 100644
--- a/tools/toollib.c
+++ b/tools/toollib.c
@@ -1290,9 +1290,7 @@ int vgcreate_params_set_from_args(struct cmd_context *cmd,
 		vp_new->vgmetadatacopies = arg_int_value(cmd, vgmetadatacopies_ARG,
 							DEFAULT_VGMETADATACOPIES);
 	} else {
-		vp_new->vgmetadatacopies = find_config_tree_int(cmd,
-						   "metadata/vgmetadatacopies",
-						   DEFAULT_VGMETADATACOPIES);
+		vp_new->vgmetadatacopies = find_config_tree_int(cmd, metadata_vgmetadatacopies_CFG);
 	}
 
 	return 1;
@@ -1426,17 +1424,12 @@ int pvcreate_params_validate(struct cmd_context *cmd,
 		return 0;
 	}
 
-	if (arg_count(cmd, metadataignore_ARG)) {
-		pp->metadataignore = !strcmp(arg_str_value(cmd,
-						metadataignore_ARG,
-						DEFAULT_PVMETADATAIGNORE_STR),
-					 "y");
-	} else {
-		pp->metadataignore = !strcmp(find_config_tree_str(cmd,
-					"metadata/pvmetadataignore",
-					DEFAULT_PVMETADATAIGNORE_STR),
-					"y");
-	}
+	if (arg_count(cmd, metadataignore_ARG))
+		pp->metadataignore = arg_int_value(cmd, metadataignore_ARG,
+						   DEFAULT_PVMETADATAIGNORE);
+	else
+		pp->metadataignore = find_config_tree_bool(cmd, metadata_pvmetadataignore_CFG);
+
 	if (arg_count(cmd, pvmetadatacopies_ARG) &&
 	    !arg_int_value(cmd, pvmetadatacopies_ARG, -1) &&
 	    pp->metadataignore) {
@@ -1496,15 +1489,11 @@ int pvcreate_params_validate(struct cmd_context *cmd,
 
 	pp->pvmetadatasize = arg_uint64_value(cmd, metadatasize_ARG, UINT64_C(0));
 	if (!pp->pvmetadatasize)
-		pp->pvmetadatasize = find_config_tree_int(cmd,
-						 "metadata/pvmetadatasize",
-						 DEFAULT_PVMETADATASIZE);
+		pp->pvmetadatasize = find_config_tree_int(cmd, metadata_pvmetadatasize_CFG);
 
 	pp->pvmetadatacopies = arg_int_value(cmd, pvmetadatacopies_ARG, -1);
 	if (pp->pvmetadatacopies < 0)
-		pp->pvmetadatacopies = find_config_tree_int(cmd,
-						   "metadata/pvmetadatacopies",
-						   DEFAULT_PVMETADATACOPIES);
+		pp->pvmetadatacopies = find_config_tree_int(cmd, metadata_pvmetadatacopies_CFG);
 
 	pp->rp.ea_size = arg_uint64_value(cmd, embeddingareasize_ARG, pp->rp.ea_size);
 
@@ -1528,8 +1517,7 @@ int get_activation_monitoring_mode(struct cmd_context *cmd,
 						 DEFAULT_DMEVENTD_MONITOR);
 	else if (is_static() || arg_count(cmd, ignoremonitoring_ARG) ||
 		 arg_count(cmd, sysinit_ARG) ||
-		 !find_config_tree_bool(cmd, "activation/monitoring",
-					DEFAULT_DMEVENTD_MONITOR))
+		 !find_config_tree_bool(cmd, activation_monitoring_CFG))
 		*monitoring_mode = DMEVENTD_MONITOR_IGNORE;
 
 	return 1;
@@ -1547,18 +1535,14 @@ int get_pool_params(struct cmd_context *cmd,
 		*zero = strcmp(arg_str_value(cmd, zero_ARG, "y"), "n");
 		log_very_verbose("Setting pool zeroing: %u", *zero);
 	} else
-		*zero = find_config_tree_int(cmd,
-					     "allocation/thin_pool_zero",
-					     DEFAULT_THIN_POOL_ZERO);
+		*zero = find_config_tree_bool(cmd, allocation_thin_pool_zero_CFG);
 
 	if (arg_count(cmd, discards_ARG)) {
 		*discards = (thin_discards_t) arg_uint_value(cmd, discards_ARG, 0);
 		log_very_verbose("Setting pool discards: %s",
 				 get_pool_discards_name(*discards));
 	} else {
-		dstr = find_config_tree_str(cmd,
-					    "allocation/thin_pool_discards",
-					    DEFAULT_THIN_POOL_DISCARDS);
+		dstr = find_config_tree_str(cmd, allocation_thin_pool_discards_CFG);
 		if (!get_pool_discards(dstr, discards))
 			return_0;
 	}
@@ -1573,9 +1557,7 @@ int get_pool_params(struct cmd_context *cmd,
 		log_very_verbose("Setting pool chunk size: %s",
 				 display_size(cmd, *chunk_size));
 	} else
-		*chunk_size = find_config_tree_int(cmd,
-						   "allocation/thin_pool_chunk_size",
-						   DEFAULT_THIN_POOL_CHUNK_SIZE) * 2;
+		*chunk_size = find_config_tree_int(cmd, allocation_thin_pool_chunk_size_CFG) * 2;
 
 	if ((*chunk_size < DM_THIN_MIN_DATA_BLOCK_SIZE) ||
 	    (*chunk_size > DM_THIN_MAX_DATA_BLOCK_SIZE)) {
@@ -1737,7 +1719,7 @@ static int _validate_stripe_params(struct cmd_context *cmd, uint32_t *stripes,
 	}
 
 	if (*stripes > 1 && !*stripe_size) {
-		*stripe_size = find_config_tree_int(cmd, "metadata/stripesize", DEFAULT_STRIPESIZE) * 2;
+		*stripe_size = find_config_tree_int(cmd, metadata_stripesize_CFG) * 2;
 		log_print_unless_silent("Using default stripesize %s",
 			  display_size(cmd, (uint64_t) *stripe_size));
 	}
diff --git a/tools/vgconvert.c b/tools/vgconvert.c
index 3671767..cdadd9a 100644
--- a/tools/vgconvert.c
+++ b/tools/vgconvert.c
@@ -51,16 +51,12 @@ static int vgconvert_single(struct cmd_context *cmd, const char *vg_name,
 						  UINT64_C(0));
 		if (!pvmetadatasize)
 			pvmetadatasize =
-			    find_config_tree_int(cmd,
-					    "metadata/pvmetadatasize",
-					    DEFAULT_PVMETADATASIZE);
+			    find_config_tree_int(cmd, metadata_pvmetadatasize_CFG);
 
 		pvmetadatacopies = arg_int_value(cmd, pvmetadatacopies_ARG, -1);
 		if (pvmetadatacopies < 0)
 			pvmetadatacopies =
-			    find_config_tree_int(cmd,
-					    "metadata/pvmetadatacopies",
-					     DEFAULT_PVMETADATACOPIES);
+			    find_config_tree_int(cmd, metadata_pvmetadatacopies_CFG);
 	}
 
 	if (cmd->fmt->features & FMT_EAS) {




More information about the lvm-devel mailing list