]> err.no Git - util-linux/commitdiff
blkid: Optimize devicemapper support
authorTheodore Ts'o <tytso@mit.edu>
Mon, 8 Dec 2008 13:28:35 +0000 (14:28 +0100)
committerKarel Zak <kzak@redhat.com>
Wed, 11 Feb 2009 22:21:49 +0000 (23:21 +0100)
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.  :-)

[kzak@redhat.com: port from e2fsprogs to util-linux-ng tree]

Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Signed-off-by: Karel Zak <kzak@redhat.com>
libs/blkid/src/blkidP.h
libs/blkid/src/devname.c
libs/blkid/src/devno.c

index 6ae046e003b93a3700aab8a3e35116a9654ae2b8..3c55a5b078b94f5cbda85723e79dfdf07bcf0ef0 100644 (file)
@@ -228,6 +228,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 106c743cdd0b46cf61c15bf05abc2b53ca57807c..79c34135ad71cf807dd352558cafbe00be9beed7 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 259ec93c53eb12ad7c807360e0152b48c8746e80..9aec187dce7e09ff7d70ad005dc2df96b44a2724 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)