bc52b7cb0c
Resolves: #2212295 #2208039 #2204467
103 lines
3.3 KiB
Diff
103 lines
3.3 KiB
Diff
From e96cdaca1d2fec1d225ff09ef81f66edd7df7513 Mon Sep 17 00:00:00 2001
|
|
From: David Teigland <teigland@redhat.com>
|
|
Date: Fri, 16 Jun 2023 12:06:40 -0500
|
|
Subject: [PATCH 09/14] lvresize: fix multiple mounts
|
|
|
|
which was mistaken as a mounted LV that had been renamed.
|
|
|
|
(cherry picked from commit 7c3eca833ff7878d6d32198ed76380c91fdc15fc)
|
|
---
|
|
lib/device/filesystem.c | 47 +++++++++++++++++++++--------------------
|
|
1 file changed, 24 insertions(+), 23 deletions(-)
|
|
|
|
diff --git a/lib/device/filesystem.c b/lib/device/filesystem.c
|
|
index 2163276ed..bca29747a 100644
|
|
--- a/lib/device/filesystem.c
|
|
+++ b/lib/device/filesystem.c
|
|
@@ -243,8 +243,6 @@ int fs_mount_state_is_misnamed(struct cmd_context *cmd, struct logical_volume *l
|
|
FILE *fme = NULL;
|
|
struct mntent *me;
|
|
int renamed = 0;
|
|
- int found_dir = 0;
|
|
- int found_dev = 0;
|
|
int dev_match, dir_match;
|
|
|
|
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);
|
|
|
|
+ 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
|
|
* 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))
|
|
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);
|
|
dev_match = !strcmp(dm_devpath, proc_devpath);
|
|
|
|
- if (dir_match)
|
|
- found_dir++;
|
|
- if (dev_match)
|
|
- found_dev++;
|
|
+ if (!dir_match && !dev_match)
|
|
+ continue;
|
|
+
|
|
+ if (dev_match && !dir_match) {
|
|
+ log_debug("LV %s mounted at %s also mounted at %s.",
|
|
+ dm_devpath, mtab_mntpath, proc_mntpath);
|
|
+ continue;
|
|
+ }
|
|
|
|
- if (dir_match != dev_match) {
|
|
+ if (!dev_match && dir_match) {
|
|
log_error("LV %s mounted at %s may have been renamed (from %s).",
|
|
dm_devpath, proc_mntpath, proc_devpath);
|
|
renamed = 1;
|
|
@@ -337,26 +354,10 @@ int fs_mount_state_is_misnamed(struct cmd_context *cmd, struct logical_volume *l
|
|
if (fclose(fp))
|
|
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) {
|
|
log_error("File system resizing not supported: fs utilities do not support renamed devices.");
|
|
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;
|
|
}
|
|
|
|
--
|
|
2.41.0
|
|
|