chiark / gitweb /
@@ -1,3 +1,9 @@
[chiark-utils.git] / scripts / remountresizereiserfs
diff --git a/scripts/remountresizereiserfs b/scripts/remountresizereiserfs
new file mode 100755 (executable)
index 0000000..9db7ec0
--- /dev/null
@@ -0,0 +1,46 @@
+#!/bin/bash
+# usage:
+#   remountresizereiserfs /mountpoint
+
+set -e
+fail () { echo >&2 "$*"; exit 1; }
+case "$#.$1" in 1.[^-]*);; *) fail 'bad usage';; esac
+
+mp=$1
+
+df=`df -P $mp`
+dfl2=`printf "%s" "$df" | sed 1d`
+
+case "$dfl2" in
+/dev/*" "[0-9]*" "[0-9]*" "[0-9]*" "[0-9]*"% "/*)
+       dev=${dfl2%% *}
+       mp2=${dfl2##* }
+       if [ "x$mp2" != "x$mp" ]; then fail "mountpoint is $mp2 not $mp"; fi
+       ;;
+*)     fail "could not parse df output" ;;
+esac
+
+lvi=$(lvdisplay -c $dev)
+vg=${lvi#*:}
+vg=${vg%%:*}
+vgsz_le=${lvi#*:*:*:*:*:*:*:*:}
+vgsz_le=${vgsz_le%%:*}
+
+vgi=$(vgdisplay -c $vg)
+pesz_blk=${vgi#*:*:*:*:*:*:*:*:*:*:*:*:}
+pesz_blk=${pesz_blk%%:*}
+
+pesz_by=$(( $pesz_blk * 512 ))
+
+dbrfs=$(debugreiserfs $dev)
+blksz_by=$(printf "%s" "$dbrfs" | egrep '^Blocksize: ' || fail "blocksize?")
+blksz_by=${blksz_by#*: }
+
+if [ $(( $pesz_by % $blksz_by )) != 0 ]; then
+       fail "extent size ${pesz}by does not divide block size ${blksz_by}by"
+fi
+
+pesz_blk=$(( $pesz_by / $blksz_by ))
+vgsz_blk=$(( $vgsz_le * $pesz_blk ))
+
+echo mount -o remount,resize=$vgsz_blk $dev $mp