diff options
author | Theodore Ts'o <tytso@mit.edu> | 2008-08-26 08:13:56 -0400 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2008-08-26 23:53:22 -0400 |
commit | f4e89bcdf2870820ff262e3aed04cbb5374d7fdd (patch) | |
tree | 27ff73aadba70831e3c01f7a49863dabc6650c10 | |
parent | 5dd77dbe5a0ac6d78c1c6441fae4087be56d9088 (diff) | |
download | e2fsprogs-f4e89bcdf2870820ff262e3aed04cbb5374d7fdd.tar.gz |
libblkid: 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. :-)
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
-rw-r--r-- | debian/libblkid1.symbols | 1 | ||||
-rw-r--r-- | lib/blkid/blkidP.h | 7 | ||||
-rw-r--r-- | lib/blkid/devname.c | 22 | ||||
-rw-r--r-- | lib/blkid/devno.c | 13 |
4 files changed, 29 insertions, 14 deletions
diff --git a/debian/libblkid1.symbols b/debian/libblkid1.symbols index a1d94081..889331b1 100644 --- a/debian/libblkid1.symbols +++ b/debian/libblkid1.symbols @@ -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 diff --git a/lib/blkid/blkidP.h b/lib/blkid/blkidP.h index dfe0eca0..9d1e459c 100644 --- a/lib/blkid/blkidP.h +++ b/lib/blkid/blkidP.h @@ -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); diff --git a/lib/blkid/devname.c b/lib/blkid/devname.c index 86fd44cb..ec3cff3a 100644 --- a/lib/blkid/devname.c +++ b/lib/blkid/devname.c @@ -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; } diff --git a/lib/blkid/devno.c b/lib/blkid/devno.c index 61b34bfb..1962c8d4 100644 --- a/lib/blkid/devno.c +++ b/lib/blkid/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) |