lvm2/fate-31841_fsadm-add-support-for-btrfs.patch
Eric ren 991b3eea09 Accepting request 558347 from network:ha-clustering:Unstable
- device-mapper.spec: fix wrong replacement of DM_VERSION (bsc#1072524) 
- Fixes failure of some testcases caused by nc behavior change (bsc#1072624)
 + bug-1072624_test-lvmetad_dump-always-timed-out-when-using-nc.patch
- Refreshed fate-31841_fsadm-add-support-for-btrfs.patch
- Update to LVM2.2.02.177
  When writing text metadata content, use complete 4096 byte blocks.
  Change text format metadata alignment from 512 to 4096 bytes.
  When writing metadata, consistently skip mdas marked as failed.
  Refactor and adjust text format metadata alignment calculation.
  Ensure _node_send_message always uses clean status of thin pool.
  Fix lvmlockd to use pool lock when accessing _tmeta volume.
  Report expected sanlock_convert errors only when retries fail.
  Avoid blocking in sanlock_convert on SH to EX lock conversion.
  Deactivate missing raid LV legs (_rimage_X-missing_Y_Z) on decativation.
  Categorise I/O with reason annotations in debug messages.
  Allow extending of raid LVs created with --nosync after a failed repair.
  Command will lock memory only when suspending volumes.
  Merge segments when pvmove is finished.
  Activation code for pvmove automatically discovers holding LVs for resume.
  Make a pvmove LV locking holder.
  Do not change critical section counter on resume path without real resume.
  Enhance activation code to automatically suspend pvmove participants.
  Prevent conversion of thin volumes to snapshot origin when lvmlockd is used.
  Add support for pvmove of cache and snapshot origins.
  Avoid using precommitted metadata for suspending pvmove tree.
  Deactivate activated LVs on error path when pvmove activation fails.
  Add "io" to log/debug_classes for logging low-level I/O.
  Avoid importing persistent filter in vgscan/pvscan/vgrename.
  Fix memleak of string buffer when vgcfgbackup runs in secure mode.
  Do not print error when clvmd cannot find running clvmd.

OBS-URL: https://build.opensuse.org/request/show/558347
OBS-URL: https://build.opensuse.org/package/show/Base:System/lvm2?expand=0&rev=212
2017-12-19 10:40:00 +00:00

160 lines
4.9 KiB
Diff

From 0e1c896caaabdf0de38466951ea281f02fe8bb77 Mon Sep 17 00:00:00 2001
From: Eric Ren <zren@suse.com>
Date: Thu, 6 Jul 2017 17:42:58 +0800
Subject: [PATCH] fsadm: add support for btrfs
Check: mount the device first and then run`btrfs filesystem scrub start
-B` command
Reisze: find the mount point first and resize the filesystem after get
the device id since there are maybe several devices underneath btrfs
filesystem
---
scripts/fsadm.sh | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 72 insertions(+), 3 deletions(-)
diff --git a/scripts/fsadm.sh b/scripts/fsadm.sh
index a09b91534..2a29d5ad5 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
@@ -57,6 +58,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}
@@ -76,6 +78,9 @@ BLOCKCOUNT=
MOUNTPOINT=
MOUNTED=
REMOUNT=
+FINDMNT=
+UUID=
+BTRFS_DEVID=
PROCDIR="/proc"
PROCMOUNTS="$PROCDIR/mounts"
PROCSELFMOUNTINFO="$PROCDIR/self/mountinfo"
@@ -227,6 +232,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() {
@@ -354,8 +386,12 @@ 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
+detect_mounted() {
+ 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
@@ -654,6 +690,32 @@ 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
+ 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
####################
@@ -676,6 +738,7 @@ resize() {
"crypto_LUKS")
which "$CRYPTSETUP" > /dev/null 2>&1 || error "$CRYPTSETUP utility required to resize LUKS volume"
resize_luks $NEWSIZE ;;
+ "btrfs") resize_btrfs $NEWSIZE ;;
*) error "Filesystem \"$FSTYPE\" on device \"$VOLUME\" is not supported by this tool." ;;
esac || error "Resize $FSTYPE failed."
test -z "$CRYPT_SHRINK" || resize_crypt "$VOLUME_ORIG"
@@ -748,6 +811,12 @@ check() {
"crypto_LUKS")
which "$CRYPTSETUP" > /dev/null 2>&1 || error "$CRYPTSETUP utility required."
check_luks ;;
+ "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
@@ -766,7 +835,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
--
2.13.6