diff options
Diffstat (limited to 'src/btrfs-utils/btrfs-shrink')
-rwxr-xr-x | src/btrfs-utils/btrfs-shrink | 52 |
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 | |||
3 | die() { printf "%s: Error: %s\n" "$0" "$*" >&2; exit 1; } | ||
4 | |||
5 | [ "$(id -u)" = 0 ] || die 'you are not root' | ||
6 | |||
7 | shrink() | ||
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 | |||
20 | btrfs_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 | |||
30 | main() | ||
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 | |||
52 | main "$@" | ||