diff options
author | David Teigland <teigland@redhat.com> | 2018-08-17 15:45:52 -0500 |
---|---|---|
committer | David Teigland <teigland@redhat.com> | 2018-11-06 13:44:54 -0600 |
commit | cac4a9743acb826d785c0e51e9a752d8959ced80 (patch) | |
tree | 2ada17ff904271acb359530aaae015e214287758 /device_mapper/libdm-deptree.c | |
parent | 8c9d9a744605e37799a2475932ae7dfd43831d08 (diff) | |
download | lvm2-cac4a9743acb826d785c0e51e9a752d8959ced80.tar.gz |
Allow dm-cache cache device to be standard LV
If a single, standard LV is specified as the cache, use
it directly instead of converting it into a cache-pool
object with two separate LVs (for data and metadata).
With a single LV as the cache, lvm will use blocks at the
beginning for metadata, and the rest for data. Separate
dm linear devices are set up to point at the metadata and
data areas of the LV. These dm devs are given to the
dm-cache target to use.
The single LV cache cannot be resized without recreating it.
If the --poolmetadata option is used to specify an LV for
metadata, then a cache pool will be created (with separate
LVs for data and metadata.)
Usage:
$ lvcreate -n main -L 128M vg /dev/loop0
$ lvcreate -n fast -L 64M vg /dev/loop1
$ lvs -a vg
LV VG Attr LSize Type Devices
main vg -wi-a----- 128.00m linear /dev/loop0(0)
fast vg -wi-a----- 64.00m linear /dev/loop1(0)
$ lvconvert --type cache --cachepool fast vg/main
$ lvs -a vg
LV VG Attr LSize Origin Pool Type Devices
[fast] vg Cwi---C--- 64.00m linear /dev/loop1(0)
main vg Cwi---C--- 128.00m [main_corig] [fast] cache main_corig(0)
[main_corig] vg owi---C--- 128.00m linear /dev/loop0(0)
$ lvchange -ay vg/main
$ dmsetup ls
vg-fast_cdata (253:4)
vg-fast_cmeta (253:5)
vg-main_corig (253:6)
vg-main (253:24)
vg-fast (253:3)
$ dmsetup table
vg-fast_cdata: 0 98304 linear 253:3 32768
vg-fast_cmeta: 0 32768 linear 253:3 0
vg-main_corig: 0 262144 linear 7:0 2048
vg-main: 0 262144 cache 253:5 253:4 253:6 128 2 metadata2 writethrough mq 0
vg-fast: 0 131072 linear 7:1 2048
$ lvchange -an vg/min
$ lvconvert --splitcache vg/main
$ lvs -a vg
LV VG Attr LSize Type Devices
fast vg -wi------- 64.00m linear /dev/loop1(0)
main vg -wi------- 128.00m linear /dev/loop0(0)
Diffstat (limited to 'device_mapper/libdm-deptree.c')
-rw-r--r-- | device_mapper/libdm-deptree.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/device_mapper/libdm-deptree.c b/device_mapper/libdm-deptree.c index 5d035456e..13239c7ba 100644 --- a/device_mapper/libdm-deptree.c +++ b/device_mapper/libdm-deptree.c @@ -189,6 +189,11 @@ struct load_segment { uint32_t min_recovery_rate; /* raid kB/sec/disk */ uint32_t data_copies; /* raid10 data_copies */ + uint64_t metadata_start; /* Cache */ + uint64_t metadata_len; /* Cache */ + uint64_t data_start; /* Cache */ + uint64_t data_len; /* Cache */ + struct dm_tree_node *metadata; /* Thin_pool + Cache */ struct dm_tree_node *pool; /* Thin_pool, Thin */ struct dm_tree_node *external; /* Thin */ @@ -3473,6 +3478,10 @@ int dm_tree_node_add_cache_target(struct dm_tree_node *node, const char *origin_uuid, const char *policy_name, const struct dm_config_node *policy_settings, + uint64_t metadata_start, + uint64_t metadata_len, + uint64_t data_start, + uint64_t data_len, uint32_t data_block_size) { struct dm_config_node *cn; @@ -3548,6 +3557,10 @@ int dm_tree_node_add_cache_target(struct dm_tree_node *node, if (!_link_tree_nodes(node, seg->origin)) return_0; + seg->metadata_start = metadata_start; + seg->metadata_len = metadata_len; + seg->data_start = data_start; + seg->data_len = data_len; seg->data_block_size = data_block_size; seg->flags = feature_flags; seg->policy_name = policy_name; @@ -4026,7 +4039,7 @@ int dm_tree_node_add_cache_target_base(struct dm_tree_node *node, return dm_tree_node_add_cache_target(node, size, feature_flags & _mask, metadata_uuid, data_uuid, origin_uuid, - policy_name, policy_settings, data_block_size); + policy_name, policy_settings, 0, 0, 0, 0, data_block_size); } #endif |