From 9a884151852eafa00889e414b381b3defbf1be16 Mon Sep 17 00:00:00 2001 From: Andrew Cady Date: Thu, 29 Oct 2020 22:52:19 -0400 Subject: btrfs-shrink: support shrinking the .patch.btrfs --- btrfs-shrink | 37 ++++++++++++++++--------------------- 1 file changed, 16 insertions(+), 21 deletions(-) diff --git a/btrfs-shrink b/btrfs-shrink index 1d059ff..a9bbee7 100755 --- a/btrfs-shrink +++ b/btrfs-shrink @@ -6,7 +6,7 @@ shrink() { local shrinkmegs=100 mountpoint="$1" while true; do - while ! btrfs filesystem resize -${shrinkmegs}M "$mountpoint"/; do + while ! btrfs filesystem resize "${DEVICE_ID}:-${shrinkmegs}M" "$mountpoint"/; do shrinkmegs=$((shrinkmegs - 10 )) if [ $shrinkmegs -lt 10 ]; then return @@ -18,47 +18,42 @@ shrink() smart_shrink() { local min_dev_size mountpoint="$1" - if min_dev_size=$(btrfs inspect-internal min-dev-size --id 1 "$mountpoint") && [ "$min_dev_size" ] + if min_dev_size=$(btrfs inspect-internal min-dev-size --id "$DEVICE_ID" "$mountpoint") && [ "$min_dev_size" ] then set -- $min_dev_size [ "$2" = bytes ] || die "Unexpected output from btrfs inspect-internal min-dev-size: '$min_dev_size'" - btrfs filesystem resize "$1" "$mountpoint" && return + btrfs filesystem resize "$DEVICE_ID:$1" "$mountpoint" && return fi shrink "$mountpoint" } -btrfs_truncate() -{ - local img="$1" bytes -# 548044800/1176715264 bytes used - bytes=$(file "$img" | sed -ne 's?.*/\([0-9]*\) bytes used.*?\1?p') - if [ "$bytes" ]; then - truncate -s "$bytes" "$img" - fi -} - -parse_btrfs_dev_size() +parse_btrfs_dev() { local dev="$1" - sed -n 's?.* size \([0-9]*\) .* path \([^ ]*\)$?\1 \2? p' | - while read size name + sed -n 's?^ devid *\([0-9]*\) size \([0-9]*\) .* path \([^ ]*\)$?\1 \2 \3? p' | + while read devid size name do [ "$name" = "$dev" ] || continue - echo $size + echo "$devid $size" break done } -get_truncate_size() +get_btrfs_dev() { local imgfile="$1" mountpoint="$2" loop_dev dev_size + losetup -nj "$imgfile" >&2 loop_dev=$(losetup -ONAME --raw -nj "$imgfile") - btrfs fi sh --raw "$mountpoint" | parse_btrfs_dev_size "$loop_dev" + ds=$(btrfs fi sh --raw "$mountpoint" | parse_btrfs_dev "$loop_dev") + [ "$ds" ] || return + DEVICE_ID=${ds% *} + DEVICE_SIZE=${ds#* } } main() { [ "$(id -u)" = 0 ] || die 'you are not root' if [ -d "$1" ]; then + exit 1 mountpoint=$1 mountpoint -q "$mountpoint" || die "not a mountpoint: $1" smart_shrink "$mountpoint" @@ -70,11 +65,11 @@ main() result=$? if [ $result = 0 ]; then - smart_shrink "$mountpoint" + get_btrfs_dev "$1" "$mountpoint" && smart_shrink "$mountpoint" result=$? if [ $result = 0 ] then - truncate=$(get_truncate_size "$1" "$mountpoint") + get_btrfs_dev "$1" "$mountpoint" && truncate=$DEVICE_SIZE fi umount "$mountpoint" fi -- cgit v1.2.3