177 lines
5.6 KiB
Diff
177 lines
5.6 KiB
Diff
From 9d9c8b8676b4fe21a0ff69e4c5d9e4a4a861f76e Mon Sep 17 00:00:00 2001
|
||
From: Peter Rajnoha <prajnoha@redhat.com>
|
||
Date: Fri, 3 Jan 2025 10:52:47 +0100
|
||
Subject: [PATCH 23/27] lv_manip: check fs resize is supported before LV
|
||
extension
|
||
MIME-Version: 1.0
|
||
Content-Type: text/plain; charset=UTF-8
|
||
Content-Transfer-Encoding: 8bit
|
||
|
||
This avoids a situation where we would extend an LV and then we would
|
||
not do anything to the FS on it because the FS info check failed for some
|
||
reason, like the type was not supported (e.g. swap) or we could not resize
|
||
the FS unless being in some supported state (e.g. XFS to be mounted for
|
||
the xfs_growfs to work).
|
||
|
||
Before this patch (LV resized, FS not resized):
|
||
|
||
❯ lvextend --fs resize -L+4M vg/swap
|
||
Size of logical volume vg/swap changed from 32.00 MiB (8 extents) to 36.00 MiB (9 extents).
|
||
File system extend is not supported (swap).
|
||
File system extend error.
|
||
Logical volume vg/swap successfully resized.
|
||
|
||
With this patch (LV not resized, FS not resized):
|
||
|
||
❯ lvextend --fs resize -L+4M vg/swap
|
||
File system extend is not supported (swap).
|
||
|
||
(cherry picked from commit 5f53ecda3600834e920eef14065d35cd0fb6c59b)
|
||
---
|
||
lib/metadata/lv_manip.c | 71 +++++++++++++++++++++--------------------
|
||
1 file changed, 36 insertions(+), 35 deletions(-)
|
||
|
||
diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c
|
||
index 15a7f3c9a..dab160234 100644
|
||
--- a/lib/metadata/lv_manip.c
|
||
+++ b/lib/metadata/lv_manip.c
|
||
@@ -6550,23 +6550,18 @@ static int _fs_reduce(struct cmd_context *cmd, struct logical_volume *lv,
|
||
return ret;
|
||
}
|
||
|
||
-static int _fs_extend(struct cmd_context *cmd, struct logical_volume *lv,
|
||
- struct lvresize_params *lp)
|
||
+static int _fs_extend_check_fsinfo(struct cmd_context *cmd, struct logical_volume *lv, struct lvresize_params *lp,
|
||
+ struct fs_info *fsinfo, uint64_t *newsize_bytes_fs)
|
||
{
|
||
- struct fs_info fsinfo;
|
||
uint64_t newsize_bytes_lv;
|
||
- uint64_t newsize_bytes_fs;
|
||
- int ret = 0;
|
||
|
||
- memset(&fsinfo, 0, sizeof(fsinfo));
|
||
+ memset(fsinfo, 0, sizeof(*fsinfo));
|
||
|
||
- if (!fs_get_info(cmd, lv, &fsinfo, 1))
|
||
- goto_out;
|
||
+ if (!fs_get_info(cmd, lv, fsinfo, 1))
|
||
+ return 0;
|
||
|
||
- if (fsinfo.nofs) {
|
||
- ret = 1;
|
||
- goto_out;
|
||
- }
|
||
+ if (fsinfo->nofs)
|
||
+ return 1;
|
||
|
||
/*
|
||
* Note: here in the case of extend, newsize_bytes_lv/newsize_bytes_fs
|
||
@@ -6577,40 +6572,43 @@ static int _fs_extend(struct cmd_context *cmd, struct logical_volume *lv,
|
||
|
||
/* extent_size units is SECTOR_SIZE (512) */
|
||
newsize_bytes_lv = (uint64_t) lp->extents * lv->vg->extent_size * SECTOR_SIZE;
|
||
- newsize_bytes_fs = newsize_bytes_lv;
|
||
- if (fsinfo.needs_crypt) {
|
||
- newsize_bytes_fs -= fsinfo.crypt_offset_bytes;
|
||
+ *newsize_bytes_fs = newsize_bytes_lv;
|
||
+ if (fsinfo->needs_crypt) {
|
||
+ *newsize_bytes_fs -= fsinfo->crypt_offset_bytes;
|
||
log_print_unless_silent("File system size %llub is adjusted for crypt data offset %ub.",
|
||
- (unsigned long long)newsize_bytes_fs, fsinfo.crypt_offset_bytes);
|
||
+ (unsigned long long)*newsize_bytes_fs, fsinfo->crypt_offset_bytes);
|
||
}
|
||
|
||
/*
|
||
* Decide if fs should be extended based on the --fs option,
|
||
* the fs type and the mount state.
|
||
*/
|
||
- if (!_fs_extend_allow(cmd, lv, lp, &fsinfo))
|
||
- goto_out;
|
||
+ if (!_fs_extend_allow(cmd, lv, lp, fsinfo))
|
||
+ return 0;
|
||
+
|
||
+ return 1;
|
||
+}
|
||
|
||
+static int _fs_extend(struct cmd_context *cmd, struct logical_volume *lv,
|
||
+ struct lvresize_params *lp, struct fs_info *fsinfo, uint64_t newsize_bytes_fs)
|
||
+{
|
||
/*
|
||
* fs extend is not needed
|
||
*/
|
||
- if (!fsinfo.needs_extend) {
|
||
- ret = 1;
|
||
- goto_out;
|
||
- }
|
||
+ if (!fsinfo->needs_extend)
|
||
+ return 1;
|
||
|
||
if (test_mode()) {
|
||
- if (fsinfo.needs_unmount)
|
||
+ if (fsinfo->needs_unmount)
|
||
log_print_unless_silent("Skip unmount in test mode.");
|
||
- if (fsinfo.needs_fsck)
|
||
+ if (fsinfo->needs_fsck)
|
||
log_print_unless_silent("Skip fsck in test mode.");
|
||
- if (fsinfo.needs_mount)
|
||
+ if (fsinfo->needs_mount)
|
||
log_print_unless_silent("Skip mount in test mode.");
|
||
- if (fsinfo.needs_crypt)
|
||
+ if (fsinfo->needs_crypt)
|
||
log_print_unless_silent("Skip cryptsetup in test mode.");
|
||
log_print_unless_silent("Skip fs extend in test mode.");
|
||
- ret = 1;
|
||
- goto out;
|
||
+ return 1;
|
||
}
|
||
|
||
/*
|
||
@@ -6621,12 +6619,7 @@ static int _fs_extend(struct cmd_context *cmd, struct logical_volume *lv,
|
||
*/
|
||
unlock_vg(cmd, lv->vg, lv->vg->name);
|
||
|
||
- if (!fs_extend_script(cmd, lv, &fsinfo, newsize_bytes_fs, lp->fsmode))
|
||
- goto_out;
|
||
-
|
||
- ret = 1;
|
||
- out:
|
||
- return ret;
|
||
+ return fs_extend_script(cmd, lv, fsinfo, newsize_bytes_fs, lp->fsmode);
|
||
}
|
||
|
||
int lv_resize(struct cmd_context *cmd, struct logical_volume *lv,
|
||
@@ -6640,6 +6633,8 @@ int lv_resize(struct cmd_context *cmd, struct logical_volume *lv,
|
||
struct logical_volume *lv_meta = NULL;
|
||
struct logical_volume *lv_main_layer = NULL;
|
||
struct logical_volume *lv_meta_layer = NULL;
|
||
+ struct fs_info fsinfo;
|
||
+ uint64_t newsize_bytes_fs;
|
||
int main_size_matches = 0;
|
||
int meta_size_matches = 0;
|
||
int is_extend = (lp->resize == LV_EXTEND);
|
||
@@ -7100,6 +7095,12 @@ int lv_resize(struct cmd_context *cmd, struct logical_volume *lv,
|
||
|
||
if (!lv_main)
|
||
goto end_main;
|
||
+
|
||
+ if (is_extend && lp->fsopt[0] && strcmp(lp->fsopt, "resize_fsadm")) {
|
||
+ if (!_fs_extend_check_fsinfo(cmd, lv_top, lp, &fsinfo, &newsize_bytes_fs))
|
||
+ goto_out;
|
||
+ }
|
||
+
|
||
if (!_lv_resize_volume(lv_main, lp, lp->pvh))
|
||
goto_out;
|
||
if (!lp->size_changed) {
|
||
@@ -7145,7 +7146,7 @@ int lv_resize(struct cmd_context *cmd, struct logical_volume *lv,
|
||
}
|
||
} else {
|
||
/* New approach to fs handling using fs info. */
|
||
- if (!_fs_extend(cmd, lv_top, lp)) {
|
||
+ if (!_fs_extend(cmd, lv_top, lp, &fsinfo, newsize_bytes_fs)) {
|
||
log_error("File system extend error.");
|
||
lp->extend_fs_error = 1;
|
||
goto out;
|
||
--
|
||
2.47.1
|
||
|