Devices associated with btrfs volumes are not reverse-translated
(e.g., btrfsvol:/dev/sdX to sdY).

Forward translation occurs, creating a path mismatch.  This causes
errors in subsequent btrfs commands.

Thanks: Arye Yurkovsky
---
 daemon/device-name-translation.c | 36 ++++++++++++++++++++++++++++++++
 1 file changed, 36 insertions(+)

diff --git a/daemon/device-name-translation.c b/daemon/device-name-translation.c
index cfebc6495..74b8b686e 100644
--- a/daemon/device-name-translation.c
+++ b/daemon/device-name-translation.c
@@ -248,12 +248,17 @@ device_name_translation (const char *device)
   return NULL;
 }
 
+static char *reverse_btrfsvol (const char *device);
+
 char *
 reverse_device_name_translation (const char *device)
 {
   char *ret = NULL;
   size_t i;
 
+  if (STRPREFIX (device, "btrfsvol:"))
+    return reverse_btrfsvol (device);
+
   /* Look it up in the cache, and if found return the canonical name.
    * If not found return a copy of the original string.
    */
@@ -287,3 +292,34 @@ reverse_device_name_translation (const char *device)
 
   return ret;
 }
+
+/* btrfsvol:/dev/sdX also needs reversing. */
+static char *
+reverse_btrfsvol (const char *device)
+{
+  const char prefix[] = "btrfsvol:";
+  const char *device_start, *device_end;
+  CLEANUP_FREE char *device_name = NULL;
+  CLEANUP_FREE char *reversed_device = NULL;
+  char *ret;
+
+  device_start = device + strlen (prefix);
+  device_end = strchr (device_start + strlen ("/dev/"), '/');
+  device_name = strndup (device_start, device_end - device_start);
+  if (device_name == NULL) {
+    reply_with_perror ("strndup");
+    return NULL;
+  }
+
+  reversed_device = reverse_device_name_translation (device_name);
+  if (reversed_device == NULL)
+    return NULL;
+
+  /* Construct the final btrfsvol: and return it, caller frees. */
+  if (asprintf (&ret, "%s%s%s", prefix, reversed_device, device_end) == -1) {
+    reply_with_perror ("asprintf");
+    return NULL;
+  }
+
+  return ret;
+}
-- 
2.51.1
_______________________________________________
Libguestfs mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to