summaryrefslogtreecommitdiff
path: root/test/shell/lvresize-xfs.sh
diff options
context:
space:
mode:
Diffstat (limited to 'test/shell/lvresize-xfs.sh')
-rw-r--r--test/shell/lvresize-xfs.sh301
1 files changed, 301 insertions, 0 deletions
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