[lvm-devel] [PATCH 1/1] added resizing for btrfs
Marcus Müller
marcus at hostalia.de
Wed Aug 2 17:42:35 UTC 2017
From: Marcus Müller <mueller at kit.edu>
---
scripts/fsadm.sh | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 68 insertions(+), 1 deletion(-)
diff --git a/scripts/fsadm.sh b/scripts/fsadm.sh
index 459905fc6..7101109e6 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
@@ -41,6 +42,7 @@ TUNE_REISER=reiserfstune
RESIZE_REISER=resize_reiserfs
TUNE_XFS=xfs_info
RESIZE_XFS=xfs_growfs
+TOOL_BTRFS=btrfs
MOUNT=mount
UMOUNT=umount
@@ -520,6 +522,70 @@ resize_xfs() {
fi
}
+###############################################################################
+# Resize BTRFS filesystem
+# - mounted for upsize
+# - mounted for downsize
+# - since BTRFS supports multi-volume filesystems, only resize the btrfs volume
+# we've actually resized
+###############################################################################
+resize_btrfs() {
+ detect_mounted
+ MOUNTPOINT=$MOUNTED
+ if [ -z "$MOUNTED" ]; then
+ MOUNTPOINT=$TEMPDIR
+ temp_mount || error "Cannot mount Btrfs filesystem."
+ fi
+ verbose "mounted on $MOUNTPOINT"
+
+ local old_ifs="$IFS"
+ local last_line=""
+ local used=""
+ local devid=""
+ local devid_use=""
+ BLOCKSIZE=1
+
+ unset IFS
+ verbose "Parsing $TOOL_BTRFS filesystem show --raw \"$VOLUME\""
+ for i in $(LC_ALL=C "$TOOL_BTRFS" filesystem show --raw "$VOLUME"); do
+ case "$last_line" in
+ "size")
+ BLOCKCOUNT=$i
+ ;;
+ "used")
+ used=$i
+ ;;
+ "devid")
+ devid="$i"
+ ;;
+ "path")
+ if test "$i" = "$VOLUME" ; then
+ verbose "Found $VOLUME; has devid $devid size $BLOCKCOUNT B"
+ devid_use="$devid"
+ fi
+ ;;
+ esac
+
+ line_before="$last_line"
+ last_line="$i"
+ done
+ IFS=old_ifs
+
+
+ validate_parsing "$TOOL_BTRFS"
+ decode_size "$BLOCKCOUNT" "$BLOCKSIZE"
+ FSFORCE=$FORCE
+ if test $(("$used")) -lt $(("$NEWSIZE")) ; then
+ verbose "$VOLUME: size $NEWSIZE B >= used $used B"
+ else
+ verbose "$VOLUME: trying to shrink filesystem to size $NEWSIZE B, which is less than used $used B"
+ verbose "$VOLUME: that might still work on multi-volume Btrfs"
+ fi
+ verbose "Resizing filesystem on device \"$VOLUME\", mounted on \"$MOUNTPOINT\" to $NEWSIZE bytes"
+ dry "$TOOL_BTRFS" filesystem resize "${devid_use}:${NEWSIZE}" "$MOUNTPOINT"
+
+}
+
####################
# Resize filesystem
####################
@@ -536,6 +602,7 @@ resize() {
"ext3"|"ext2"|"ext4") resize_ext $NEWSIZE ;;
"reiserfs") resize_reiser $NEWSIZE ;;
"xfs") resize_xfs $NEWSIZE ;;
+ "btrfs") resize_btrfs $NEWSIZE ;;
*) error "Filesystem \"$FSTYPE\" on device \"$VOLUME\" is not supported by this tool." ;;
esac || error "Resize $FSTYPE failed."
cleanup 0
@@ -612,7 +679,7 @@ test -n "$FSADM_RUNNING" && exit 0
# test some prerequisities
for i in "$TUNE_EXT" "$RESIZE_EXT" "$TUNE_REISER" "$RESIZE_REISER" \
- "$TUNE_XFS" "$RESIZE_XFS" "$MOUNT" "$UMOUNT" "$MKDIR" \
+ "$TUNE_XFS" "$RESIZE_XFS" "$TOOL_BTRFS" "$MOUNT" "$UMOUNT" "$MKDIR" \
"$RMDIR" "$BLOCKDEV" "$BLKID" "$GREP" "$READLINK" \
"$DATE" "$FSCK" "$XFS_CHECK" "$XFS_REPAIR" "$LVM" ; do
test -n "$i" || error "Required command definitions in the script are missing!"
--
2.13.0
More information about the lvm-devel
mailing list