[PATCH 4/4] test: addm shell/lvresize-btrfs.sh
Su Yue <[email protected]> Tue, 13 May 2025 14:14:27 +0800
| Newsgroups | dev.linux.lists.lvm-devel |
|---|---|
| Message-ID | <[email protected]> |
refer legacy patche: - Ondrej Kozina <[email protected]> https://listman.redhat.com/archives/lvm-devel/2012-November/msg00055.html Signed-off-by: Heming Zhao <[email protected]> [Adjust to lvresize] Signed-off-by: Su Yue <[email protected]> --- test/shell/lvresize-btrfs.sh | 244 +++++++++++++++++++++++++++++++++++ 1 file changed, 244 insertions(+) create mode 100644 test/shell/lvresize-btrfs.sh diff --git a/test/shell/lvresize-btrfs.sh b/test/shell/lvresize-btrfs.sh new file mode 100644 index 000000000000..408a84e34200 --- /dev/null +++ b/test/shell/lvresize-btrfs.sh @@ -0,0 +1,244 @@ +#!/usr/bin/env bash + +# Copyright (C) 2025 Red Hat, Inc. All rights reserved. +# This copyrighted material is made available to anyone wishing to use, +# modify, copy, or redistribute it subject to the terms and conditions +# of the GNU General Public License v.2. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +test_description='Exercise btrfs resize' + +. lib/inittest + +aux have_fsinfo || skip "Test needs --fs checksize support" + +aux prepare_vg 1 1024 + +which mkfs.btrfs || skip +which btrfs || skip +grep btrfs /proc/filesystems || skip + +vg_lv=$vg/$lv1 +vg_lv2=$vg/${lv1}bar +vg_lv3=$vg/${lv1}bar2 +dev_vg_lv="$DM_DEV_DIR/$vg_lv" +dev_vg_lv2="$DM_DEV_DIR/$vg_lv2" +dev_vg_lv3="$DM_DEV_DIR/$vg_lv3" +mount_dir="mnt" +mount_space_dir="mnt space dir" + +test ! -d "$mount_dir" && mkdir "$mount_dir" +test ! -d "$mount_space_dir" && mkdir "$mount_space_dir" + +cleanup_mounted_and_teardown() +{ + umount "$mount_dir" || true + umount "$mount_space_dir" || true + aux teardown +} + +reset_lvs() +{ + # Since we call mkfs.btrfs with '-f', lvreduce to 64M is enough + lvreduce -L64M -nf $vg_lv || true + lvreduce -L64M -nf $vg_lv2 || true + lvreduce -L64M -nf $vg_lv3 || true +} + +fscheck_btrfs() { + btrfsck "$1" +} +scrub_btrfs() { + btrfs scrub start -B "$1" +} + +btrfs_devid() { + local devpath="$1" + local devid + + devpath="$(readlink "$devpath")" + + # It could be a multi-devices btrfs so call grep. + devid="$(LC_ALL=C btrfs filesystem show "$devpath" | grep "$devpath"$ || true)" + + # if DM_DEV_DIR is not /dev/ e.g /tmp, output of btrfs filesystem show would be like: + # Label: none uuid: d17f6974-267f-4140-8d71-83d4afd36a72 + # Total devices 1 FS bytes used 144.00KiB + # devid 1 size 256.00MiB used 16.75MiB path /dev/mapper/LVMTEST120665vg-LV1 + # + # But the VOLUME here is /tmp/mapper/LVMTEST120665vg-LV1 + if [ -z "$devid" ];then + tmp_path="${devpath/#${DM_DEV_DIR}//dev}" + devid="$(LC_ALL=C btrfs filesystem show "$devpath" | grep "$tmp_path"$)" + devid=${devid##*devid} + fi + + devid=${devid##*devid} + devid=${devid%%size*} + devid="$(echo "$devid" |sed 's/^[ \t]*//g'|sed 's/[ \t]*$'//g)" + + echo "$devid" +} + +# in MiB +btrfs_device_size() { + local dev="$1" + local mnt="$2" + local devid + + devid="$(btrfs_devid $dev)" + btrfs device usage -b "$mnt" | grep -A1 "ID: $devid"$ | grep 'Device size:' \ + | awk '{print $NF}' +} + +verify_mounted_device_size() { + local dev="$1" + local mnt="$2" + local size="$(echo $3 | numfmt --from=iec)" + local used_size + + used_size=$(btrfs_device_size "$dev" "$mnt") + + [[ "$used_size" == "$size" ]] +} + +verify_device_size() { + local dev="$1" + local size="$2" + local mnt="$mount_dir" + + mount "$dev" "$mnt" + verify_mounted_device_size "$dev" "$mnt" "$size" + umount "$mnt" +} + +# btrfs minimal size calculation is complex, we use 64M here. +lvcreate -n $lv1 -L64M $vg +lvcreate -n ${lv1}bar -L64M $vg +lvcreate -n ${lv1}bar2 -L64M $vg +trap 'cleanup_mounted_and_teardown' EXIT + +single_device_test() { + mkfs.btrfs -m single "$dev_vg_lv" + mkfs.btrfs -m single "$dev_vg_lv2" + + + # kernel limits 256 MB as minimal btrfs resizable size + # you can grow fs from 64MB->256MB + # but you can't grow from 64MB->180MB + lvresize -y --fs resize $vg_lv -L 256M + verify_device_size $dev_vg_lv 256M + lvresize -y --fs resize $vg_lv2 -L 256M + verify_device_size $dev_vg_lv2 256M + + not lvresize -y --fs resize $vg_lv -L 200M + lvresize -y -L+12M --fs resize $vg_lv + verify_device_size $dev_vg_lv 268M + # lvreduce default behavior is fs checksize, must fail + not lvreduce -y -L256M $vg_lv + lvreduce -y -L256M --fs resize $vg_lv + fscheck_btrfs $dev_vg_lv + + # do test on mounted state + mount "$dev_vg_lv" "$mount_dir" + mount "$dev_vg_lv2" "$mount_space_dir" + + # 'not': we expect a failure here. + not lvresize --fs resize $vg_lv -L 200M + lvresize -L+12M --fs resize $vg_lv + + verify_mounted_device_size $dev_vg_lv "$mount_dir" 268M + # lvreduce default behavior is fs checksize, must fail + not lvreduce -L256M $vg_lv + lvreduce -L256M --fs resize $vg_lv + verify_mounted_device_size $dev_vg_lv "$mount_dir" 256M + scrub_btrfs $dev_vg_lv + umount "$mount_dir" + + not lvresize --fs resize $vg_lv2 -L 200M + lvresize -L+12M --fs resize $vg_lv2 + verify_mounted_device_size $dev_vg_lv2 "$mount_space_dir" 268M + not lvreduce -L256M --fs checksize $vg_lv2 + lvreduce -L256M --fs resize $vg_lv2 + verify_mounted_device_size $dev_vg_lv2 "$mount_space_dir" 256M + scrub_btrfs $dev_vg_lv2 + umount "$mount_space_dir" +} + +multiple_devices_test() { + + # fs size is the sum of the three LVs size + mkfs.btrfs -m single -d single -f "$dev_vg_lv" "$dev_vg_lv2" "$dev_vg_lv3" + + # The VG is 1GB size, we expect success here. + # lv,lv2,lv3 size are changed from 64M to 256M + lvresize --fs resize $vg_lv -L 256M --fsmode manage + lvresize --fs resize $vg_lv2 -L 256M --fsmode manage + lvresize --fs resize $vg_lv3 -L 256M --fsmode manage + + verify_device_size $dev_vg_lv 256M + verify_device_size $dev_vg_lv2 256M + verify_device_size $dev_vg_lv3 256M + + # check if lvextend/lvreduce is able to get/resize btrfs on + # the right device + lvextend -L+150M --fs resize $vg_lv --fsmode manage + lvreduce --fs resize $vg_lv -L 300M --fsmode manage + verify_device_size $dev_vg_lv 300M + not lvreduce -y -L256M --fs checksize $vg_lv --fsmode manage + lvreduce -L256M --fs resize $vg_lv --fsmode manage + verify_device_size $dev_vg_lv 256M + fscheck_btrfs $dev_vg_lv + + lvextend -L+150M --fs resize $vg_lv2 --fsmode manage + lvreduce --fs resize $vg_lv2 -L 300M --fsmode manage + verify_device_size $dev_vg_lv2 300M + not lvreduce -y -L256M --fs checksize $vg_lv2 --fsmode manage + lvreduce -y -L256M --fs resize $vg_lv2 --fsmode manage + verify_device_size $dev_vg_lv2 256M + fscheck_btrfs $dev_vg_lv2 + + lvextend -L+150M --fs resize $vg_lv3 --fsmode manage + lvreduce --fs resize $vg_lv3 -L 300M --fsmode manage + verify_device_size $dev_vg_lv3 300M + not lvreduce -y -L256M --fs checksize $vg_lv3 --fsmode manage + lvreduce -y -L256M --fs resize $vg_lv3 --fsmode manage + verify_device_size $dev_vg_lv3 256M + fscheck_btrfs $dev_vg_lv3 + + # repeat with mounted fs + mount "$dev_vg_lv" "$mount_dir" + + lvresize -L300M --fs resize $vg_lv + verify_mounted_device_size $dev_vg_lv "$mount_dir" 300M + lvreduce -y -L256M --fs resize $vg_lv + verify_mounted_device_size $dev_vg_lv "$mount_dir" 256M + + lvresize -L300M --fs resize $vg_lv2 + verify_mounted_device_size $dev_vg_lv2 "$mount_dir" 300M + lvreduce -y -L256M --fs resize $vg_lv2 + verify_mounted_device_size $dev_vg_lv2 "$mount_dir" 256M + + lvresize -L300M --fs resize $vg_lv3 + verify_mounted_device_size $dev_vg_lv3 "$mount_dir" 300M + lvreduce -y -L256M --fs resize $vg_lv3 + verify_mounted_device_size $dev_vg_lv3 "$mount_dir" 256M + + scrub_btrfs $dev_vg_lv + umount "$mount_dir" + + lvresize -nf -L300M $vg_lv + lvresize -nf -L300M $vg_lv2 +} + +single_device_test +# after each test, reset_lv_size should be called to make sure +# all lvs are in same state/size. +reset_lvs +multiple_devices_test + + +vgremove -ff $vg -- 2.48.1