]> sourceware.org Git - lvm2.git/commitdiff
libdm: add dm_tree_node_add_thin_pool_target_v1
authorZdenek Kabelac <zkabelac@redhat.com>
Mon, 1 Feb 2021 13:06:31 +0000 (14:06 +0100)
committerZdenek Kabelac <zkabelac@redhat.com>
Mon, 1 Feb 2021 13:52:32 +0000 (14:52 +0100)
Supports thin-pool without crop.

WHATS_NEW_DM
libdm/.exported_symbols.DM_1_02_172 [new file with mode: 0644]
libdm/libdevmapper.h
libdm/libdm-deptree.c

index 80ce1572922046f4ac60aaa41e757a6efcadcdd3..ba0129a55a93b558bb687b3c8578b8009012c089 100644 (file)
@@ -1,5 +1,6 @@
 Version 1.02.177 - 
 ====================================
+  Add dm_tree_node_add_thin_pool_target_v1 with crop_metadata support.
 
 Version 1.02.175 - 08th January 2021
 ====================================
diff --git a/libdm/.exported_symbols.DM_1_02_172 b/libdm/.exported_symbols.DM_1_02_172
new file mode 100644 (file)
index 0000000..ed4cce7
--- /dev/null
@@ -0,0 +1 @@
+dm_tree_node_add_thin_pool_target_v1
index a61ffe17efedce97c79155f749805276dd9497bc..26d64bf4e7bfbd10666cc66a463be3522bbcd57f 100644 (file)
@@ -1968,10 +1968,10 @@ int dm_tree_node_add_replicator_dev_target(struct dm_tree_node *node,
 #define DM_THIN_MIN_DATA_BLOCK_SIZE (UINT32_C(128))
 #define DM_THIN_MAX_DATA_BLOCK_SIZE (UINT32_C(2097152))
 /*
- * Max supported size for thin pool  metadata device (17112760320 bytes)
- * Limitation is hardcoded into the kernel and bigger device size
- * is not accepted.
+ * Max supported size for thin pool metadata device (17045913600 bytes)
  * drivers/md/dm-thin-metadata.h THIN_METADATA_MAX_SECTORS
+ * But here DM_THIN_MAX_METADATA_SIZE got defined incorrectly
+ * Correct size is (UINT64_C(255) * ((1 << 14) - 64) * (4096 / (1 << 9)))
  */
 #define DM_THIN_MAX_METADATA_SIZE   (UINT64_C(255) * (1 << 14) * (4096 / (1 << 9)) - 256 * 1024)
 
@@ -1984,6 +1984,16 @@ int dm_tree_node_add_thin_pool_target(struct dm_tree_node *node,
                                      uint64_t low_water_mark,
                                      unsigned skip_block_zeroing);
 
+int dm_tree_node_add_thin_pool_target_v1(struct dm_tree_node *node,
+                                        uint64_t size,
+                                        uint64_t transaction_id,
+                                        const char *metadata_uuid,
+                                        const char *pool_uuid,
+                                        uint32_t data_block_size,
+                                        uint64_t low_water_mark,
+                                        unsigned skip_block_zeroing,
+                                        unsigned crop_metadata);
+
 /* Supported messages for thin provision target */
 typedef enum {
        DM_THIN_MESSAGE_CREATE_SNAP,            /* device_id, origin_id */
index f16db8568232f875a14755884fcd35e4aebafb18..336cbb69633e23cbf43c58c781411916fd627f06 100644 (file)
@@ -3502,6 +3502,24 @@ int dm_tree_node_add_thin_pool_target(struct dm_tree_node *node,
                                      uint32_t data_block_size,
                                      uint64_t low_water_mark,
                                      unsigned skip_block_zeroing)
+{
+       return dm_tree_node_add_thin_pool_target_v1(node, size, transaction_id,
+                                                   metadata_uuid, pool_uuid,
+                                                   data_block_size,
+                                                   low_water_mark,
+                                                   skip_block_zeroing,
+                                                   1);
+}
+
+int dm_tree_node_add_thin_pool_target_v1(struct dm_tree_node *node,
+                                        uint64_t size,
+                                        uint64_t transaction_id,
+                                        const char *metadata_uuid,
+                                        const char *pool_uuid,
+                                        uint32_t data_block_size,
+                                        uint64_t low_water_mark,
+                                        unsigned skip_block_zeroing,
+                                        unsigned crop_metadata)
 {
        struct load_segment *seg, *mseg;
        uint64_t devsize = 0;
@@ -3529,17 +3547,18 @@ int dm_tree_node_add_thin_pool_target(struct dm_tree_node *node,
        if (!_link_tree_nodes(node, seg->metadata))
                return_0;
 
-       /* FIXME: more complex target may need more tweaks */
-       dm_list_iterate_items(mseg, &seg->metadata->props.segs) {
-               devsize += mseg->size;
-               if (devsize > DM_THIN_MAX_METADATA_SIZE) {
-                       log_debug_activation("Ignoring %" PRIu64 " of device.",
-                                            devsize - DM_THIN_MAX_METADATA_SIZE);
-                       mseg->size -= (devsize - DM_THIN_MAX_METADATA_SIZE);
-                       devsize = DM_THIN_MAX_METADATA_SIZE;
-                       /* FIXME: drop remaining segs */
+       if (crop_metadata)
+               /* FIXME: more complex target may need more tweaks */
+               dm_list_iterate_items(mseg, &seg->metadata->props.segs) {
+                       devsize += mseg->size;
+                       if (devsize > DM_THIN_MAX_METADATA_SIZE) {
+                               log_debug_activation("Ignoring %" PRIu64 " of device.",
+                                                    devsize - DM_THIN_MAX_METADATA_SIZE);
+                               mseg->size -= (devsize - DM_THIN_MAX_METADATA_SIZE);
+                               devsize = DM_THIN_MAX_METADATA_SIZE;
+                               /* FIXME: drop remaining segs */
+                       }
                }
-       }
 
        if (!(seg->pool = dm_tree_find_node_by_uuid(node->dtree, pool_uuid))) {
                log_error("Missing pool uuid %s.", pool_uuid);
This page took 0.049815 seconds and 5 git commands to generate.