summaryrefslogtreecommitdiff
path: root/libdm
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 /libdm
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.
Diffstat (limited to 'libdm')
-rw-r--r--libdm/libdm-deptree.c36
1 files changed, 21 insertions, 15 deletions
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 */