]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
RFC: Canonicalize block device paths
authorDavid Allan <dallan@redhat.com>
Thu, 8 Jul 2010 22:04:26 +0000 (18:04 -0400)
committerDavid Allan <dallan@redhat.com>
Thu, 15 Jul 2010 16:57:01 +0000 (12:57 -0400)
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
src/storage/parthelper.c

index ece18a65db4081de8e1ef877dd03c2b626d2cab8..c8fad28fbcbb85f8865a82f756eead896e982bb7 100644 (file)
@@ -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)
index ca74456b76289d27eab4c0615a3ae9cced550f82..2a70250115990611408eb5fbad95917f085a1977 100644 (file)
 #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',