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>
bitmap-optimize
Theodore Ts'o 2008-08-26 08:13:56 -04:00
parent 5dd77dbe5a
commit f4e89bcdf2
4 changed files with 29 additions and 14 deletions

View 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

View 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);

View 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;
}

View File

@ -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)