1
0
mirror of git://sourceware.org/git/lvm2.git synced 2025-01-05 13:18:20 +03:00

libdm: enhance mounted fs detection

btrfs is using fake major:minor device numbers.
try to be smarter and detect used node via DM device name.

This shortens delays, where i.e. lvm2 is asked to deactivate
volume with mounted btrfs as such operation is not retryed
and user is informed about device being in use.
This commit is contained in:
Zdenek Kabelac 2018-03-20 11:13:22 +01:00
parent 8c02cc9e8f
commit 30975a3328
2 changed files with 31 additions and 0 deletions

View File

@ -1,5 +1,6 @@
Version 1.02.147 -
=====================================
Recognize also mounted btrfs through dm_device_has_mounted_fs().
Add missing log_error() into dm_stats_populate() returning 0.
Avoid calling dm_stats_populat() for DM devices without any stats regions.
Support DM_DEBUG_WITH_LINE_NUMBERS envvar for debug msg with source:line.

View File

@ -1742,6 +1742,10 @@ static int _mountinfo_parse_line(const char *line, unsigned *maj, unsigned *min,
{
char root[PATH_MAX + 1]; /* sscanf needs extra '\0' */
char target[PATH_MAX + 1];
char *devmapper;
struct dm_task *dmt;
struct dm_info info;
unsigned i;
/* TODO: maybe detect availability of %ms glib support ? */
if (sscanf(line, "%*u %*u %u:%u %" DM_TO_STRING(PATH_MAX)
@ -1751,6 +1755,32 @@ static int _mountinfo_parse_line(const char *line, unsigned *maj, unsigned *min,
return 0;
}
/* btrfs fakes device numbers, but there is still /dev/mapper name
* placed in mountinfo, so try to detect proper major:minor via this */
if (*maj == 0 && (devmapper = strstr(line, "/dev/mapper/"))) {
if (!(dmt = dm_task_create(DM_DEVICE_INFO))) {
log_error("Mount info task creation failed.");
return 0;
}
devmapper += 12; /* skip fixed prefix */
for (i = 0; devmapper[i] && devmapper[i] != ' ' && i < sizeof(root); ++i)
root[i] = devmapper[i];
root[i] = 0;
_unmangle_mountinfo_string(root, buf);
buf[DM_NAME_LEN] = 0; /* cut away */
if (dm_task_set_name(dmt, buf) &&
dm_task_no_open_count(dmt) &&
dm_task_run(dmt) &&
dm_task_get_info(dmt, &info)) {
log_debug("Replacing mountinfo device (%u:%u) with matching DM device %s (%u:%u).",
*maj, *min, buf, info.major, info.minor);
*maj = info.major;
*min = info.minor;
}
dm_task_destroy(dmt);
}
_unmangle_mountinfo_string(target, buf);
return 1;