diff options
author | Zdenek Kabelac <zkabelac@redhat.com> | 2023-01-30 14:31:04 +0100 |
---|---|---|
committer | Zdenek Kabelac <zkabelac@redhat.com> | 2023-02-01 11:47:47 +0100 |
commit | 85aa236946d3c290c7fab2c6229684ed268b1670 (patch) | |
tree | 31234247f93a60cc642a5a16f7a58bb786fd72d4 | |
parent | f89c369a0119a701a5a550694258a145202ab4a2 (diff) | |
download | lvm2-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.c | 12 |
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; |