diff options
author | Zdenek Kabelac <zkabelac@redhat.com> | 2017-02-23 23:35:40 +0100 |
---|---|---|
committer | Zdenek Kabelac <zkabelac@redhat.com> | 2017-03-10 19:33:01 +0100 |
commit | bf79fb1a337b707ae6d44e42c7b43c62cfac2bdd (patch) | |
tree | 8531496177935cdbaba73b4207da9e56bedee27c /libdm | |
parent | edf5e43f9ad6bdd5f3066f92e12a7f3c60dd656a (diff) | |
download | lvm2-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.c | 36 |
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 */ |