From 6d7f7d50071867f01df6181901b8f2f3fa194d14 Mon Sep 17 00:00:00 2001 From: "Richard W.M. Jones" Date: Wed, 3 Dec 2025 11:15:39 +0000 Subject: [PATCH] daemon/device-name-translation.c: Fix btrfs volume reverse translation 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 | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/daemon/device-name-translation.c b/daemon/device-name-translation.c index cfebc6495..28fd5fc4b 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,30 @@ 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); + + 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