]> sourceware.org Git - lvm2.git/blobdiff - libdm/libdm-deptree.c
indicate when deptree detects but ignores size change in debug msg
[lvm2.git] / libdm / libdm-deptree.c
index 657715098a46f73b0e59a3c896bd78b81de91339..fbc73271f37c9f613d413def75acbde88d301053 100644 (file)
@@ -1590,16 +1590,15 @@ static int _dm_tree_deactivate_children(struct dm_tree_node *dnode,
 
                if (child->callback &&
                    !child->callback(child, DM_NODE_CALLBACK_DEACTIVATED,
-                                    child->callback_data)) {
-                       r = 0;
-                       // FIXME: break tree shutdown or continue?
-                       // hmm what about _node_clear_table()?
-               }
+                                    child->callback_data))
+                       stack;
+                       // FIXME: We need to let lvremove pass,
+                       // so for now deactivation ignores check result
+                       //r = 0; // FIXME: _node_clear_table() without callback ?
 
-               if (dm_tree_node_num_children(child, 0)) {
-                       if (!_dm_tree_deactivate_children(child, uuid_prefix, uuid_prefix_len, level + 1))
-                               return_0;
-               }
+               if (dm_tree_node_num_children(child, 0) &&
+                   !_dm_tree_deactivate_children(child, uuid_prefix, uuid_prefix_len, level + 1))
+                       return_0;
        }
 
        return r;
@@ -2365,9 +2364,6 @@ static int _load_node(struct dm_tree_node *dnode)
                existing_table_size = dm_task_get_existing_table_size(dmt);
                if ((dnode->props.size_changed =
                     (existing_table_size == seg_start) ? 0 : 1)) {
-                       log_debug("Table size changed from %" PRIu64 " to %"
-                                 PRIu64 " for %s", existing_table_size,
-                                 seg_start, dnode->name);
                        /*
                         * Kernel usually skips size validation on zero-length devices
                         * now so no need to preload them.
@@ -2375,6 +2371,11 @@ static int _load_node(struct dm_tree_node *dnode)
                        /* FIXME In which kernel version did this begin? */
                        if (!existing_table_size && dnode->props.delay_resume_if_new)
                                dnode->props.size_changed = 0;
+
+                       log_debug("Table size changed from %" PRIu64 " to %"
+                                 PRIu64 " for %s.%s", existing_table_size,
+                                 seg_start, dnode->name,
+                                 dnode->props.size_changed ? "" : " (Ignoring.)");
                }
        }
 
@@ -2968,7 +2969,15 @@ int dm_tree_node_add_thin_pool_target(struct dm_tree_node *node,
                                      uint64_t low_water_mark,
                                      unsigned skip_block_zeroing)
 {
-       struct load_segment *seg;
+       struct load_segment *seg, *mseg;
+       uint64_t devsize = 0;
+       /*
+        * Max supported size for thin pool  metadata device
+        * Limitation is hardcoded into kernel and bigger
+        * device size is not accepted. (16978542592)
+        */
+       const uint64_t max_metadata_size =
+               255ULL * (1 << 14) * (4096 / (1 << 9)) - 256 * 1024;
 
        if (data_block_size < DM_THIN_MIN_DATA_BLOCK_SIZE) {
                log_error("Data block size %u is lower then %u sectors.",
@@ -2993,6 +3002,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 > max_metadata_size) {
+                       log_debug("Ignoring %" PRIu64 " of device.",
+                                 devsize - max_metadata_size);
+                       mseg->size -= (devsize - max_metadata_size);
+                       devsize = 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);
                return 0;
This page took 0.025207 seconds and 5 git commands to generate.