summaryrefslogtreecommitdiff
path: root/lib/metadata/cache_manip.c
diff options
context:
space:
mode:
authorZdenek Kabelac <zkabelac@redhat.com>2018-03-19 10:23:48 +0100
committerZdenek Kabelac <zkabelac@redhat.com>2018-03-19 12:02:08 +0100
commit8d7ece126b96337326d026ab4edebe2db4333459 (patch)
tree4d228d1e3089667f7ca3e329d0e889749bf85b90 /lib/metadata/cache_manip.c
parent08487a30983bfa4b3c0a7bcd9060657b6c1803ae (diff)
downloadlvm2-8d7ece126b96337326d026ab4edebe2db4333459.tar.gz
cache: disallow to combine format 2 with mq
Only policy 'smq' is meant to be used with format version 2. Code used to let pass 'mq' policy also with format 2. But 'mq' is obsoloted wth smq and kernel currently matches it. But this is incompatible with older original mq logic - so disallow creation of this rather useless combination.
Diffstat (limited to 'lib/metadata/cache_manip.c')
-rw-r--r--lib/metadata/cache_manip.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/lib/metadata/cache_manip.c b/lib/metadata/cache_manip.c
index 5167760ea..2a54682e7 100644
--- a/lib/metadata/cache_manip.c
+++ b/lib/metadata/cache_manip.c
@@ -841,6 +841,18 @@ int cache_set_metadata_format(struct lv_segment *seg, cache_metadata_format_t fo
return 0;
}
+ /*
+ * If policy is unselected, but format 2 is selected, policy smq is enforced.
+ * ATM no other then smq policy is allowed to select format 2.
+ */
+ if (!seg->policy_name) {
+ if (format == CACHE_METADATA_FORMAT_2)
+ seg->policy_name = "smq";
+ } else if (strcmp(seg->policy_name, "smq")) {
+ seg->cache_metadata_format = CACHE_METADATA_FORMAT_1;
+ return 1;
+ }
+
/* Check if we need to search for configured cache metadata format */
if (format == CACHE_METADATA_FORMAT_UNSELECTED) {
if (seg->cache_metadata_format != CACHE_METADATA_FORMAT_UNSELECTED)
@@ -894,15 +906,15 @@ int cache_set_params(struct lv_segment *seg,
struct lv_segment *pool_seg;
struct cmd_context *cmd = seg->lv->vg->cmd;
- if (!cache_set_metadata_format(seg, format))
- return_0;
-
if (!cache_set_cache_mode(seg, mode))
return_0;
if (!cache_set_policy(seg, policy_name, policy_settings))
return_0;
+ if (!cache_set_metadata_format(seg, format))
+ return_0;
+
pool_seg = seg_is_cache(seg) ? first_seg(seg->pool_lv) : seg;
if (chunk_size) {