]> git.ipfire.org Git - thirdparty/e2fsprogs.git/commitdiff
libblkid: Optimize devicemapper support
authorTheodore Ts'o <tytso@mit.edu>
Tue, 26 Aug 2008 12:13:56 +0000 (08:13 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Wed, 27 Aug 2008 03:53:22 +0000 (23:53 -0400)
This commit works by removing all calls from libdevmapper altogether,
and using the standard support for "normal" non-dm devices.

It depends on dm devices being placed in /dev/mapper (but the previous
code had this dependency anyway), and /proc/partitions containing dm
devices.

We don't actually rip out the libdevmapper code in this commit, but
just disable it via #undef HAVE_DEVMAPPER, just so it's easier to
review and understand the fundamental code changes.  A subsequent
commit will remove the libdevmapper code, as well as unexport
the blkid_devdirs string array.

Thanks to Karel Zak for inspiring me to look at the dm code in blkid,
so I could realize how much it deserved to ripped out by its roots.  :-)

Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
debian/libblkid1.symbols
lib/blkid/blkidP.h
lib/blkid/devname.c
lib/blkid/devno.c

index a1d940813cd8c1e34d65a41770de2989abe161de..889331b1543f6f2bbc8b5f11b6716c46824523e5 100644 (file)
@@ -1,4 +1,5 @@
 libblkid.so.1 libblkid1 #MINVER#
+ blkid__scan_dir@Base 1.41.1-1
  blkid_debug_mask@Base 1.37-2sarge1
  blkid_dev_devname@Base 1.37-2sarge1
  blkid_dev_has_tag@Base 1.38-1
index dfe0eca0d405d1295326eeccb8fe95d30f3d67a4..9d1e459c98e479f7c2140b57a36935982fd9b8a9 100644 (file)
@@ -153,6 +153,13 @@ extern void blkid_debug_dump_dev(blkid_dev dev);
 extern void blkid_debug_dump_tag(blkid_tag tag);
 #endif
 
+/* devno.c */
+struct dir_list {
+       char    *name;
+       struct dir_list *next;
+};
+extern void blkid__scan_dir(char *, dev_t, struct dir_list **, char **);
+
 /* lseek.c */
 extern blkid_loff_t blkid_llseek(int fd, blkid_loff_t offset, int whence);
 
index 86fd44cb265de2822c370064a198bbfc225a4e6f..ec3cff3afc569725eda98ef7bfacf359b26f1aba 100644 (file)
@@ -38,6 +38,8 @@
 
 #include "blkidP.h"
 
+#undef HAVE_DEVMAPPER
+
 #ifdef HAVE_DEVMAPPER
 #include <libdevmapper.h>
 #endif
@@ -122,6 +124,9 @@ blkid_dev blkid_get_dev(blkid_cache cache, const char *devname, int flags)
 static int dm_device_is_leaf(const dev_t dev);
 #endif
 
+/* Directories where we will try to search for device names */
+static const char *dirlist[] = { "/dev", "/devfs", "/devices", NULL };
+
 /*
  * Probe a single block device to add to the device cache.
  */
@@ -159,7 +164,7 @@ static void probe_one(blkid_cache cache, const char *ptname,
         * the stat information doesn't check out, use blkid_devno_to_devname()
         * to find it via an exhaustive search for the device major/minor.
         */
-       for (dir = blkid_devdirs; *dir; dir++) {
+       for (dir = dirlist; *dir; dir++) {
                struct stat st;
                char device[256];
 
@@ -174,6 +179,9 @@ static void probe_one(blkid_cache cache, const char *ptname,
                        break;
                }
        }
+       /* Do a short-cut scan of /dev/mapper first */
+       if (!devname)
+               blkid__scan_dir("/dev/mapper", devno, 0, &devname);
        if (!devname) {
                devname = blkid_devno_to_devname(devno);
                if (!devname)
@@ -183,10 +191,14 @@ static void probe_one(blkid_cache cache, const char *ptname,
        free(devname);
 
 set_pri:
-       if (!pri && !strncmp(ptname, "md", 2))
-               pri = BLKID_PRI_MD;
-       if (dev)
-               dev->bid_pri = pri;
+       if (dev) {
+               if (pri)
+                       dev->bid_pri = pri;
+               else if (!strncmp(dev->bid_name, "/dev/mapper/", 11))
+                       dev->bid_pri = BLKID_PRI_DM;
+               else if (!strncmp(ptname, "md", 2))
+                       dev->bid_pri = BLKID_PRI_MD;
+       }
        return;
 }
 
index 61b34bfb5d43003d4f788a2ceb630cb374fce4c1..1962c8d4c0569b772f98c0f7ade0e3b8955f32c5 100644 (file)
 
 #include "blkidP.h"
 
-struct dir_list {
-       char    *name;
-       struct dir_list *next;
-};
-
 char *blkid_strndup(const char *s, int length)
 {
        char *ret;
@@ -95,8 +90,8 @@ static void free_dirlist(struct dir_list **list)
        *list = NULL;
 }
 
-static void scan_dir(char *dirname, dev_t devno, struct dir_list **list,
-                           char **devname)
+void blkid__scan_dir(char *dirname, dev_t devno, struct dir_list **list,
+                    char **devname)
 {
        DIR     *dir;
        struct dirent *dp;
@@ -127,7 +122,7 @@ static void scan_dir(char *dirname, dev_t devno, struct dir_list **list,
                                   path, *devname));
                        break;
                }
-               if (S_ISDIR(st.st_mode) && !lstat(path, &st) && 
+               if (list && S_ISDIR(st.st_mode) && !lstat(path, &st) && 
                    S_ISDIR(st.st_mode))
                        add_to_dirlist(path, list);
        }
@@ -161,7 +156,7 @@ char *blkid_devno_to_devname(dev_t devno)
 
                list = list->next;
                DBG(DEBUG_DEVNO, printf("directory %s\n", current->name));
-               scan_dir(current->name, devno, &new_list, &devname);
+               blkid__scan_dir(current->name, devno, &new_list, &devname);
                free(current->name);
                free(current);
                if (devname)