1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-12-21 13:34:40 +03:00

lvresize: fix multiple mounts

which was mistaken as a mounted LV that had been renamed.
This commit is contained in:
David Teigland 2023-06-16 12:06:40 -05:00
parent 228a8e8c1f
commit 7c3eca833f

View File

@ -243,8 +243,6 @@ int fs_mount_state_is_misnamed(struct cmd_context *cmd, struct logical_volume *l
FILE *fme = NULL; FILE *fme = NULL;
struct mntent *me; struct mntent *me;
int renamed = 0; int renamed = 0;
int found_dir = 0;
int found_dev = 0;
int dev_match, dir_match; int dev_match, dir_match;
if (stat(lv_path, &st_lv) < 0) { if (stat(lv_path, &st_lv) < 0) {
@ -281,6 +279,9 @@ int fs_mount_state_is_misnamed(struct cmd_context *cmd, struct logical_volume *l
} }
endmntent(fme); endmntent(fme);
if (mtab_mntpath[0])
log_debug("%s mtab mntpath %s", display_lvname(lv), mtab_mntpath);
/* /*
* In mtab dir path, replace each ascii space character with the * In mtab dir path, replace each ascii space character with the
* four characters \040 which is how /proc/mounts represents spaces. * four characters \040 which is how /proc/mounts represents spaces.
@ -319,15 +320,31 @@ int fs_mount_state_is_misnamed(struct cmd_context *cmd, struct logical_volume *l
if (strcmp(fstype, proc_fstype)) if (strcmp(fstype, proc_fstype))
continue; continue;
/*
* When an LV is mounted on two dirs, it appears in /proc/mounts twice as
* /dev/mapper/vg-lvol0 on /foo type xfs ...
* /dev/mapper/vg-lvol0 on /bar type xfs ...
* All entries match dm_devpath, one entry matches mntpath,
* and other entries don't match mntpath.
*
* When an LV is mounted on one dir, and is renamed from lvol0 to lvol1,
* it appears in /proc/mounts once as
* /dev/mapper/vg-lvol0 on /foo type xfs ...
*/
dir_match = !strcmp(mtab_mntpath, proc_mntpath); dir_match = !strcmp(mtab_mntpath, proc_mntpath);
dev_match = !strcmp(dm_devpath, proc_devpath); dev_match = !strcmp(dm_devpath, proc_devpath);
if (dir_match) if (!dir_match && !dev_match)
found_dir++; continue;
if (dev_match)
found_dev++;
if (dir_match != dev_match) { if (dev_match && !dir_match) {
log_debug("LV %s mounted at %s also mounted at %s.",
dm_devpath, mtab_mntpath, proc_mntpath);
continue;
}
if (!dev_match && dir_match) {
log_error("LV %s mounted at %s may have been renamed (from %s).", log_error("LV %s mounted at %s may have been renamed (from %s).",
dm_devpath, proc_mntpath, proc_devpath); dm_devpath, proc_mntpath, proc_devpath);
renamed = 1; renamed = 1;
@ -337,26 +354,10 @@ int fs_mount_state_is_misnamed(struct cmd_context *cmd, struct logical_volume *l
if (fclose(fp)) if (fclose(fp))
stack; stack;
/*
* Don't try resizing if:
* - different device names apppear for the mount point
* (LVs probably renamed while mounted), or
* - the mount point for the LV appears multiple times, or
* - the LV device is listed for multiple mounts.
*/
if (renamed) { if (renamed) {
log_error("File system resizing not supported: fs utilities do not support renamed devices."); log_error("File system resizing not supported: fs utilities do not support renamed devices.");
return 1; return 1;
} }
/* These two are likely detected as renamed, but include checks in case. */
if (found_dir > 1) {
log_error("File system resizing not supported: %s appears more than once in /proc/mounts.", mtab_mntpath);
return 1;
}
if (found_dev > 1) {
log_error("File system resizing not supported: %s appears more than once in /proc/mounts.", dm_devpath);
return 1;
}
return 0; return 0;
} }