summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZdenek Kabelac <zkabelac@redhat.com>2017-02-23 23:35:40 +0100
committerZdenek Kabelac <zkabelac@redhat.com>2017-03-10 19:33:01 +0100
commitbf79fb1a337b707ae6d44e42c7b43c62cfac2bdd (patch)
tree8531496177935cdbaba73b4207da9e56bedee27c
parentedf5e43f9ad6bdd5f3066f92e12a7f3c60dd656a (diff)
downloadlvm2-bf79fb1a337b707ae6d44e42c7b43c62cfac2bdd.tar.gz
libdm: better code to enforce writethrough
Better code to enforce writethrough caching for cleaner policy. Only check for cleaner when DM_CACHE_FEATURE_PASSTHROUGH or DM_CACHE_FEATURE_WRITEBACK is set.
-rw-r--r--WHATS_NEW_DM1
-rw-r--r--libdm/libdm-deptree.c36
2 files changed, 22 insertions, 15 deletions
diff --git a/WHATS_NEW_DM b/WHATS_NEW_DM
index bfa6d55bf..4056854d3 100644
--- a/WHATS_NEW_DM
+++ b/WHATS_NEW_DM
@@ -1,5 +1,6 @@
Version 1.02.138 -
=====================================
+ Improve code to handle mode mask for cache nodes.
Cache status check for passthrough also require trailing space.
Add extra memory page when limiting pthread stack size in dmeventd.
Avoids immediate resume when preloaded device is smaller.
diff --git a/libdm/libdm-deptree.c b/libdm/libdm-deptree.c
index a78fbcce9..5ec20a643 100644
--- a/libdm/libdm-deptree.c
+++ b/libdm/libdm-deptree.c
@@ -3398,19 +3398,26 @@ int dm_tree_node_add_cache_target(struct dm_tree_node *node,
{
struct dm_config_node *cn;
struct load_segment *seg;
-
- switch (feature_flags &
- (DM_CACHE_FEATURE_PASSTHROUGH |
- DM_CACHE_FEATURE_WRITETHROUGH |
- DM_CACHE_FEATURE_WRITEBACK)) {
- case DM_CACHE_FEATURE_PASSTHROUGH:
- case DM_CACHE_FEATURE_WRITETHROUGH:
- case DM_CACHE_FEATURE_WRITEBACK:
- break;
- default:
- log_error("Invalid cache's feature flag " FMTu64 ".",
- feature_flags);
- return 0;
+ static const uint64_t _modemask =
+ DM_CACHE_FEATURE_PASSTHROUGH |
+ DM_CACHE_FEATURE_WRITETHROUGH |
+ DM_CACHE_FEATURE_WRITEBACK;
+
+ switch (feature_flags & _modemask) {
+ case DM_CACHE_FEATURE_PASSTHROUGH:
+ case DM_CACHE_FEATURE_WRITEBACK:
+ if (strcmp(policy_name, "cleaner") == 0) {
+ /* Enforce writethrough mode for cleaner policy */
+ feature_flags = ~_modemask;
+ feature_flags |= DM_CACHE_FEATURE_WRITETHROUGH;
+ }
+ /* Fall through */
+ case DM_CACHE_FEATURE_WRITETHROUGH:
+ break;
+ default:
+ log_error("Invalid cache's feature flag " FMTu64 ".",
+ feature_flags);
+ return 0;
}
if (data_block_size < DM_CACHE_MIN_DATA_BLOCK_SIZE) {
@@ -3456,8 +3463,7 @@ int dm_tree_node_add_cache_target(struct dm_tree_node *node,
return_0;
seg->data_block_size = data_block_size;
- /* Enforce WriteThough mode for cleaner policy */
- seg->flags = (strcmp(policy_name, "cleaner") == 0) ? DM_CACHE_FEATURE_WRITETHROUGH : feature_flags;
+ seg->flags = feature_flags;
seg->policy_name = policy_name;
/* FIXME: better validation missing */