[lvm-devel] dev-peter-config-profiles - config: add override_config_tree_from_profile fn to add the profile to a configuration cascade
Peter Rajnoha
prajnoha at fedoraproject.org
Wed Jun 26 14:55:48 UTC 2013
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=99707bf75efc1afcad23739b907f2fd7e38d5c74
Commit: 99707bf75efc1afcad23739b907f2fd7e38d5c74
Parent: 070ffe7822089eefac9c4ed867ada0ee45634536
Author: Peter Rajnoha <prajnoha at redhat.com>
AuthorDate: Tue Jun 25 12:27:37 2013 +0200
Committer: Peter Rajnoha <prajnoha at redhat.com>
CommitterDate: Wed Jun 26 16:53:49 2013 +0200
config: add override_config_tree_from_profile fn to add the profile to a configuration cascade
When placing the profile in a configuration cascade, this sequence is
used exactly:
CONFIG_STRING -> CONFIG_PROFILE -> CONFIG_FILE/MERGED_FILES
So if the profile is used, it overloads the lvm.conf (and any
existing tag configs). However, if "--config" is used to define
a custom configuration on command line, this overloads even the
profile config!
---
lib/config/config.c | 32 +++++++++++++++++++++++++++++++-
lib/config/config.h | 1 +
tools/lvmcmdline.c | 4 ++++
3 files changed, 36 insertions(+), 1 deletions(-)
diff --git a/lib/config/config.c b/lib/config/config.c
index 177f373..a4c45b7 100644
--- a/lib/config/config.c
+++ b/lib/config/config.c
@@ -263,7 +263,7 @@ int override_config_tree_from_string(struct cmd_context *cmd,
/*
* Follow this sequence:
- * CONFIG_STRING -> CONFIG_FILE/CONFIG_MERGED_FILES
+ * CONFIG_STRING -> CONFIG_PROFILE -> CONFIG_FILE/CONFIG_MERGED_FILES
*/
if (cs->type == CONFIG_STRING) {
@@ -291,6 +291,36 @@ int override_config_tree_from_string(struct cmd_context *cmd,
return 1;
}
+int override_config_tree_from_profile(struct cmd_context *cmd,
+ struct profile *profile)
+{
+ struct dm_config_tree *cft = cmd->cft, *cft_string = NULL;
+ struct config_source *cs = dm_config_get_custom(cft);
+
+ /*
+ * Follow this sequence:
+ * CONFIG_STRING -> CONFIG_PROFILE -> CONFIG_FILE/CONFIG_MERGED_FILES
+ */
+
+ if (cs->type == CONFIG_STRING) {
+ cft_string = cft;
+ cft = cft->cascade;
+ cs = dm_config_get_custom(cft);
+ if (cs->type == CONFIG_PROFILE) {
+ log_error(INTERNAL_ERROR "override_config_tree_from_profile: "
+ "config cascade already contains a profile config.");
+ return 0;
+ }
+ dm_config_insert_cascaded_tree(cft_string, profile->cft);
+ }
+
+ cmd->cft = dm_config_insert_cascaded_tree(profile->cft, cft);
+
+ cmd->cft = cft_string ? : profile->cft;
+
+ return 1;
+}
+
int config_file_read_fd(struct dm_config_tree *cft, struct device *dev,
off_t offset, size_t size, off_t offset2, size_t size2,
checksum_fn_t checksum_fn, uint32_t checksum)
diff --git a/lib/config/config.h b/lib/config/config.h
index 93811fb..a09382e 100644
--- a/lib/config/config.h
+++ b/lib/config/config.h
@@ -132,6 +132,7 @@ int config_def_get_path(char *buf, size_t buf_size, int id);
int config_def_check(struct cmd_context *cmd, int force, int skip, int suppress_messages);
int override_config_tree_from_string(struct cmd_context *cmd, const char *config_settings);
+int override_config_tree_from_profile(struct cmd_context *cmd, struct profile *profile);
struct dm_config_tree *remove_config_tree_by_source(struct cmd_context *cmd, config_source_t source);
config_source_t config_get_source_type(struct dm_config_tree *cft);
diff --git a/tools/lvmcmdline.c b/tools/lvmcmdline.c
index 9bf3d93..e41fea6 100644
--- a/tools/lvmcmdline.c
+++ b/tools/lvmcmdline.c
@@ -1100,6 +1100,10 @@ int lvm_run_command(struct cmd_context *cmd, int argc, char **argv)
}
log_debug("Setting global configuration profile \"%s\".", profile->name);
cmd->profile_params->global_profile = profile;
+ if (!override_config_tree_from_profile(cmd, profile)) {
+ log_error("Failed to apply configuration profile.");
+ return ECMD_FAILED;
+ }
}
if ((ret = _get_settings(cmd)))
More information about the lvm-devel
mailing list