lvm2/fate-31841-01_fsadm-add-support-to-resize-check-btrfs-filesystem.patch
Gang He e8bec48e22 Accepting request 906108 from home:hmzhao:branches:openSUSE:Factory
- lvm2: double free or corruption with invalid LVM_SYSTEM_DIR breaks guestfs-tools (bsc#1188141)
  + bug-1188141_toolcontext-fix-double-free-core-dumped-issue.patch
- replace exist patch with bug fixed patches
  - (remove) fate-31841_fsadm-add-support-for-btrfs.patch
  + (add) fate-31841-01_fsadm-add-support-to-resize-check-btrfs-filesystem.patch
  + (add) fate-31841-02_man-add-support-for-btrfs.patch
  + (add) fate-31841-03_tests-new-test-suite-of-fsadm-for-btrfs.patch

OBS-URL: https://build.opensuse.org/request/show/906108
OBS-URL: https://build.opensuse.org/package/show/Base:System/lvm2?expand=0&rev=302
2021-07-14 05:55:59 +00:00

192 lines
6.0 KiB
Diff

From 29562a0f53dad77d5d62f5d8b3bf29401d619867 Mon Sep 17 00:00:00 2001
From: Heming Zhao <heming.zhao@suse.com>
Date: Wed, 30 Jun 2021 18:34:27 +0800
Subject: [PATCH 1/3] fsadm: add support to resize & check btrfs filesystem
To: lvm-devel@redhat.com,
zkabelac@redhat.com,
teigland@redhat.com
resize:
btrfs volume may spanning across multiple block devices. resize action should
specific subvolume to not to break the filesystem on LV about to get resized
with lvresize.
this patch finds the mount point first and resizes the filesystem after
getting the device id since there are maybe several devices underneath btrfs
filesystem
check:
check the data integrity.
this patch mounts the device first and then runs `btrfs filesystem scrub
start -B` command
refer legacy patches:
- Ondrej Kozina <okozina@redhat.com>
https://listman.redhat.com/archives/lvm-devel/2012-November/msg00052.html
- Lidong Zhong <lzhong@suse.com>
https://listman.redhat.com/archives/lvm-devel/2015-March/msg00053.html
Signed-off-by: Heming Zhao <heming.zhao@suse.com>
---
scripts/fsadm.sh | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 86 insertions(+), 2 deletions(-)
diff --git a/scripts/fsadm.sh b/scripts/fsadm.sh
index 9ae422f55edf..a7345c503f77 100755
--- a/scripts/fsadm.sh
+++ b/scripts/fsadm.sh
@@ -22,6 +22,7 @@
# ext2/ext3/ext4: resize2fs, tune2fs
# reiserfs: resize_reiserfs, reiserfstune
# xfs: xfs_growfs, xfs_info
+# btrfs: btrfs
#
# Return values:
# 0 success
@@ -59,6 +60,7 @@ XFS_CHECK="xfs_check"
# XFS_REPAIR -n is used when XFS_CHECK is not found
XFS_REPAIR="xfs_repair"
CRYPTSETUP="cryptsetup"
+BTRFS="btrfs"
# user may override lvm location by setting LVM_BINARY
LVM=${LVM_BINARY:-lvm}
@@ -78,6 +80,9 @@ BLOCKCOUNT=
MOUNTPOINT=
MOUNTED=
REMOUNT=
+FINDMNT=
+UUID=
+BTRFS_DEVID=
PROCDIR="/proc"
PROCMOUNTS="$PROCDIR/mounts"
PROCSELFMOUNTINFO="$PROCDIR/self/mountinfo"
@@ -237,6 +242,33 @@ detect_fs() {
verbose "\"$FSTYPE\" filesystem found on \"$VOLUME\"."
}
+check_findmnt() {
+ FINDMNT=$(which findmnt 2>$NULL)
+ test -n "$FINDMNT"
+}
+
+detect_fs_uuid() {
+ UUID=$($BLKID -o value -c $NULL -s UUID "$VOLUME" 2>$NULL)
+ test -n "$UUID"
+}
+
+#find the mountpoint of this device
+detect_mounted_findmnt() {
+ local TMP
+ local STR_IFS=$IFS
+ IFS=" $(echo -n -e '\t')"
+
+ read -r TMP<<EOF
+$($FINDMNT -nuP -o TARGET,UUID 2>$NULL | $GREP "$UUID")
+EOF
+
+ TMP=${TMP##*TARGET=\"}
+ TMP=${TMP%%\"*}
+ MOUNTED=$TMP
+ test -n "$MOUNTED"
+
+ IFS=$STR_IFS
+}
# Check that passed mounted MAJOR:MINOR is not matching $MAJOR:MINOR of resized $VOLUME
validate_mounted_major_minor() {
@@ -365,7 +397,11 @@ detect_mounted_with_proc_mounts() {
# check if the given device is already mounted and where
# FIXME: resolve swap usage and device stacking
detect_mounted() {
- if test -e "$PROCSELFMOUNTINFO"; then
+ if test "$FSTYPE" = "btrfs" ; then
+ check_findmnt || error "Need 'findmnt' utility to work with btrfs filesystem"
+ detect_fs_uuid || verbose "Can't get fs UUID from \"$VOLUME\" volume"
+ detect_mounted_findmnt
+ elif test -e "$PROCSELFMOUNTINFO"; then
detect_mounted_with_proc_self_mountinfo
elif test -e "$PROCMOUNTS"; then
detect_mounted_with_proc_mounts
@@ -662,6 +698,47 @@ resize_crypt() {
dry "$CRYPTSETUP" resize "$1" --size $CRYPT_RESIZE_BLOCKS || error "$CRYPTSETUP failed to resize device $1"
}
+########################
+# Resize btrfs filesystem
+# - mounted for upsize/downsize
+# - cannot resize when unmounted
+########################
+resize_btrfs() {
+ detect_mounted
+ MOUNTPOINT=$MOUNTED
+ if [ -z "$MOUNTED" ]; then
+ MOUNTPOINT=$TEMPDIR
+ temp_mount || error "Cannot mount Btrfs filesystem"
+ fi
+
+ verbose "Parsing $BTRFS filesystem show \"$MOUNTPOINT\""
+ for i in $(LC_ALL=C "$BTRFS" filesystem show "$MOUNTPOINT"); do
+ case "$i" in
+ *"$VOLUME") BTRFS_DEVID=${i##*devid};;
+ esac
+ done
+
+ # If dev doesn't locate in "/dev", 'btrfs filesystem show' will mistakely
+ # report path. Below is a work around to get correct lvm dev path.
+ if [ -z "$BTRFS_DEVID" ];then
+ for i in $(LC_ALL=C "$BTRFS" filesystem show "$MOUNTPOINT"); do
+ case "$i" in
+ *" path "*)
+ path_str=${i##*path}
+ path_str=$(echo $path_str|sed 's/^[ \t]*//g'|sed 's/[ \t]*$'//g)
+ result=$(echo $VOLUME | grep -E "${path_str}$")
+ test -n "$result" && BTRFS_DEVID=${i##*devid}
+ ;;
+ esac
+ done
+ fi
+ BTRFS_DEVID=${BTRFS_DEVID%%size*}
+ BTRFS_DEVID=$(echo $BTRFS_DEVID|sed 's/^[ \t]*//g'|sed 's/[ \t]*$'//g)
+ decode_size $1 1
+ verbose "Resizing filesystem on device \"$VOLUME\" to $NEWSIZE bytes(btrfs devid: $BTRFS_DEVID) "
+ dry "$BTRFS" filesystem resize "$BTRFS_DEVID":"$NEWSIZE" "$MOUNTPOINT"
+}
+
####################
# Resize filesystem
####################
@@ -685,6 +762,7 @@ resize() {
"crypto_LUKS")
which "$CRYPTSETUP" >"$NULL" 2>&1 || error "$CRYPTSETUP utility required to resize LUKS volume"
CMD=resize_luks ;;
+ "btrfs") CMD=resize_btrfs ;;
*) error "Filesystem \"$FSTYPE\" on device \"$VOLUME\" is not supported by this tool." ;;
esac
@@ -762,6 +840,12 @@ check() {
which "$CRYPTSETUP" >"$NULL" 2>&1 || error "$CRYPTSETUP utility required."
check_luks || error "Crypto luks check failed."
;;
+ "btrfs") #mount the device first and then run scrub
+ MOUNTPOINT=$TEMPDIR
+ temp_mount || error "Cannot mount btrfs filesystem"
+ dry "$BTRFS" scrub start -B "$VOLUME"
+ test "$MOUNTPOINT" = "$TEMPDIR" && MOUNTPOINT="" temp_umount
+ ;;
*)
error "Filesystem \"$FSTYPE\" on device \"$VOLUME\" is not supported by this tool." ;;
esac
@@ -780,7 +864,7 @@ test -n "${FSADM_RUNNING-}" && exit 0
for i in "$TUNE_EXT" "$RESIZE_EXT" "$TUNE_REISER" "$RESIZE_REISER" \
"$TUNE_XFS" "$RESIZE_XFS" "$MOUNT" "$UMOUNT" "$MKDIR" \
"$RMDIR" "$BLOCKDEV" "$BLKID" "$GREP" "$READLINK" \
- "$DATE" "$FSCK" "$XFS_CHECK" "$XFS_REPAIR" "$LVM" ; do
+ "$DATE" "$FSCK" "$XFS_CHECK" "$XFS_REPAIR" "$LVM" "$BTRFS" ; do
test -n "$i" || error "Required command definitions in the script are missing!"
done
--
1.8.3.1