summaryrefslogtreecommitdiff
path: root/src/btrfs-utils/btrfs-shrink
diff options
context:
space:
mode:
Diffstat (limited to 'src/btrfs-utils/btrfs-shrink')
-rwxr-xr-xsrc/btrfs-utils/btrfs-shrink52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/btrfs-utils/btrfs-shrink b/src/btrfs-utils/btrfs-shrink
new file mode 100755
index 0000000..f3dbbb0
--- /dev/null
+++ b/src/btrfs-utils/btrfs-shrink
@@ -0,0 +1,52 @@
1#!/bin/sh
2
3die() { printf "%s: Error: %s\n" "$0" "$*" >&2; exit 1; }
4
5[ "$(id -u)" = 0 ] || die 'you are not root'
6
7shrink()
8{
9 shrinkmegs=100
10 while true; do
11 while ! btrfs filesystem resize -${shrinkmegs}M "$mountpoint"/; do
12 shrinkmegs=$((shrinkmegs - 10 ))
13 if [ $shrinkmegs -lt 10 ]; then
14 return
15 fi
16 done
17 done
18}
19
20btrfs_truncate()
21{
22 local img="$1" bytes
23 bytes=$(file "$img" | sed -ne 's?.*/\([0-9]*\)/[0-9]* bytes used.*?\1?p')
24# 548044800/1176715264 bytes used
25 if [ "$bytes" ]; then
26 truncate -s "$bytes" "$img"
27 fi
28}
29
30main()
31{
32 if [ -d "$1" ]; then
33 mountpoint -q "$1" || die "not a mountpoint: $1"
34 shrink "$1"
35 elif [ -f "$1" ]; then
36 mkdir "$1".mnt.tmp
37 mount -t btrfs "$1" "$1".mnt.tmp
38 result=$?
39 if [ $result = 0 ]; then
40 shrink "$1".mnt.tmp
41 result=$?
42 fi
43 umount "$1".mnt.tmp
44 rmdir "$1".mnt.tmp
45 btrfs_truncate "$1"
46 return $result
47 else
48 die "not a file or directory: $1"
49 fi
50}
51
52main "$@"