mirror of https://github.com/vitalif/e2fsprogs
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
parent
5dd77dbe5a
commit
f4e89bcdf2
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue