[PATCH 1/1] RFC: Canonicalize block device paths

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



There are many naming conventions for partitions associated with a
block device.  Some of the major ones are:

/dev/foo -> /dev/foo1
/dev/foo1 -> /dev/foo1p1
/dev/mapper/foo -> /dev/mapper/foop1
/dev/disk/by-path/foo -> /dev/disk/by-path/foo-part1

The universe of possible conventions isn't clear.  Rather than trying
to understand all possible conventions, this patch divides devices
into two groups, device mapper devices and everything else.  Device
mapper devices seem always to follow the convention of device ->
devicep1; everything else is canonicalized.
---
 src/Makefile.am          |    9 +++++++--
 src/storage/parthelper.c |   35 +++++++++++++++++++++++++++++++++--
 2 files changed, 40 insertions(+), 4 deletions(-)

diff --git a/src/Makefile.am b/src/Makefile.am
index ece18a6..c8fad28 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1037,8 +1037,13 @@ libexec_PROGRAMS += libvirt_parthelper

 libvirt_parthelper_SOURCES = $(STORAGE_HELPER_DISK_SOURCES)
 libvirt_parthelper_LDFLAGS = $(WARN_LDFLAGS) $(COVERAGE_LDFLAGS)
-libvirt_parthelper_LDADD = $(LIBPARTED_LIBS) ../gnulib/lib/libgnu.la
-libvirt_parthelper_CFLAGS = $(LIBPARTED_CFLAGS)
+libvirt_parthelper_LDADD =		\
+		$(LIBPARTED_LIBS)	\
+		$(DEVMAPPER_LIBS)	\
+		libvirt_util.la		\
+		../gnulib/lib/libgnu.la
+
+libvirt_parthelper_CFLAGS = $(LIBPARTED_CFLAGS) $(DEVMAPPER_CFLAGS)
 endif
 endif
 EXTRA_DIST += $(STORAGE_HELPER_DISK_SOURCES)
diff --git a/src/storage/parthelper.c b/src/storage/parthelper.c
index ca74456..2a70250 100644
--- a/src/storage/parthelper.c
+++ b/src/storage/parthelper.c
@@ -35,7 +35,12 @@
 #include <parted/parted.h>
 #include <stdio.h>
 #include <string.h>
+#include <libdevmapper.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>

+#include "util.h"
 #include "c-ctype.h"

 /* we don't need to include the full internal.h just for this */
@@ -52,6 +57,18 @@ enum diskCommand {
     DISK_GEOMETRY
 };

+static int
+is_dm_device(const char *devname)
+{
+    struct stat buf;
+
+    if (devname && !stat(devname, &buf) && dm_is_dm_major(major(buf.st_rdev))) {
+        return 1;
+    }
+
+    return 0;
+}
+
 int main(int argc, char **argv)
 {
     PedDevice *dev;
@@ -59,6 +76,7 @@ int main(int argc, char **argv)
     PedPartition *part;
     int cmd = DISK_LAYOUT;
     const char *path;
+    char *canonical_path;
     const char *partsep;

     if (argc == 3 && STREQ(argv[2], "-g")) {
@@ -69,7 +87,20 @@ int main(int argc, char **argv)
     }

     path = argv[1];
-    partsep = *path && c_isdigit(path[strlen(path)-1]) ? "p" : "";
+    if (is_dm_device(path)) {
+        partsep = "p";
+        canonical_path = strdup(path);
+        if (canonical_path == NULL) {
+            return 2;
+        }
+    } else {
+        if (virFileResolveLink(path, &canonical_path) != 0) {
+            return 2;
+        }
+
+        partsep = *canonical_path &&
+            c_isdigit(canonical_path[strlen(canonical_path)-1]) ? "p" : "";
+    }

     if ((dev = ped_device_get(path)) == NULL) {
         fprintf(stderr, "unable to access device %s\n", path);
@@ -125,7 +156,7 @@ int main(int argc, char **argv)
          */
         if (part->num != -1) {
             printf("%s%s%d%c%s%c%s%c%llu%c%llu%c%llu%c",
-                   path, partsep,
+                   canonical_path, partsep,
                    part->num, '\0',
                    type, '\0',
                    content, '\0',
-- 
1.7.1.1

--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list


[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]