From: Theodore Ts'o Date: Mon, 8 Dec 2008 13:28:35 +0000 (+0100) Subject: blkid: Optimize devicemapper support X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=241b6cf3ea32ee003d205085c4d229df7b30b8ce;p=util-linux blkid: Optimize devicemapper support 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" Signed-off-by: Karel Zak --- diff --git a/libs/blkid/src/blkidP.h b/libs/blkid/src/blkidP.h index 6ae046e0..3c55a5b0 100644 --- a/libs/blkid/src/blkidP.h +++ b/libs/blkid/src/blkidP.h @@ -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); diff --git a/libs/blkid/src/devname.c b/libs/blkid/src/devname.c index 106c743c..79c34135 100644 --- a/libs/blkid/src/devname.c +++ b/libs/blkid/src/devname.c @@ -38,6 +38,8 @@ #include "blkidP.h" +#undef HAVE_DEVMAPPER + #ifdef HAVE_DEVMAPPER #include #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; } diff --git a/libs/blkid/src/devno.c b/libs/blkid/src/devno.c index 259ec93c..9aec187d 100644 --- a/libs/blkid/src/devno.c +++ b/libs/blkid/src/devno.c @@ -33,11 +33,6 @@ #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)