aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTheodore Ts'o <tytso@mit.edu>2008-08-26 08:13:56 -0400
committerTheodore Ts'o <tytso@mit.edu>2008-08-26 23:53:22 -0400
commitf4e89bcdf2870820ff262e3aed04cbb5374d7fdd (patch)
tree27ff73aadba70831e3c01f7a49863dabc6650c10
parent5dd77dbe5a0ac6d78c1c6441fae4087be56d9088 (diff)
downloade2fsprogs-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.symbols1
-rw-r--r--lib/blkid/blkidP.h7
-rw-r--r--lib/blkid/devname.c22
-rw-r--r--lib/blkid/devno.c13
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)