diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/shell/lvresize-fs.sh | 1154 | ||||
-rw-r--r-- | test/shell/lvresize-xfs.sh | 301 |
2 files changed, 560 insertions, 895 deletions
diff --git a/test/shell/lvresize-fs.sh b/test/shell/lvresize-fs.sh index de234aad5..cf93a4222 100644 --- a/test/shell/lvresize-fs.sh +++ b/test/shell/lvresize-fs.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -# Copyright (C) 2007-2016 Red Hat, Inc. All rights reserved. +# Copyright (C) 2007-2023 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 @@ -15,17 +15,22 @@ SKIP_WITH_LVMPOLLD=1 . lib/inittest -aux prepare_vg 3 256 +aux prepare_vg 2 100 -which mkfs.xfs || skip +which mkfs.ext4 || skip +which resize2fs || skip -# Test combinations of the following: -# lvreduce / lvextend -# no fs / ext4 / xfs -# each --fs opt / no --fs opt / --resizefs -# active / inactive -# mounted / unmounted -# fs size less than, equal to or greater than reduced lv size +# +# Workaroudn for kernel bug fixed with: +# a408f33e895e455f16cf964cb5cd4979b658db7b +# refreshing DM device - using fsfreeze with suspend +# +workaround_() { + blkid -p "$DM_DEV_DIR/$vg/$lv" >/dev/null || { + dmsetup suspend $vg-$lv + dmsetup resume $vg-$lv + } +} mount_dir="mnt_lvresize_fs" mkdir -p "$mount_dir" @@ -33,690 +38,378 @@ mkdir -p "$mount_dir" mount_dir_space="other mnt dir" mkdir -p "$mount_dir_space" -# Tests require a libblkid version that shows FSLASTBLOCK -lvcreate -n $lv1 -L 300 $vg -mkfs.xfs -f "$DM_DEV_DIR/$vg/$lv1" -blkid -p "$DM_DEV_DIR/$vg/$lv1" | grep FSLASTBLOCK || skip -lvchange -an $vg -lvremove $vg/$lv1 +# Test combinations of the following: +# lvreduce / lvextend +# no fs / ext4 +# each --fs opt / no --fs opt / --resizefs +# active / inactive +# mounted / unmounted +# fs size less than, equal to or greater than reduced lv size + + +################### # # lvextend, no fs # +################### # lvextend, no fs, active, no --fs -lvcreate -n $lv -L 256M $vg -aux wipefs_a "$DM_DEV_DIR/$vg/$lv" -lvextend -L+200M $vg/$lv -check lv_field $vg/$lv lv_size "456.00m" -lvchange -an $vg/$lv -lvremove $vg/$lv - -# lvextend, no fs, inactive, no --fs -lvcreate -n $lv -L 256M $vg -aux wipefs_a "$DM_DEV_DIR/$vg/$lv" -lvchange -an $vg/$lv -lvextend -L+200M $vg/$lv -check lv_field $vg/$lv lv_size "456.00m" -lvremove $vg/$lv +lvcreate -n $lv -L 10M $vg +lvextend -L+20M $vg/$lv +check lv_field $vg/$lv lv_size "30.00m" # lvextend, no fs, active, --fs resize fails with no fs found -lvcreate -n $lv -L 256M $vg -aux wipefs_a "$DM_DEV_DIR/$vg/$lv" -not lvextend -L+200M --fs resize $vg/$lv -check lv_field $vg/$lv lv_size "256.00m" +not lvextend -L+20M --fs resize $vg/$lv +check lv_field $vg/$lv lv_size "30.00m" + lvchange -an $vg/$lv -lvremove $vg/$lv # lvextend, no fs, inactive, --fs resize error requires active lv -lvcreate -n $lv -L 256M $vg -aux wipefs_a "$DM_DEV_DIR/$vg/$lv" +not lvextend -L+20M --fs resize $vg/$lv +check lv_field $vg/$lv lv_size "30.00m" + +# lvextend, no fs, inactive, no --fs +lvextend -L+30M $vg/$lv +check lv_field $vg/$lv lv_size "60.00m" + +lvremove -f $vg + + +################### +# +# lvreduce, no fs +# +################### + +# lvreduce, no fs, active, no --fs setting is same as --fs checksize +lvcreate -n $lv -L 50M $vg +lvreduce -L-10M $vg/$lv +check lv_field $vg/$lv lv_size "40.00m" lvchange -an $vg/$lv -not lvextend -L+200M --fs resize $vg/$lv -check lv_field $vg/$lv lv_size "256.00m" -lvremove $vg/$lv +# lvreduce, no fs, inactive, no --fs setting is same as --fs checksize +not lvreduce -L-10M $vg/$lv +lvreduce --fs checksize -L-10M $vg/$lv +check lv_field $vg/$lv lv_size "30.00m" + +# lvreduce, no fs, inactive, --fs ignore +lvreduce -L-10M --fs ignore $vg/$lv +check lv_field $vg/$lv lv_size "20.00m" + +# lvreduce, no fs, active, --fs resize requires fs to be found +lvchange -ay $vg/$lv +not lvreduce -L-10M --fs resize $vg/$lv +check lv_field $vg/$lv lv_size "20.00m" + +lvremove -f $vg/$lv + + +################# # # lvextend, ext4 # +################# -# lvextend, ext4, active, mounted, no --fs setting is same as --fs ignore -lvcreate -n $lv -L 256M $vg +# Use one instance of ext4 for series of lvextend tests: +lvcreate -n $lv -L 20M $vg mkfs.ext4 "$DM_DEV_DIR/$vg/$lv" mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" + +# --fs tests require a libblkid version that shows FSLASTBLOCK +# so exit 0 test here, if the feature is not present +blkid -p "$DM_DEV_DIR/$vg/$lv" | grep FSLASTBLOCK || exit 0 + + +# lvextend, ext4, active, mounted, no --fs setting is same as --fs ignore df --output=size "$mount_dir" |tee df1 -dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=200 conv=fdatasync -lvextend -L+200M $vg/$lv -check lv_field $vg/$lv lv_size "456.00m" +dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=8 oflag=direct +lvextend -L+10M $vg/$lv +check lv_field $vg/$lv lv_size "30.00m" # with no --fs used, the fs size should be the same df --output=size "$mount_dir" |tee df2 diff df1 df2 resize2fs "$DM_DEV_DIR/$vg/$lv" df --output=size "$mount_dir" |tee df3 not diff df2 df3 -dd if=/dev/zero of="$mount_dir/zeros2" bs=1M count=200 conv=fdatasync -umount "$mount_dir" -lvchange -an $vg/$lv -lvremove $vg/$lv - -# lvextend, ext4, inactive, --fs ignore -lvcreate -n $lv -L 256M $vg -mkfs.ext4 "$DM_DEV_DIR/$vg/$lv" -lvchange -an $vg/$lv -lvextend --fs ignore -L+200M $vg/$lv -check lv_field $vg/$lv lv_size "456.00m" -lvremove $vg/$lv +dd if=/dev/zero of="$mount_dir/zeros2" bs=1M count=10 oflag=direct +# keep mounted fs # lvextend, ext4, active, mounted, --fs ignore -lvcreate -n $lv -L 256M $vg -mkfs.ext4 "$DM_DEV_DIR/$vg/$lv" -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" df --output=size "$mount_dir" |tee df1 -lvextend --fs ignore -L+200M $vg/$lv -check lv_field $vg/$lv lv_size "456.00m" +lvextend --fs ignore -L+10M $vg/$lv +check lv_field $vg/$lv lv_size "40.00m" df --output=size "$mount_dir" |tee df2 diff df1 df2 -umount "$mount_dir" -lvchange -an $vg/$lv -lvremove $vg/$lv +# keep mounted fs # lvextend, ext4, active, mounted, --fs resize -lvcreate -n $lv -L 256M $vg -mkfs.ext4 "$DM_DEV_DIR/$vg/$lv" -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -df --output=size "$mount_dir" |tee df1 -dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=200 conv=fdatasync -lvextend --fs resize -L+200M $vg/$lv -check lv_field $vg/$lv lv_size "456.00m" +lvextend --fs resize -L+10M $vg/$lv +check lv_field $vg/$lv lv_size "50.00m" df --output=size "$mount_dir" |tee df2 not diff df1 df2 -dd if=/dev/zero of="$mount_dir/zeros2" bs=1M count=200 conv=fdatasync -umount "$mount_dir" -lvchange -an $vg/$lv -lvremove $vg/$lv +# keep mounted fs + +workaround_ # lvextend, ext4, active, mounted, --resizefs (same as --fs resize) -lvcreate -n $lv -L 256M $vg -mkfs.ext4 "$DM_DEV_DIR/$vg/$lv" -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" df --output=size "$mount_dir" |tee df1 -dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=200 conv=fdatasync -lvextend --resizefs -L+200M $vg/$lv -check lv_field $vg/$lv lv_size "456.00m" +lvextend --resizefs -L+10M $vg/$lv +check lv_field $vg/$lv lv_size "60.00m" df --output=size "$mount_dir" |tee df2 not diff df1 df2 -dd if=/dev/zero of="$mount_dir/zeros2" bs=1M count=200 conv=fdatasync -umount "$mount_dir" -lvchange -an $vg/$lv -lvremove $vg/$lv +# keep mounted fs + +workaround_ # lvextend, ext4, active, mounted, --fs resize --fsmode manage (same as --fs resize) -lvcreate -n $lv -L 256M $vg -mkfs.ext4 "$DM_DEV_DIR/$vg/$lv" -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" df --output=size "$mount_dir" |tee df1 -dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=200 conv=fdatasync -lvextend --fs resize --fsmode manage -L+200M $vg/$lv -check lv_field $vg/$lv lv_size "456.00m" +lvextend --fs resize --fsmode manage -L+10M $vg/$lv +check lv_field $vg/$lv lv_size "70.00m" df --output=size "$mount_dir" |tee df2 not diff df1 df2 -dd if=/dev/zero of="$mount_dir/zeros2" bs=1M count=200 conv=fdatasync -umount "$mount_dir" -lvchange -an $vg/$lv -lvremove $vg/$lv +dd if=/dev/zero of="$mount_dir/zeros3" bs=1M count=10 oflag=direct +# keep mounted fs -# lvextend, ext4, active, mounted, --fs resize --fsmode offline -lvcreate -n $lv -L 256M $vg -mkfs.ext4 "$DM_DEV_DIR/$vg/$lv" -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -df --output=size "$mount_dir" |tee df1 -dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=200 conv=fdatasync -lvextend --fs resize --fsmode offline -L+200M $vg/$lv -check lv_field $vg/$lv lv_size "456.00m" -# fsmode offline leaves fs unmounted -df -a | tee dfa -not grep "$mount_dir" dfa -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -df --output=size "$mount_dir" |tee df2 -not diff df1 df2 -dd if=/dev/zero of="$mount_dir/zeros2" bs=1M count=200 conv=fdatasync -umount "$mount_dir" -lvchange -an $vg/$lv -lvremove $vg/$lv - -# lvextend, ext4, active, mounted, --fs resize --fsmode nochange -lvcreate -n $lv -L 256M $vg -mkfs.ext4 "$DM_DEV_DIR/$vg/$lv" -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -df --output=size "$mount_dir" |tee df1 -dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=200 conv=fdatasync -lvextend --fs resize --fsmode nochange -L+200M $vg/$lv -check lv_field $vg/$lv lv_size "456.00m" -df --output=size "$mount_dir" |tee df2 -not diff df1 df2 -dd if=/dev/zero of="$mount_dir/zeros2" bs=1M count=200 conv=fdatasync -umount "$mount_dir" -lvchange -an $vg/$lv -lvremove $vg/$lv +workaround_ # lvextend, ext4, active, mounted, --fs resize_fsadm -lvcreate -n $lv -L 256M $vg -mkfs.ext4 "$DM_DEV_DIR/$vg/$lv" -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -df --output=size "$mount_dir" |tee df1 -dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=200 conv=fdatasync -lvextend --fs resize_fsadm -L+200M $vg/$lv -check lv_field $vg/$lv lv_size "456.00m" -df --output=size "$mount_dir" |tee df2 -not diff df1 df2 -dd if=/dev/zero of="$mount_dir/zeros2" bs=1M count=200 conv=fdatasync -umount "$mount_dir" -lvchange -an $vg/$lv -lvremove $vg/$lv - -# lvextend, ext4, active, unmounted, --fs resize --fsmode nochange -lvcreate -n $lv -L 256M $vg -mkfs.ext4 "$DM_DEV_DIR/$vg/$lv" -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" df --output=size "$mount_dir" |tee df1 -dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=200 conv=fdatasync -umount "$mount_dir" -lvextend --fs resize --fsmode nochange -L+200M $vg/$lv -check lv_field $vg/$lv lv_size "456.00m" -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" +lvextend --fs resize_fsadm -L+10M $vg/$lv +check lv_field $vg/$lv lv_size "80.00m" df --output=size "$mount_dir" |tee df2 not diff df1 df2 -dd if=/dev/zero of="$mount_dir/zeros2" bs=1M count=200 conv=fdatasync -umount "$mount_dir" -lvchange -an $vg/$lv -lvremove $vg/$lv +# keep mounted fs -# lvextend, ext4, active, unmounted, --fs resize -lvcreate -n $lv -L 256M $vg -mkfs.ext4 "$DM_DEV_DIR/$vg/$lv" -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -df --output=size "$mount_dir" |tee df1 -dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=200 conv=fdatasync -umount "$mount_dir" -lvextend --fs resize -L+200M $vg/$lv -check lv_field $vg/$lv lv_size "456.00m" -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -df --output=size "$mount_dir" |tee df2 -not diff df1 df2 -dd if=/dev/zero of="$mount_dir/zeros2" bs=1M count=200 conv=fdatasync -umount "$mount_dir" -lvchange -an $vg/$lv -lvremove $vg/$lv +workaround_ -# lvextend, ext4, active, unmounted, --fs resize_fsadm -lvcreate -n $lv -L 256M $vg -mkfs.ext4 "$DM_DEV_DIR/$vg/$lv" -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" +# lvextend, ext4, active, mounted, --fs resize --fsmode nochange df --output=size "$mount_dir" |tee df1 -dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=200 conv=fdatasync -umount "$mount_dir" -lvextend --fs resize_fsadm -L+200M $vg/$lv -check lv_field $vg/$lv lv_size "456.00m" -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" +lvextend --fs resize --fsmode nochange -L+10M $vg/$lv +check lv_field $vg/$lv lv_size "90.00m" df --output=size "$mount_dir" |tee df2 not diff df1 df2 -dd if=/dev/zero of="$mount_dir/zeros2" bs=1M count=200 conv=fdatasync -umount "$mount_dir" -lvchange -an $vg/$lv -lvremove $vg/$lv +# keep mounted fs # lvextend|lvreduce, ext4, active, mounted, --fs resize, renamed LV -lvcreate -n $lv -L 256M $vg -mkfs.ext4 "$DM_DEV_DIR/$vg/$lv" -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" lvrename $vg/$lv $vg/$lv2 not lvextend --fs resize -L+32M $vg/$lv2 not lvreduce --fs resize -L-32M $vg/$lv2 umount "$mount_dir" -lvchange -an $vg/$lv2 -lvremove $vg/$lv2 # lvextend|lvreduce, ext4, active, mounted, mount dir with space, --fs resize, renamed LV -lvcreate -n $lv -L 256M $vg -mkfs.ext4 "$DM_DEV_DIR/$vg/$lv" -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir_space" -lvrename $vg/$lv $vg/$lv2 -not lvextend --fs resize -L+32M $vg/$lv2 -not lvreduce --fs resize -L-32M $vg/$lv2 +mount "$DM_DEV_DIR/$vg/$lv2" "$mount_dir_space" +lvrename $vg/$lv2 $vg/$lv3 +not lvextend --fs resize -L+32M $vg/$lv3 +not lvreduce --fs resize -L-32M $vg/$lv3 umount "$mount_dir_space" -lvchange -an $vg/$lv2 -lvremove $vg/$lv2 +lvremove -f $vg/$lv3 + +##################################### # -# lvextend, xfs +# Now let do some unmounted tests # +##################################### -# lvextend, xfs, active, mounted, no --fs setting is same as --fs ignore -lvcreate -n $lv -L 256M $vg -mkfs.xfs "$DM_DEV_DIR/$vg/$lv" -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -df --output=size "$mount_dir" |tee df1 -dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=200 conv=fdatasync -lvextend -L+200M $vg/$lv -check lv_field $vg/$lv lv_size "456.00m" -# with no --fs used, the fs size should be the same -df --output=size "$mount_dir" |tee df2 -diff df1 df2 -xfs_growfs "$DM_DEV_DIR/$vg/$lv" -df --output=size "$mount_dir" |tee df3 -not diff df2 df3 -dd if=/dev/zero of="$mount_dir/zeros2" bs=1M count=200 conv=fdatasync -umount "$mount_dir" -lvchange -an $vg/$lv -lvremove $vg/$lv - -# lvextend, xfs, inactive, --fs ignore -lvcreate -n $lv -L 256M $vg -mkfs.xfs "$DM_DEV_DIR/$vg/$lv" -lvchange -an $vg/$lv -lvextend --fs ignore -L+200M $vg/$lv -check lv_field $vg/$lv lv_size "456.00m" -lvremove $vg/$lv - -# lvextend, xfs, active, mounted, --fs ignore -lvcreate -n $lv -L 256M $vg -mkfs.xfs "$DM_DEV_DIR/$vg/$lv" -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -df --output=size "$mount_dir" |tee df1 -lvextend --fs ignore -L+200M $vg/$lv -check lv_field $vg/$lv lv_size "456.00m" -df --output=size "$mount_dir" |tee df2 -diff df1 df2 -umount "$mount_dir" -lvchange -an $vg/$lv -lvremove $vg/$lv - -# lvextend, xfs, active, mounted, --fs resize -lvcreate -n $lv -L 256M $vg -mkfs.xfs "$DM_DEV_DIR/$vg/$lv" -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -df --output=size "$mount_dir" |tee df1 -dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=200 conv=fdatasync -lvextend --fs resize -L+200M $vg/$lv -check lv_field $vg/$lv lv_size "456.00m" -df --output=size "$mount_dir" |tee df2 -not diff df1 df2 -dd if=/dev/zero of="$mount_dir/zeros2" bs=1M count=200 conv=fdatasync -umount "$mount_dir" -lvchange -an $vg/$lv -lvremove $vg/$lv - -# lvextend, xfs, active, mounted, --resizefs (same as --fs resize) -lvcreate -n $lv -L 256M $vg -mkfs.xfs "$DM_DEV_DIR/$vg/$lv" -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -df --output=size "$mount_dir" |tee df1 -dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=200 conv=fdatasync -lvextend --resizefs -L+200M $vg/$lv -check lv_field $vg/$lv lv_size "456.00m" -df --output=size "$mount_dir" |tee df2 -not diff df1 df2 -dd if=/dev/zero of="$mount_dir/zeros2" bs=1M count=200 conv=fdatasync -umount "$mount_dir" -lvchange -an $vg/$lv -lvremove $vg/$lv +# prepare new ext4 setup +lvcreate -n $lv -L 15M $vg +mkfs.ext4 "$DM_DEV_DIR/$vg/$lv" -# lvextend, xfs, active, mounted, --fs resize --fsmode manage (same as --fs resize) -lvcreate -n $lv -L 256M $vg -mkfs.xfs "$DM_DEV_DIR/$vg/$lv" -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -df --output=size "$mount_dir" |tee df1 -dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=200 conv=fdatasync -lvextend --fs resize --fsmode manage -L+200M $vg/$lv -check lv_field $vg/$lv lv_size "456.00m" -df --output=size "$mount_dir" |tee df2 -not diff df1 df2 -dd if=/dev/zero of="$mount_dir/zeros2" bs=1M count=200 conv=fdatasync -umount "$mount_dir" +# lvextend, ext4, inactive, --fs ignore lvchange -an $vg/$lv -lvremove $vg/$lv +lvextend --fs ignore -L+5M $vg/$lv +check lv_field $vg/$lv lv_size "20.00m" +lvchange -ay $vg/$lv -# lvextend, xfs, active, mounted, --fs resize --fsmode offline -lvcreate -n $lv -L 256M $vg -mkfs.xfs "$DM_DEV_DIR/$vg/$lv" +# lvextend, ext4, active, mounted, --fs resize --fsmode offline mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" df --output=size "$mount_dir" |tee df1 -dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=200 conv=fdatasync -# xfs_growfs requires the fs to be mounted, so extending the lv is -# succeeds, then the xfs extend fails because it cannot be done unmounted -not lvextend --fs resize --fsmode offline -L+200M $vg/$lv -check lv_field $vg/$lv lv_size "456.00m" +dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=8 oflag=direct +lvextend --fs resize --fsmode offline -L+10M $vg/$lv +check lv_field $vg/$lv lv_size "30.00m" +# fsmode offline leaves fs unmounted df -a | tee dfa -grep "$mount_dir" dfa -df --output=size "$mount_dir" |tee df2 -# fs not extended so fs size not changed -diff df1 df2 -umount "$mount_dir" -lvchange -an $vg/$lv -lvremove $vg/$lv - -# lvextend, xfs, active, mounted, --fs resize --fsmode nochange -lvcreate -n $lv -L 256M $vg -mkfs.xfs "$DM_DEV_DIR/$vg/$lv" -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -df --output=size "$mount_dir" |tee df1 -dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=200 conv=fdatasync -lvextend --fs resize --fsmode nochange -L+200M $vg/$lv -check lv_field $vg/$lv lv_size "456.00m" -df --output=size "$mount_dir" |tee df2 -not diff df1 df2 -dd if=/dev/zero of="$mount_dir/zeros2" bs=1M count=200 conv=fdatasync -umount "$mount_dir" -lvchange -an $vg/$lv -lvremove $vg/$lv - -# lvextend, xfs, active, mounted, --fs resize_fsadm -lvcreate -n $lv -L 256M $vg -mkfs.xfs "$DM_DEV_DIR/$vg/$lv" +not grep "$mount_dir" dfa mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -df --output=size "$mount_dir" |tee df1 -dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=200 conv=fdatasync -lvextend --fs resize_fsadm -L+200M $vg/$lv -check lv_field $vg/$lv lv_size "456.00m" df --output=size "$mount_dir" |tee df2 not diff df1 df2 -dd if=/dev/zero of="$mount_dir/zeros2" bs=1M count=200 conv=fdatasync +dd if=/dev/zero of="$mount_dir/zeros2" bs=1M count=10 oflag=direct umount "$mount_dir" -lvchange -an $vg/$lv -lvremove $vg/$lv -# lvextend, xfs, active, unmounted, --fs resize --fsmode nochange -lvcreate -n $lv -L 256M $vg -mkfs.xfs "$DM_DEV_DIR/$vg/$lv" -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" +# lvextend, ext4, active, unmounted, --fs resize --fsmode nochange df --output=size "$mount_dir" |tee df1 -dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=200 conv=fdatasync -umount "$mount_dir" -# xfs_growfs requires the fs to be mounted to grow, so --fsmode nochange -# with an unmounted fs fails -not lvextend --fs resize --fsmode nochange -L+200M $vg/$lv -check lv_field $vg/$lv lv_size "456.00m" +lvextend --fs resize --fsmode nochange -L+10M $vg/$lv +check lv_field $vg/$lv lv_size "40.00m" mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" df --output=size "$mount_dir" |tee df2 -# fs not extended so fs size not changed -diff df1 df2 +not diff df1 df2 umount "$mount_dir" -lvchange -an $vg/$lv -lvremove $vg/$lv -# lvextend, xfs, active, unmounted, --fs resize -lvcreate -n $lv -L 256M $vg -mkfs.xfs "$DM_DEV_DIR/$vg/$lv" -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -df --output=size "$mount_dir" |tee df1 -dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=200 conv=fdatasync -umount "$mount_dir" -# --yes needed because mount changes are required and plain "resize" -# fsopt did not specify if the user wants to change mount state -lvextend --yes --fs resize -L+200M $vg/$lv -check lv_field $vg/$lv lv_size "456.00m" +# lvextend, ext4, active, unmounted, --fs resize +lvextend --fs resize -L+10M $vg/$lv +check lv_field $vg/$lv lv_size "50.00m" mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" df --output=size "$mount_dir" |tee df2 not diff df1 df2 -dd if=/dev/zero of="$mount_dir/zeros2" bs=1M count=200 conv=fdatasync umount "$mount_dir" -lvchange -an $vg/$lv -lvremove $vg/$lv -# lvextend, xfs, active, unmounted, --fs resize_fsadm -lvcreate -n $lv -L 256M $vg -mkfs.xfs "$DM_DEV_DIR/$vg/$lv" -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -df --output=size "$mount_dir" |tee df1 -dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=200 conv=fdatasync -umount "$mount_dir" -lvextend --fs resize_fsadm -L+200M $vg/$lv -check lv_field $vg/$lv lv_size "456.00m" +# lvextend, ext4, active, unmounted, --fs resize_fsadm +lvextend --fs resize_fsadm -L+10M $vg/$lv +check lv_field $vg/$lv lv_size "60.00m" mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" df --output=size "$mount_dir" |tee df2 not diff df1 df2 -dd if=/dev/zero of="$mount_dir/zeros2" bs=1M count=200 conv=fdatasync umount "$mount_dir" -lvchange -an $vg/$lv -lvremove $vg/$lv - - -# -# lvreduce, no fs -# - -# lvreduce, no fs, active, no --fs setting is same as --fs checksize -lvcreate -n $lv -L 456M $vg -aux wipefs_a "$DM_DEV_DIR/$vg/$lv" -lvreduce -L-200M $vg/$lv -check lv_field $vg/$lv lv_size "256.00m" -lvchange -an $vg/$lv -lvremove $vg/$lv - -# lvreduce, no fs, inactive, no --fs setting is same as --fs checksize -lvcreate -n $lv -L 456M $vg -aux wipefs_a "$DM_DEV_DIR/$vg/$lv" -lvchange -an $vg/$lv -not lvreduce -L-200M $vg/$lv -lvreduce --fs checksize -L-200M $vg/$lv -check lv_field $vg/$lv lv_size "256.00m" -lvremove $vg/$lv - -# lvreduce, no fs, active, --fs resize requires fs to be found -lvcreate -n $lv -L 456M $vg -aux wipefs_a "$DM_DEV_DIR/$vg/$lv" -not lvreduce -L-200M --fs resize $vg/$lv -check lv_field $vg/$lv lv_size "456.00m" -lvchange -an $vg/$lv -lvremove $vg/$lv -# lvreduce, no fs, inactive, --fs ignore -lvcreate -n $lv -L 456M $vg -aux wipefs_a "$DM_DEV_DIR/$vg/$lv" -lvchange -an $vg/$lv -lvreduce -L-200M --fs ignore $vg/$lv -check lv_field $vg/$lv lv_size "256.00m" -lvchange -an $vg/$lv -lvremove $vg/$lv +lvremove -f $vg/$lv +#################################################################### # # lvreduce, ext4, no --fs setting and the equivalent --fs checksize # i.e. fs is not resized # +#################################################################### # lvreduce, ext4, active, mounted, no --fs setting is same as --fs checksize # fs smaller than the reduced size -lvcreate -n $lv -L 200M $vg +lvcreate -n $lv -L 20M $vg mkfs.ext4 "$DM_DEV_DIR/$vg/$lv" -lvextend -L+256M $vg/$lv +lvextend -L+25M $vg/$lv mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=128 conv=fdatasync +dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=10 oflag=direct df --output=size "$mount_dir" |tee df1 -# fs is 200M, reduced size is 216M, so no fs reduce is needed +# fs is 20M, reduced size is 27M, so no fs reduce is needed # todo: check that resize2fs was not run? -lvreduce -L216M $vg/$lv -check lv_field $vg/$lv lv_size "216.00m" +lvreduce -L27M $vg/$lv +check lv_field $vg/$lv lv_size "27.00m" df --output=size "$mount_dir" |tee df2 # fs size unchanged diff df1 df2 -umount "$mount_dir" -lvchange -an $vg/$lv -lvremove $vg/$lv +# keep fs mounted # lvreduce, ext4, active, mounted, no --fs setting is same as --fs checksize # fs equal to the reduced size -lvcreate -n $lv -L 200M $vg -mkfs.ext4 "$DM_DEV_DIR/$vg/$lv" -lvextend -L+256M $vg/$lv -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=128 conv=fdatasync -df --output=size "$mount_dir" |tee df1 -# fs is 200M, reduced size is 200M, so no fs reduce is needed -# todo: check that resize2fs was not run? -lvreduce -L200M $vg/$lv -check lv_field $vg/$lv lv_size "200.00m" +lvreduce -L20M $vg/$lv +check lv_field $vg/$lv lv_size "20.00m" df --output=size "$mount_dir" |tee df2 # fs size unchanged diff df1 df2 -umount "$mount_dir" -lvchange -an $vg/$lv -lvremove $vg/$lv +# keep fs mounted # lvreduce, ext4, active, mounted, no --fs setting is same as --fs checksize # fs larger than the reduced size, fs not using reduced space -lvcreate -n $lv -L 456M $vg -mkfs.ext4 "$DM_DEV_DIR/$vg/$lv" -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=100 conv=fdatasync -df --output=size "$mount_dir" |tee df1 # lvreduce fails because fs needs to be reduced and checksize does not resize -not lvreduce -L-200M $vg/$lv -check lv_field $vg/$lv lv_size "456.00m" +not lvreduce -L-18M $vg/$lv +check lv_field $vg/$lv lv_size "20.00m" df --output=size "$mount_dir" |tee df2 # fs size unchanged diff df1 df2 -umount "$mount_dir" -lvchange -an $vg/$lv -lvremove $vg/$lv +# keep fs mounted # lvreduce, ext4, active, mounted, no --fs setting is same as --fs checksize # fs larger than the reduced size, fs is using reduced space -lvcreate -n $lv -L 456M $vg -mkfs.ext4 "$DM_DEV_DIR/$vg/$lv" -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=300 conv=fdatasync -df --output=size "$mount_dir" |tee df1 -# lvreduce fails because fs needs to be reduced and checksize does not resize -not lvreduce -L-200M $vg/$lv -check lv_field $vg/$lv lv_size "456.00m" +not lvreduce -L-5M $vg/$lv +check lv_field $vg/$lv lv_size "20.00m" df --output=size "$mount_dir" |tee df2 # fs size unchanged diff df1 df2 umount "$mount_dir" -lvchange -an $vg/$lv -lvremove $vg/$lv +lvremove -f $vg/$lv + + +############################################################ +# # repeat lvreduce tests with unmounted instead of mounted fs +# +############################################################ # lvreduce, ext4, active, unmounted, no --fs setting is same as --fs checksize # fs smaller than the reduced size -lvcreate -n $lv -L 200M $vg +lvcreate -n $lv -L 20M $vg mkfs.ext4 "$DM_DEV_DIR/$vg/$lv" -lvextend -L+256M $vg/$lv +lvextend -L+25M $vg/$lv mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=128 conv=fdatasync +dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=10 oflag=direct df --output=size "$mount_dir" |tee df1 umount "$mount_dir" -# fs is 200M, reduced size is 216M, so no fs reduce is needed -lvreduce -L216M $vg/$lv -check lv_field $vg/$lv lv_size "216.00m" -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -df --output=size "$mount_dir" |tee df2 -# fs size unchanged -diff df1 df2 -umount "$mount_dir" -lvchange -an $vg/$lv -lvremove $vg/$lv +# fs is 20M, reduced size is 27M, so no fs reduce is needed +lvreduce -L27M $vg/$lv +check lv_field $vg/$lv lv_size "27.00m" # lvreduce, ext4, active, unmounted, no --fs setting is same as --fs checksize # fs equal to the reduced size -lvcreate -n $lv -L 200M $vg -mkfs.ext4 "$DM_DEV_DIR/$vg/$lv" -lvextend -L+256M $vg/$lv -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=128 conv=fdatasync -df --output=size "$mount_dir" |tee df1 -umount "$mount_dir" -# fs is 200M, reduced size is 200M, so no fs reduce is needed -lvreduce -L200M $vg/$lv -check lv_field $vg/$lv lv_size "200.00m" +# fs is 20M, reduced size is 20M, so no fs reduce is needed +lvreduce -L20M $vg/$lv +check lv_field $vg/$lv lv_size "20.00m" mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" df --output=size "$mount_dir" |tee df2 # fs size unchanged diff df1 df2 umount "$mount_dir" -lvchange -an $vg/$lv -lvremove $vg/$lv + # lvreduce, ext4, active, unmounted, no --fs setting is same as --fs checksize # fs larger than the reduced size, fs not using reduced space -lvcreate -n $lv -L 456M $vg -mkfs.ext4 "$DM_DEV_DIR/$vg/$lv" -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=100 conv=fdatasync -df --output=size "$mount_dir" |tee df1 -umount "$mount_dir" # lvreduce fails because fs needs to be reduced and checksize does not resize -not lvreduce -L-200M $vg/$lv -check lv_field $vg/$lv lv_size "456.00m" -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -df --output=size "$mount_dir" |tee df2 -# fs size unchanged -diff df1 df2 -umount "$mount_dir" -lvchange -an $vg/$lv -lvremove $vg/$lv +not lvreduce -L-5M $vg/$lv # lvreduce, ext4, active, unmounted, no --fs setting is same as --fs checksize # fs larger than the reduced size, fs is using reduced space -lvcreate -n $lv -L 456M $vg -mkfs.ext4 "$DM_DEV_DIR/$vg/$lv" -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=300 conv=fdatasync -df --output=size "$mount_dir" |tee df1 -umount "$mount_dir" # lvreduce fails because fs needs to be reduced and checksize does not resize -not lvreduce -L-200M $vg/$lv -check lv_field $vg/$lv lv_size "456.00m" +not lvreduce -L-10M $vg/$lv + +check lv_field $vg/$lv lv_size "20.00m" mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" df --output=size "$mount_dir" |tee df2 # fs size unchanged diff df1 df2 umount "$mount_dir" -lvchange -an $vg/$lv -lvremove $vg/$lv +lvremove -f $vg + + +######################################################################### +# # repeat a couple prev lvreduce that had no --fs setting, # now using --fs checksize to verify it's the same as using no --fs set +# +######################################################################### # lvreduce, ext4, active, mounted, --fs checksize (same as no --fs set) # fs larger than the reduced size, fs not using reduced space -lvcreate -n $lv -L 456M $vg +lvcreate -n $lv -L 100M $vg mkfs.ext4 "$DM_DEV_DIR/$vg/$lv" mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=100 conv=fdatasync +dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=20 oflag=direct df --output=size "$mount_dir" |tee df1 # lvreduce fails because fs needs to be reduced and checksize does not resize -not lvreduce --fs checksize -L-200M $vg/$lv -check lv_field $vg/$lv lv_size "456.00m" +not lvreduce --fs checksize -L-50M $vg/$lv +check lv_field $vg/$lv lv_size "100.00m" df --output=size "$mount_dir" |tee df2 # fs size unchanged diff df1 df2 umount "$mount_dir" -lvchange -an $vg/$lv -lvremove $vg/$lv # lvreduce, ext4, active, unmounted, --fs checksize (same as no --fs set) # fs smaller than the reduced size -lvcreate -n $lv -L 200M $vg -mkfs.ext4 "$DM_DEV_DIR/$vg/$lv" -lvextend -L+256M $vg/$lv +lvextend -L+50M $vg/$lv mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=128 conv=fdatasync df --output=size "$mount_dir" |tee df1 umount "$mount_dir" -# fs is 200M, reduced size is 216M, so no fs reduce is needed -lvreduce --fs checksize -L216M $vg/$lv -check lv_field $vg/$lv lv_size "216.00m" + +# fs is 100M, reduced size is 120M, so no fs reduce is needed +lvreduce --fs checksize -L120M $vg/$lv +check lv_field $vg/$lv lv_size "120.00m" mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" df --output=size "$mount_dir" |tee df2 # fs size unchanged diff df1 df2 umount "$mount_dir" lvchange -an $vg/$lv -lvremove $vg/$lv # lvreduce with inactive and no --fs setting fails because # default behavior is fs checksize which activates the LV @@ -724,497 +417,168 @@ lvremove $vg/$lv # lvreduce, ext4, inactive, no --fs setting same as --fs checksize # fs larger than the reduced size, fs not using reduced space -lvcreate -n $lv -L 456M $vg -mkfs.ext4 "$DM_DEV_DIR/$vg/$lv" -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=100 conv=fdatasync -df --output=size "$mount_dir" |tee df1 -umount "$mount_dir" -lvchange -an $vg/$lv # lvreduce fails because default is --fs checksize which sees the fs -not lvreduce -L-200M $vg/$lv -check lv_field $vg/$lv lv_size "456.00m" -lvremove $vg/$lv +not lvreduce -L-100M $vg/$lv +check lv_field $vg/$lv lv_size "120.00m" +lvremove -f $vg/$lv + + +################################# # # lvreduce, ext4, --fs resize* # - -# lvreduce, ext4, active, mounted, --fs resize -# fs smaller than the reduced size -lvcreate -n $lv -L 200M $vg -mkfs.ext4 "$DM_DEV_DIR/$vg/$lv" -lvextend -L+256M $vg/$lv -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=128 conv=fdatasync -df --output=size "$mount_dir" |tee df1 -# fs is 200M, reduced size is 216M, so no fs reduce is needed -lvreduce -L216M $vg/$lv -check lv_field $vg/$lv lv_size "216.00m" -ls -l $mount_dir/zeros1 -df --output=size "$mount_dir" |tee df2 -# fs size unchanged -diff df1 df2 -umount "$mount_dir" -lvchange -an $vg/$lv -lvremove $vg/$lv - -# lvreduce, ext4, active, mounted, --fs resize -# fs equal to the reduced size -lvcreate -n $lv -L 200M $vg -mkfs.ext4 "$DM_DEV_DIR/$vg/$lv" -lvextend -L+256M $vg/$lv -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=128 conv=fdatasync -df --output=size "$mount_dir" |tee df1 -# fs is 200M, reduced size is 200M, so no fs reduce is needed -lvreduce -L200M $vg/$lv -check lv_field $vg/$lv lv_size "200.00m" -ls -l $mount_dir/zeros1 -df --output=size "$mount_dir" |tee df2 -# fs size unchanged -diff df1 df2 -umount "$mount_dir" -lvchange -an $vg/$lv -lvremove $vg/$lv +################################# # lvreduce, ext4, active, mounted, --fs resize # fs larger than the reduced size, fs not using reduced space -lvcreate -n $lv -L 456M $vg +lvcreate -n $lv -L 50M $vg mkfs.ext4 "$DM_DEV_DIR/$vg/$lv" mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=100 conv=fdatasync +dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=10 oflag=direct df --output=size "$mount_dir" |tee df1 # lvreduce runs resize2fs to shrink the fs -lvreduce --yes --fs resize -L-200M $vg/$lv -check lv_field $vg/$lv lv_size "256.00m" +lvreduce --yes --fs resize -L-20M $vg/$lv +check lv_field $vg/$lv lv_size "30.00m" ls -l $mount_dir/zeros1 df --output=size "$mount_dir" |tee df2 # fs size is changed not diff df1 df2 -umount "$mount_dir" -lvchange -an $vg/$lv -lvremove $vg/$lv # lvreduce, ext4, active, mounted, --fs resize # fs larger than the reduced size, fs is using reduced space -lvcreate -n $lv -L 456M $vg -mkfs.ext4 "$DM_DEV_DIR/$vg/$lv" -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=100 conv=fdatasync -dd if=/dev/zero of="$mount_dir/zeros2" bs=1M count=300 conv=fdatasync -df --output=size "$mount_dir" |tee df1 # lvreduce runs resize2fs to shrink the fs but resize2fs fails # the fs is not remounted after resize2fs fails because the # resize failure might leave the fs in an unknown state -not lvreduce --yes --fs resize -L-200M $vg/$lv -check lv_field $vg/$lv lv_size "456.00m" +not lvreduce --yes --fs resize -L-15M $vg/$lv +check lv_field $vg/$lv lv_size "30.00m" mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" ls -l $mount_dir/zeros1 -ls -l $mount_dir/zeros2 -df --output=size "$mount_dir" |tee df2 +df --output=size "$mount_dir" |tee df3 # fs size is unchanged -diff df1 df2 +diff df2 df3 umount "$mount_dir" -lvchange -an $vg/$lv -lvremove $vg/$lv -# repeat with unmounted instead of mounted +lvremove -f $vg/$lv -# lvreduce, ext4, active, unmounted, --fs resize -# fs smaller than the reduced size -lvcreate -n $lv -L 200M $vg -mkfs.ext4 "$DM_DEV_DIR/$vg/$lv" -lvextend -L+256M $vg/$lv -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=128 conv=fdatasync -df --output=size "$mount_dir" |tee df1 -umount "$mount_dir" -# fs is 200M, reduced size is 216M, so no fs reduce is needed -lvreduce -L216M $vg/$lv -check lv_field $vg/$lv lv_size "216.00m" -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -ls -l $mount_dir/zeros1 -df --output=size "$mount_dir" |tee df2 -# fs size unchanged -diff df1 df2 -umount "$mount_dir" -lvchange -an $vg/$lv -lvremove $vg/$lv -# lvreduce, ext4, active, unmounted, --fs resize -# fs equal to the reduced size -lvcreate -n $lv -L 200M $vg -mkfs.ext4 "$DM_DEV_DIR/$vg/$lv" -lvextend -L+256M $vg/$lv -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=128 conv=fdatasync -df --output=size "$mount_dir" |tee df1 -umount "$mount_dir" -# fs is 200M, reduced size is 200M, so no fs reduce is needed -lvreduce -L200M $vg/$lv -check lv_field $vg/$lv lv_size "200.00m" -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -ls -l $mount_dir/zeros1 -df --output=size "$mount_dir" |tee df2 -# fs size unchanged -diff df1 df2 -umount "$mount_dir" -lvchange -an $vg/$lv -lvremove $vg/$lv +############################################ +# +# repeat with unmounted instead of mounted +# +############################################ # lvreduce, ext4, active, unmounted, --fs resize # fs larger than the reduced size, fs not using reduced space -lvcreate -n $lv -L 456M $vg +lvcreate -n $lv -L 50M $vg mkfs.ext4 "$DM_DEV_DIR/$vg/$lv" mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=100 conv=fdatasync +dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=10 oflag=direct df --output=size "$mount_dir" |tee df1 umount "$mount_dir" # lvreduce runs resize2fs to shrink the fs -lvreduce --fs resize -L-200M $vg/$lv -check lv_field $vg/$lv lv_size "256.00m" +lvreduce --fs resize -L-20M $vg/$lv +check lv_field $vg/$lv lv_size "30.00m" mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" ls -l $mount_dir/zeros1 df --output=size "$mount_dir" |tee df2 # fs size is changed not diff df1 df2 umount "$mount_dir" -lvchange -an $vg/$lv -lvremove $vg/$lv # lvreduce, ext4, active, unmounted, --fs resize # fs larger than the reduced size, fs is using reduced space -lvcreate -n $lv -L 456M $vg -mkfs.ext4 "$DM_DEV_DIR/$vg/$lv" -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=100 conv=fdatasync -dd if=/dev/zero of="$mount_dir/zeros2" bs=1M count=300 conv=fdatasync -df --output=size "$mount_dir" |tee df1 -umount "$mount_dir" # lvreduce runs resize2fs to shrink the fs but resize2fs fails -not lvreduce --yes --fs resize -L-200M $vg/$lv -check lv_field $vg/$lv lv_size "456.00m" +not lvreduce --yes --fs resize -L-10M $vg/$lv +check lv_field $vg/$lv lv_size "30.00m" mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" ls -l $mount_dir/zeros1 -df --output=size "$mount_dir" |tee df2 +df --output=size "$mount_dir" |tee df3 # fs size is unchanged -diff df1 df2 +diff df2 df3 umount "$mount_dir" lvchange -an $vg/$lv lvremove $vg/$lv + +################################################################## +# # repeat resizes that shrink the fs, replacing --fs resize with # --fs resize --fsmode nochange|offline, --fs resize_fsadm. # while mounted and unmounted +# +################################################################## # lvreduce, ext4, active, mounted, --fs resize --fsmode nochange # fs larger than the reduced size, fs not using reduced space -lvcreate -n $lv -L 456M $vg +lvcreate -n $lv -L 90M $vg mkfs.ext4 "$DM_DEV_DIR/$vg/$lv" mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=100 conv=fdatasync +dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=10 oflag=direct df --output=size "$mount_dir" |tee df1 # lvreduce needs to unmount to run resize2fs but fsmode nochange doesn't let it -not lvreduce --fs resize --fsmode nochange -L-200M $vg/$lv -check lv_field $vg/$lv lv_size "456.00m" +not lvreduce --fs resize --fsmode nochange -L-10M $vg/$lv +check lv_field $vg/$lv lv_size "90.00m" df --output=size "$mount_dir" |tee df2 # fs size is unchanged diff df1 df2 umount "$mount_dir" -lvchange -an $vg/$lv -lvremove $vg/$lv # lvreduce, ext4, active, unmounted, --fs resize --fsmode nochange # fs larger than the reduced size, fs not using reduced space -lvcreate -n $lv -L 456M $vg -mkfs.ext4 "$DM_DEV_DIR/$vg/$lv" -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=100 conv=fdatasync -df --output=size "$mount_dir" |tee df1 -umount "$mount_dir" # lvreduce runs resize2fs to shrink the fs -lvreduce --fs resize --fsmode nochange -L-200M $vg/$lv -check lv_field $vg/$lv lv_size "256.00m" +lvreduce --fs resize --fsmode nochange -L-10M $vg/$lv +check lv_field $vg/$lv lv_size "80.00m" mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -df --output=size "$mount_dir" |tee df2 +df --output=size "$mount_dir" |tee df3 # fs size is changed -not diff df1 df2 -umount "$mount_dir" -lvchange -an $vg/$lv -lvremove $vg/$lv +not diff df2 df3 +# keep fs mounted # lvreduce, ext4, active, mounted, --fs resize --fsmode offline # fs larger than the reduced size, fs not using reduced space -lvcreate -n $lv -L 456M $vg -mkfs.ext4 "$DM_DEV_DIR/$vg/$lv" -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=100 conv=fdatasync -df --output=size "$mount_dir" |tee df1 # lvreduce runs resize2fs to shrink the fs # fsmode offline leaves the fs unmounted -lvreduce --fs resize --fsmode offline -L-200M $vg/$lv -check lv_field $vg/$lv lv_size "256.00m" +lvreduce --fs resize --fsmode offline -L-10M $vg/$lv +check lv_field $vg/$lv lv_size "70.00m" mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -df --output=size "$mount_dir" |tee df2 +df --output=size "$mount_dir" |tee df4 # fs size is changed -not diff df1 df2 +not diff df3 df4 umount "$mount_dir" -lvchange -an $vg/$lv -lvremove $vg/$lv # lvreduce, ext4, active, unmounted, --fs resize --fsmode offline # fs larger than the reduced size, fs not using reduced space -lvcreate -n $lv -L 456M $vg -mkfs.ext4 "$DM_DEV_DIR/$vg/$lv" -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=100 conv=fdatasync -df --output=size "$mount_dir" |tee df1 -umount "$mount_dir" # lvreduce runs resize2fs to shrink the fs -lvreduce --fs resize --fsmode offline -L-200M $vg/$lv -check lv_field $vg/$lv lv_size "256.00m" +lvreduce --fs resize --fsmode offline -L-10M $vg/$lv +check lv_field $vg/$lv lv_size "60.00m" mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -df --output=size "$mount_dir" |tee df2 +df --output=size "$mount_dir" |tee df5 # fs size is changed -not diff df1 df2 -umount "$mount_dir" -lvchange -an $vg/$lv -lvremove $vg/$lv +not diff df4 df5 +# keep fs mounted # lvreduce, ext4, active, mounted, --fs resize_fsadm # fs larger than the reduced size, fs not using reduced space -lvcreate -n $lv -L 456M $vg -mkfs.ext4 "$DM_DEV_DIR/$vg/$lv" -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=100 conv=fdatasync -df --output=size "$mount_dir" |tee df1 # lvreduce runs resize2fs to shrink the fs -lvreduce --yes --fs resize_fsadm -L-200M $vg/$lv -check lv_field $vg/$lv lv_size "256.00m" +lvreduce --yes --fs resize_fsadm -L-10M $vg/$lv +check lv_field $vg/$lv lv_size "50.00m" ls -l $mount_dir/zeros1 -df --output=size "$mount_dir" |tee df2 +df --output=size "$mount_dir" |tee df6 # fs size is changed -not diff df1 df2 +not diff df5 df6 umount "$mount_dir" -lvchange -an $vg/$lv -lvremove $vg/$lv # lvreduce, ext4, active, unmounted, --fs resize_fsadm # fs larger than the reduced size, fs not using reduced space -lvcreate -n $lv -L 456M $vg -mkfs.ext4 "$DM_DEV_DIR/$vg/$lv" -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=100 conv=fdatasync -df --output=size "$mount_dir" |tee df1 -umount "$mount_dir" # lvreduce runs resize2fs to shrink the fs -lvreduce --fs resize_fsadm -L-200M $vg/$lv -check lv_field $vg/$lv lv_size "256.00m" +lvreduce --fs resize_fsadm -L-10M $vg/$lv +check lv_field $vg/$lv lv_size "40.00m" mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -df --output=size "$mount_dir" |tee df2 +df --output=size "$mount_dir" |tee df7 # fs size is changed -not diff df1 df2 -umount "$mount_dir" -lvchange -an $vg/$lv -lvremove $vg/$lv - -# -# lvreduce, xfs (xfs does not support shrinking) -# - -# lvreduce, xfs, active, mounted, no --fs setting is same as --fs checksize -# fs smaller than the reduced size -lvcreate -n $lv -L 200M $vg -mkfs.xfs "$DM_DEV_DIR/$vg/$lv" -lvextend -L+256M $vg/$lv -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=128 conv=fdatasync -df --output=size "$mount_dir" |tee df1 -# fs is 200M, reduced size is 216M, so no fs reduce is needed -lvreduce -L216M $vg/$lv -check lv_field $vg/$lv lv_size "216.00m" -df --output=size "$mount_dir" |tee df2 -# fs size unchanged -diff df1 df2 -umount "$mount_dir" -lvchange -an $vg/$lv -lvremove $vg/$lv - -# lvreduce, xfs, active, mounted, no --fs setting is same as --fs checksize -# fs equal to the reduced size -lvcreate -n $lv -L 200M $vg -mkfs.xfs "$DM_DEV_DIR/$vg/$lv" -lvextend -L+256M $vg/$lv -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=128 conv=fdatasync -df --output=size "$mount_dir" |tee df1 -# fs is 200M, reduced size is 200M, so no fs reduce is needed -lvreduce -L200M $vg/$lv -check lv_field $vg/$lv lv_size "200.00m" -df --output=size "$mount_dir" |tee df2 -# fs size unchanged -diff df1 df2 -umount "$mount_dir" -lvchange -an $vg/$lv -lvremove $vg/$lv - -# lvreduce, xfs, active, mounted, no --fs setting is same as --fs checksize -# fs larger than the reduced size, fs not using reduced space -lvcreate -n $lv -L 456M $vg -mkfs.xfs "$DM_DEV_DIR/$vg/$lv" -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=100 conv=fdatasync -df --output=size "$mount_dir" |tee df1 -# lvreduce fails because fs needs to be reduced -not lvreduce -L-200M $vg/$lv -check lv_field $vg/$lv lv_size "456.00m" -df --output=size "$mount_dir" |tee df2 -# fs size unchanged -diff df1 df2 -umount "$mount_dir" -lvchange -an $vg/$lv -lvremove $vg/$lv - -# lvreduce, xfs, active, unmounted, no --fs setting is same as --fs checksize -# fs smaller than the reduced size -lvcreate -n $lv -L 200M $vg -mkfs.xfs "$DM_DEV_DIR/$vg/$lv" -lvextend -L+256M $vg/$lv -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=128 conv=fdatasync -df --output=size "$mount_dir" |tee df1 -umount "$mount_dir" -# fs is 200M, reduced size is 216M, so no fs reduce is needed -lvreduce -L216M $vg/$lv -check lv_field $vg/$lv lv_size "216.00m" -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -df --output=size "$mount_dir" |tee df2 -# fs size unchanged -diff df1 df2 -umount "$mount_dir" -lvchange -an $vg/$lv -lvremove $vg/$lv - -# lvreduce, xfs, active, mounted, --fs resize -# fs smaller than the reduced size -lvcreate -n $lv -L 200M $vg -mkfs.xfs "$DM_DEV_DIR/$vg/$lv" -lvextend -L+256M $vg/$lv -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=128 conv=fdatasync -df --output=size "$mount_dir" |tee df1 -# fs is 200M, reduced size is 216M, so no fs reduce is needed -lvreduce -L216M $vg/$lv -check lv_field $vg/$lv lv_size "216.00m" -df --output=size "$mount_dir" |tee df2 -# fs size unchanged -diff df1 df2 -umount "$mount_dir" -lvchange -an $vg/$lv -lvremove $vg/$lv - -# lvreduce, xfs, active, mounted, --fs resize -# fs larger than the reduced size, fs not using reduced space -lvcreate -n $lv -L 456M $vg -mkfs.xfs "$DM_DEV_DIR/$vg/$lv" -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=100 conv=fdatasync -df --output=size "$mount_dir" |tee df1 -# lvreduce fails because xfs cannot shrink -not lvreduce --yes --fs resize -L-200M $vg/$lv -check lv_field $vg/$lv lv_size "456.00m" -df --output=size "$mount_dir" |tee df2 -# fs size unchanged -diff df1 df2 -umount "$mount_dir" -lvchange -an $vg/$lv -lvremove $vg/$lv - -# lvreduce, xfs, active, unmounted, --fs resize* -# fs larger than the reduced size, fs not using reduced space -lvcreate -n $lv -L 456M $vg -mkfs.xfs "$DM_DEV_DIR/$vg/$lv" -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=100 conv=fdatasync -df --output=size "$mount_dir" |tee df1 -umount "$mount_dir" -# lvreduce fails because xfs cannot shrink -not lvreduce --yes --fs resize -L-200M $vg/$lv -check lv_field $vg/$lv lv_size "456.00m" -not lvreduce --yes --fs resize --fsmode manage -L-200M $vg/$lv -check lv_field $vg/$lv lv_size "456.00m" -not lvreduce --yes --fs resize --fsmode nochange -L-200M $vg/$lv -check lv_field $vg/$lv lv_size "456.00m" -not lvreduce --yes --fs resize --fsmode offline -L-200M $vg/$lv -check lv_field $vg/$lv lv_size "456.00m" -not lvreduce --yes --fs resize_fsadm -L-200M $vg/$lv -check lv_field $vg/$lv lv_size "456.00m" -not lvreduce --yes --resizefs -L-200M $vg/$lv -check lv_field $vg/$lv lv_size "456.00m" -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -df --output=size "$mount_dir" |tee df2 -# fs size unchanged -diff df1 df2 -umount "$mount_dir" -lvchange -an $vg/$lv -lvremove $vg/$lv - -# lvreduce, xfs, inactive, no --fs setting is same as --fs checksize -# fs equal to the reduced size -lvcreate -n $lv -L 200M $vg -mkfs.xfs "$DM_DEV_DIR/$vg/$lv" -lvextend -L+256M $vg/$lv -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=128 conv=fdatasync -df --output=size "$mount_dir" |tee df1 -umount "$mount_dir" -lvchange -an $vg/$lv -# no fs reduce is needed -lvreduce --fs checksize -L200M $vg/$lv -check lv_field $vg/$lv lv_size "200.00m" -lvchange -ay $vg/$lv -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -df --output=size "$mount_dir" |tee df2 -# fs size unchanged -diff df1 df2 +not diff df6 df7 umount "$mount_dir" -lvchange -an $vg/$lv -lvremove $vg/$lv -# lvreduce, xfs, inactive, no fs setting is same as --fs checksize -# fs smaller than the reduced size -lvcreate -n $lv -L 200M $vg -mkfs.xfs "$DM_DEV_DIR/$vg/$lv" -lvextend -L+256M $vg/$lv -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=128 conv=fdatasync -df --output=size "$mount_dir" |tee df1 -umount "$mount_dir" -lvchange -an $vg/$lv -# fs is 200M, reduced size is 216M, so no fs reduce is needed -lvreduce --fs checksize -L216M $vg/$lv -check lv_field $vg/$lv lv_size "216.00m" -lvchange -ay $vg/$lv -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -df --output=size "$mount_dir" |tee df2 -# fs size unchanged -diff df1 df2 -umount "$mount_dir" -lvchange -an $vg/$lv -lvremove $vg/$lv - -# lvreduce, xfs, inactive, no --fs setting is same as --fs checksize -# fs larger than the reduced size -lvcreate -n $lv -L 456M $vg -mkfs.xfs "$DM_DEV_DIR/$vg/$lv" -mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" -dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=100 conv=fdatasync -umount "$mount_dir" -lvchange -an $vg/$lv -# lvreduce fails because fs needs to be reduced -not lvreduce -L-200M $vg/$lv -check lv_field $vg/$lv lv_size "456.00m" -lvremove $vg/$lv vgremove -ff $vg diff --git a/test/shell/lvresize-xfs.sh b/test/shell/lvresize-xfs.sh new file mode 100644 index 000000000..0a3b89012 --- /dev/null +++ b/test/shell/lvresize-xfs.sh @@ -0,0 +1,301 @@ +#!/usr/bin/env bash + +# Copyright (C) 2023 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + +SKIP_WITH_LVMPOLLD=1 + +. lib/inittest + +aux prepare_vg 1 500 + +which mkfs.xfs || skip +which xfs_growfs || skip + +mount_dir="mnt_lvresize_fs" +mkdir -p "$mount_dir" + +mount_dir_space="other mnt dir" +mkdir -p "$mount_dir_space" + + +# Test combinations of the following: +# lvreduce / lvextend +# xfs +# each --fs opt / no --fs opt / --resizefs +# active / inactive +# mounted / unmounted +# fs size less than, equal to or greater than reduced lv size + +################# +# +# lvextend, xfs +# +################# + +# lvextend, xfs, active, mounted, no --fs setting is same as --fs ignore +lvcreate -n $lv -L 300M $vg +mkfs.xfs "$DM_DEV_DIR/$vg/$lv" +mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" +df --output=size "$mount_dir" |tee df1 +dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=10 oflag=direct +lvextend -L+20M $vg/$lv +check lv_field $vg/$lv lv_size "320.00m" +# with no --fs used, the fs size should be the same +df --output=size "$mount_dir" |tee df2 +diff df1 df2 +xfs_growfs "$DM_DEV_DIR/$vg/$lv" +df --output=size "$mount_dir" |tee df3 +not diff df2 df3 +dd if=/dev/zero of="$mount_dir/zeros2" bs=1M count=20 oflag=direct +# keep it mounted + +# lvextend, xfs, active, mounted, --fs ignore +df --output=size "$mount_dir" |tee df1 +lvextend --fs ignore -L+20 $vg/$lv +check lv_field $vg/$lv lv_size "340.00m" +df --output=size "$mount_dir" |tee df2 +diff df1 df2 + +# lvextend, xfs, active, mounted, --fs resize +lvextend --fs resize -L+20M $vg/$lv +check lv_field $vg/$lv lv_size "360.00m" +df --output=size "$mount_dir" |tee df3 +not diff df2 df3 + +# lvextend, xfs, active, mounted, --resizefs (same as --fs resize) +lvextend --resizefs -L+10M $vg/$lv +check lv_field $vg/$lv lv_size "370.00m" +df --output=size "$mount_dir" |tee df4 +not diff df3 df4 + +# lvextend, xfs, active, mounted, --fs resize --fsmode manage (same as --fs resize) +lvextend --fs resize --fsmode manage -L+10M $vg/$lv +check lv_field $vg/$lv lv_size "380.00m" +df --output=size "$mount_dir" |tee df2 +not diff df1 df2 + +umount "$mount_dir" +lvchange -an $vg/$lv + +# lvextend, xfs, inactive, --fs ignore +lvextend --fs ignore -L+20M $vg/$lv +check lv_field $vg/$lv lv_size "400.00m" + +lvremove -f $vg/$lv + +#################### +# start with new fs +#################### + +# lvextend, xfs, active, mounted, --fs resize --fsmode offline +lvcreate -n $lv -L 300M $vg +mkfs.xfs "$DM_DEV_DIR/$vg/$lv" +mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir_space" +df --output=size "$mount_dir_space" |tee df1 +dd if=/dev/zero of="$mount_dir_space/zeros1" bs=1M count=20 oflag=direct +# xfs_growfs requires the fs to be mounted, so extending the lv is +# succeeds, then the xfs extend fails because it cannot be done unmounted +not lvextend --fs resize --fsmode offline -L+20M $vg/$lv +check lv_field $vg/$lv lv_size "320.00m" +df -a | tee dfa +grep "$mount_dir_space" dfa +df --output=size "$mount_dir_space" |tee df2 +# fs not extended so fs size not changed +diff df1 df2 + +# lvextend, xfs, active, mounted, --fs resize --fsmode nochange +lvextend --fs resize --fsmode nochange -L+20M $vg/$lv +check lv_field $vg/$lv lv_size "340.00m" +df --output=size "$mount_dir_space" |tee df2 +not diff df1 df2 + +# lvextend, xfs, active, mounted, --fs resize_fsadm +lvextend --fs resize_fsadm -L+20M $vg/$lv +check lv_field $vg/$lv lv_size "360.00m" +df --output=size "$mount_dir_space" |tee df3 +not diff df2 df3 +umount "$mount_dir_space" + +# lvextend, xfs, active, unmounted, --fs resize --fsmode nochange +# xfs_growfs requires the fs to be mounted to grow, so --fsmode nochange +# with an unmounted fs fails +not lvextend --fs resize --fsmode nochange -L+20M $vg/$lv +check lv_field $vg/$lv lv_size "380.00m" +mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir_space" +df --output=size "$mount_dir_space" |tee df4 +# fs not extended so fs size not changed +diff df3 df4 +umount "$mount_dir_space" + +# lvextend, xfs, active, unmounted, --fs resize +# --yes needed because mount changes are required and plain "resize" +# fsopt did not specify if the user wants to change mount state +lvextend --yes --fs resize -L+10M $vg/$lv +check lv_field $vg/$lv lv_size "390.00m" +mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir_space" +df --output=size "$mount_dir_space" |tee df5 +not diff df4 df5 +umount "$mount_dir_space" + +# lvextend, xfs, active, unmounted, --fs resize_fsadm +lvextend --fs resize_fsadm -L+10M $vg/$lv +check lv_field $vg/$lv lv_size "400.00m" +mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir_space" +df --output=size "$mount_dir_space" |tee df6 +not diff df5 df6 +umount "$mount_dir_space" +lvremove -f $vg/$lv + + +################################################# +# +# lvreduce, xfs (xfs does not support shrinking) +# +################################################## + +# lvreduce, xfs, active, mounted, no --fs setting is same as --fs checksize +# fs smaller than the reduced size +lvcreate -n $lv -L 300M $vg +mkfs.xfs "$DM_DEV_DIR/$vg/$lv" +lvextend -L+100M $vg/$lv +mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" +dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=20 oflag=direct +df --output=size "$mount_dir" |tee df1 +# fs is 300M, reduced size is 326M, so no fs reduce is needed +lvreduce -L326M $vg/$lv +check lv_field $vg/$lv lv_size "326.00m" +df --output=size "$mount_dir" |tee df2 +# fs size unchanged +diff df1 df2 +umount "$mount_dir" +lvchange -an $vg/$lv + +# lvreduce, xfs, inactive, no fs setting is same as --fs checksize +# fs smaller than the reduced size +# fs is 200M, reduced size is 216M, so no fs reduce is needed +lvreduce --fs checksize -L316M $vg/$lv +check lv_field $vg/$lv lv_size "316.00m" +lvchange -ay $vg/$lv +mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" +df --output=size "$mount_dir" |tee df2 +# fs size unchanged +diff df1 df2 + +# lvreduce, xfs, active, mounted, no --fs setting is same as --fs checksize +# fs equal to the reduced size +# fs is 300M, reduced size is 300M, so no fs reduce is needed +lvreduce -L300M $vg/$lv +check lv_field $vg/$lv lv_size "300.00m" +df --output=size "$mount_dir" |tee df2 +# fs size unchanged +diff df1 df2 + +# lvreduce, xfs, active, unmounted, no --fs setting is same as --fs checksize +# fs smaller than the reduced size +lvextend -L+100M $vg/$lv +umount "$mount_dir" +# fs is 300M, reduced size is 316M, so no fs reduce is needed +lvreduce -L356M $vg/$lv +check lv_field $vg/$lv lv_size "356.00m" +mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" +df --output=size "$mount_dir" |tee df2 +# fs size unchanged +diff df1 df2 + +# lvreduce, xfs, active, mounted, --fs resize +# fs smaller than the reduced size +# fs is 300M, reduced size is 316M, so no fs reduce is needed +lvreduce -L316M $vg/$lv +check lv_field $vg/$lv lv_size "316.00m" +df --output=size "$mount_dir" |tee df2 +# fs size unchanged +diff df1 df2 +umount "$mount_dir" +lvchange -an $vg/$lv + + +# lvreduce, xfs, inactive, no --fs setting is same as --fs checksize +# fs equal to the reduced size +# fs is 300M, reduced size is 300M, so no fs reduce is needed +lvreduce --fs checksize -L300M $vg/$lv +check lv_field $vg/$lv lv_size "300.00m" +lvchange -ay $vg/$lv +mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" +df --output=size "$mount_dir" |tee df2 +# fs size unchanged +diff df1 df2 +umount "$mount_dir" + +lvremove -f $vg/$lv + + +########################################################## +# +# lvreduce bigger xfs size (xfs does not support shrinking) +# +########################################################## + +# lvreduce, xfs, active, mounted, no --fs setting is same as --fs checksize +# fs larger than the reduced size, fs not using reduced space +lvcreate -n $lv -L 400M $vg +mkfs.xfs "$DM_DEV_DIR/$vg/$lv" +mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" +dd if=/dev/zero of="$mount_dir/zeros1" bs=1M count=20 oflag=direct +df --output=size "$mount_dir" |tee df1 +# lvreduce fails because fs needs to be reduced +not lvreduce -L-100M $vg/$lv +check lv_field $vg/$lv lv_size "400.00m" +df --output=size "$mount_dir" |tee df2 +# fs size unchanged +diff df1 df2 +# keep fs mounted + +# lvreduce, xfs, active, mounted, --fs resize +# fs larger than the reduced size, fs not using reduced space +# lvreduce fails because xfs cannot shrink +not lvreduce --yes --fs resize -L-100M $vg/$lv +check lv_field $vg/$lv lv_size "400.00m" +df --output=size "$mount_dir" |tee df2 +# fs size unchanged +diff df1 df2 +umount "$mount_dir" + +# lvreduce, xfs, active, unmounted, --fs resize* +# fs larger than the reduced size, fs not using reduced space +# lvreduce fails because xfs cannot shrink +not lvreduce --yes --fs resize -L-100M $vg/$lv +check lv_field $vg/$lv lv_size "400.00m" +not lvreduce --yes --fs resize --fsmode manage -L-100M $vg/$lv +check lv_field $vg/$lv lv_size "400.00m" +not lvreduce --yes --fs resize --fsmode nochange -L-100M $vg/$lv +check lv_field $vg/$lv lv_size "400.00m" +not lvreduce --yes --fs resize --fsmode offline -L-100M $vg/$lv +check lv_field $vg/$lv lv_size "400.00m" +not lvreduce --yes --fs resize_fsadm -L-100M $vg/$lv +check lv_field $vg/$lv lv_size "400.00m" +not lvreduce --yes --resizefs -L-100M $vg/$lv +check lv_field $vg/$lv lv_size "400.00m" + +mount "$DM_DEV_DIR/$vg/$lv" "$mount_dir" +df --output=size "$mount_dir" |tee df2 +# fs size unchanged +diff df1 df2 +umount "$mount_dir" +lvchange -an $vg/$lv + +# lvreduce, xfs, inactive, no --fs setting is same as --fs checksize +# fs larger than the reduced size +# lvreduce fails because fs needs to be reduced +not lvreduce -L-100M $vg/$lv +check lv_field $vg/$lv lv_size "400.00m" + +vgremove -f $vg |