summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZdenek Kabelac <zkabelac@redhat.com>2023-01-30 14:31:04 +0100
committerZdenek Kabelac <zkabelac@redhat.com>2023-02-01 11:47:47 +0100
commit85aa236946d3c290c7fab2c6229684ed268b1670 (patch)
tree31234247f93a60cc642a5a16f7a58bb786fd72d4
parentf89c369a0119a701a5a550694258a145202ab4a2 (diff)
downloadlvm2-85aa236946d3c290c7fab2c6229684ed268b1670.tar.gz
device_mapper: reduce unnecessary looping passed
While looping through the list of nodes, check if there is higher priority present and another iteration is still needed.
-rw-r--r--device_mapper/libdm-deptree.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/device_mapper/libdm-deptree.c b/device_mapper/libdm-deptree.c
index c6cc8de56..6a7fd08ee 100644
--- a/device_mapper/libdm-deptree.c
+++ b/device_mapper/libdm-deptree.c
@@ -2040,7 +2040,7 @@ int dm_tree_activate_children(struct dm_tree_node *dnode,
struct dm_tree_node *child = dnode;
const char *name;
const char *uuid;
- int priority;
+ int priority, next_priority;
/* Activate children first */
while ((child = dm_tree_next_child(&handle, dnode, 0))) {
@@ -2058,12 +2058,16 @@ int dm_tree_activate_children(struct dm_tree_node *dnode,
}
handle = NULL;
-
for (priority = 0; priority < 3; priority++) {
awaiting_peer_rename = 0;
+ next_priority = 0;
while ((child = dm_tree_next_child(&handle, dnode, 0))) {
- if (priority != child->activation_priority)
+ if (priority != child->activation_priority) {
+ if ((next_priority < child->activation_priority) &&
+ (child->activation_priority > priority))
+ next_priority = child->activation_priority;
continue;
+ }
if (!(uuid = dm_tree_node_get_uuid(child))) {
stack;
@@ -2121,6 +2125,8 @@ int dm_tree_activate_children(struct dm_tree_node *dnode,
}
if (awaiting_peer_rename)
priority--; /* redo priority level */
+ else if (!next_priority)
+ break; /* no more work, higher priority was not found in the chain */
}
return r;