blkid: use /sys/block/dm-<N>/dm/name

The Linux kernel (since 2.6.29, patch 784aae735d9b0bba3f8b9faef4c8b30df3bf0128)
exports the real DM device names in /sys/block/<ptname>/dm/name.

The sysfs based solution is nicer and faster than scan for devno in
/dev/mapper/.

CC: Milan Broz <mbroz@redhat.com>
Signed-off-by: Karel Zak <kzak@redhat.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
bitmap-optimize
Karel Zak 2009-04-27 15:00:58 +02:00 committed by Theodore Ts'o
parent 4271e23942
commit 46f3eeca59
1 changed files with 29 additions and 1 deletions

View File

@ -152,6 +152,30 @@ static int is_dm_leaf(const char *devname)
return ret;
}
/*
* Since 2.6.29 (patch 784aae735d9b0bba3f8b9faef4c8b30df3bf0128) kernel sysfs
* provides the real DM device names in /sys/block/<ptname>/dm/name
*/
static char *get_dm_name(const char *ptname)
{
FILE *f;
size_t sz;
char path[256], name[256], *res = NULL;
snprintf(path, sizeof(path), "/sys/block/%s/dm/name", ptname);
if ((f = fopen(path, "r")) == NULL)
return NULL;
/* read "<name>\n" from sysfs */
if (fgets(name, sizeof(name), f) && (sz = strlen(name)) > 1) {
name[sz - 1] = '\0';
snprintf(path, sizeof(path), "/dev/mapper/%s", name);
res = blkid_strdup(path);
}
fclose(f);
return res;
}
/*
* Probe a single block device to add to the device cache.
*/
@ -183,7 +207,9 @@ static void probe_one(blkid_cache cache, const char *ptname,
* to standard /dev/mapper/<name>.
*/
if (!strncmp(ptname, "dm-", 3) && isdigit(ptname[3])) {
blkid__scan_dir("/dev/mapper", devno, 0, &devname);
devname = get_dm_name(ptname);
if (!devname)
blkid__scan_dir("/dev/mapper", devno, 0, &devname);
if (devname)
goto get_dev;
}
@ -210,6 +236,8 @@ static void probe_one(blkid_cache cache, const char *ptname,
}
}
/* Do a short-cut scan of /dev/mapper first */
if (!devname)
devname = get_dm_name(ptname);
if (!devname)
blkid__scan_dir("/dev/mapper", devno, 0, &devname);
if (!devname) {