[Libguestfs] [PATCH libldm 07/12] refactoring: search for device-mapper node in tree.

Mykola Ivanets stenavin at gmail.com
Tue May 15 20:38:14 UTC 2018


Searching for device node in device mapper tree is used twice.  So let's
extract this functionality into a separate reusable function.
---
 src/ldm.c | 62 +++++++++++++++++++++++++++++++++++++++++--------------
 1 file changed, 46 insertions(+), 16 deletions(-)

diff --git a/src/ldm.c b/src/ldm.c
index 1be6736..ac6bae8 100644
--- a/src/ldm.c
+++ b/src/ldm.c
@@ -2446,7 +2446,7 @@ struct dm_target {
 };
 
 static struct dm_tree *
-_get_device_tree(GError **err)
+_dm_get_device_tree(GError **err)
 {
     struct dm_tree *tree;
     tree = dm_tree_create();
@@ -2501,6 +2501,42 @@ error:
     return NULL;
 }
 
+/* Returns TRUE if device with specified UUID is found or FALSE otherwise.
+ *
+ * Found device node is returned if dm_node is not NULL. In this case dm_tree
+ * MUST not be NULL as well. And the caller is responsible to free device tree
+ * by calling dm_tree_free function.
+ */
+gboolean
+_dm_find_tree_node_by_uuid(const gchar * const uuid,
+                                struct dm_tree_node ** dm_node,
+                                struct dm_tree ** dm_tree,
+                                GError ** const err)
+{
+    gboolean r = FALSE;
+
+    if (dm_node) {
+        g_assert(dm_tree != NULL);
+        *dm_node = NULL;
+    }
+    if (dm_tree) *dm_tree = NULL;
+
+    struct dm_tree *tree = _dm_get_device_tree(err);
+    if (tree) {
+        struct dm_tree_node *node = dm_tree_find_node_by_uuid(tree, uuid);
+        if (node) r = TRUE;
+
+        if (dm_tree)
+            *dm_tree = tree;
+        else
+            dm_tree_free(tree);
+
+        if (dm_node) *dm_node = node;
+    }
+
+    return r;
+}
+
 gboolean
 _dm_create(const gchar * const name, const gchar * const uuid,
            uint32_t udev_cookie, const guint n_targets,
@@ -3011,18 +3047,12 @@ ldm_volume_dm_create(const LDMVolume * const o, GString **created,
     dm_log_with_errno_init(_dm_log_fn);
 
     /* Check if the device already exists */
-    struct dm_tree *tree = _get_device_tree(err);
-    if (!tree) return FALSE;
-
     GString *uuid = _dm_vol_uuid(vol);
-    struct dm_tree_node *node = dm_tree_find_node_by_uuid(tree, uuid->str);
-    g_string_free(uuid, TRUE);
-
-    if (node) {
-        dm_tree_free(tree); tree = NULL;
+    if (_dm_find_tree_node_by_uuid(uuid->str, NULL, NULL, err)) {
+        g_string_free(uuid, TRUE);
         return TRUE;
     }
-    dm_tree_free(tree); tree = NULL;
+    g_string_free(uuid, TRUE);
 
     GString *name = NULL;
     switch (vol->type) {
@@ -3072,17 +3102,17 @@ ldm_volume_dm_remove(const LDMVolume * const o, GString **removed,
      * afterwards, but the API doesn't allow this. */
     dm_log_with_errno_init(_dm_log_fn);
 
-    struct dm_tree *tree = _get_device_tree(err);
-    if (!tree) return FALSE;
-
     gboolean r = FALSE;
 
+    struct dm_tree *tree = NULL;
+    struct dm_tree_node *node = NULL;
+
     GString *uuid = _dm_vol_uuid(vol);
-    struct dm_tree_node *node = dm_tree_find_node_by_uuid(tree, uuid->str);
+    gboolean found = _dm_find_tree_node_by_uuid(uuid->str, &node, &tree, err);
     g_string_free(uuid, TRUE);
 
     GString *name = NULL;
-    if (node) {
+    if (found) {
         uint32_t cookie;
         if (!dm_udev_create_cookie(&cookie)) {
             g_set_error(err, LDM_ERROR, LDM_ERROR_EXTERNAL,
@@ -3110,7 +3140,7 @@ ldm_volume_dm_remove(const LDMVolume * const o, GString **removed,
     r = TRUE;
 
 out:
-    dm_tree_free(tree);
+    if (tree) dm_tree_free(tree);
 
     if (removed)
         *removed = name;
-- 
2.17.0




More information about the Libguestfs mailing list