lvm2/0011-lv_manip.c-fix-lvresize-corruption-in-LV-crypt-FS-st.patch
Marian Csontos 275cf34782 Update lvm2 to upstream version 2.03.33
Resolves: RHEL-106257
2025-09-29 18:15:33 +02:00

82 lines
3.1 KiB
Diff
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

From 6ca7cd60fd6afcc0f95dfe20d33044a319621b6d Mon Sep 17 00:00:00 2001
From: Peter Rajnoha <prajnoha@redhat.com>
Date: Fri, 18 Jul 2025 15:06:36 +0200
Subject: [PATCH 11/47] lv_manip.c: fix lvresize corruption in LV->crypt->FS
stack if near crypt min size limit
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
If we have LV->crypt->FS stack, check that the adjustment for the crypt
data offset will left space for the crypt data itself. Fix possible underflow.
Example:
lvs -o name,size vg/lvol0
lv_name lv_size
lvol0 124.00m
lsblk /dev/vg/lvol0
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
vg-lvol0 252:2 0 124M 0 lvm
└─a 252:4 0 108M 0 crypt
Before this patch (the incorrect resulting underflowed file system size after adjustment
for crypt data offset, crypt data then severed by the LV resize without proper
crypt resize beforehand):
lvreduce --yes --resizefs -L -123M vg/lvol0
Rounding size to boundary between physical extents: 120.00 MiB.
Checking crypt device /dev/dm-4 on LV vg/lvol0.
File system size 18446744073696968704b is adjusted for crypt data offset 16777216b.
File system ext4+crypto_LUKS found on vg/lvol0.
File system size (108.00 MiB) is smaller than the requested size (<16.00 EiB).
File system reduce is not needed, skipping.
crypt device is already reduced to 113246208 bytes.
Size of logical volume vg/lvol0 changed from 124.00 MiB (31 extents) to 4.00 MiB (1 extents).
Logical volume vg/lvol0 successfully resized.
With this patch applied:
lvreduce --yes --resizefs -L -123M vg/lvol0
Rounding size to boundary between physical extents: 120.00 MiB.
Checking crypt device /dev/dm-4 on LV vg/lvol0.
Crypt header requires 16.00 MiB, not enough space left for crypt data.
(cherry picked from commit 5da3676ff3901fd099dcdd2bd7478fa9ea4f54dc)
---
WHATS_NEW | 1 +
lib/metadata/lv_manip.c | 5 +++++
2 files changed, 6 insertions(+)
diff --git a/WHATS_NEW b/WHATS_NEW
index e8db60d53..723638042 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.03.34 -
==================
+ Fix lvresize corruption in LV->crypt->FS stack if near crypt min size limit.
Fix autoactivation on top of loop dev PVs to trigger once for change uevents.
Version 2.03.33 - 27th June 2025
diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c
index 193b1f403..577ffd0b3 100644
--- a/lib/metadata/lv_manip.c
+++ b/lib/metadata/lv_manip.c
@@ -6478,6 +6478,11 @@ static int _fs_reduce(struct cmd_context *cmd, struct logical_volume *lv,
* 2MB for LUKS1 and 16MB for LUKS2.)
*/
if (fsinfo.needs_crypt) {
+ if (fsinfo.crypt_offset_bytes >= fsinfo.new_size_bytes) {
+ log_error("Crypt header requires %s, not enough space left for crypt data.",
+ display_size(cmd, fsinfo.crypt_offset_bytes >> SECTOR_SHIFT));
+ goto out;
+ }
fsinfo.new_size_bytes -= fsinfo.crypt_offset_bytes;
log_print_unless_silent("File system size %llub is adjusted for crypt data offset %ub.",
(unsigned long long)fsinfo.new_size_bytes, fsinfo.crypt_offset_bytes);
--
2.51.0