# See the License for the specific language governing permissions and
# limitations under the License.
-script=$(readlink -f -- "$BASH_SOURCE")
+this_file="$(readlink -f -- "${BASH_SOURCE[0]}")"
+readonly this_file
cd /
-[[ $EUID == 0 ]] || exec sudo -E "$script" "$@"
+[[ $EUID == 0 ]] || exec sudo -E "$this_file" "$@"
source /usr/local/lib/err
usage() {
cat <<EOF
-Usage: ${0##*/} [OPTIONS]
+Usage: ${0##*/} [OPTIONS] [SUBVOLUMES]
-h|--help Print help and exit.
-f|--force Use kill -9 to try fixing unmount errors
exit $1
}
-all_vols=(q a o i ar qr)
tu() {
shift
done
+if (( $# )); then
+ all_vols=( "$@" )
+else
+ all_vols=(q a o i ar qr)
+fi
+
##### end command line parsing ########
ret=0
mnt /mnt/boot2
fi
-do_o=true
root_dev=$(awk '$2 == "/" {print $1}' /etc/mtab)
mapper-dev root_dev
o_dev=$(awk '$2 == "/mnt/o" {print $1}' /etc/mtab)
mapper-dev o_dev
-if [[ $o_dev == "$root_dev" ]]; then
- do_o=false
-fi
# root2_dev=$(awk '$2 == "/mnt/root2" {print $1}' /etc/mtab)
# mapper-dev root2_dev
crypt_dev=$root_dev
else # if we are in a recovery boot, find the next best crypt device
mopts=,noauto
- do_o=false
+ # todo: I think I had an idea to not setup /o in this case,
+ # but never finished implementing it
for dev in $(dmsetup ls --target crypt | awk '{print $1}'); do
dev=/dev/mapper/$dev
if awk '{print $1}' /etc/mtab | grep -Fx $dev &>/dev/null; then
# dont tax the cpus of old laptops
-if ((`nproc` > 2)); then
+if (( $(nproc) > 2)); then
mopts+=,compress=zstd
fi
# ownership, and ssh doesn\'t allow any group writable parent
# directories, so we are forced to use a directory structure similar
# to home directories
-f=(/mnt/root/btrbk/q.*); f=${f[0]}
+fa=(/mnt/root/btrbk/q.*); f=${fa[0]}
if [[ -e $f ]]; then
fstab <<EOF
$crypt_dev /q btrfs noatime,subvol=q,gid=1000$mopts 0 0
EOF
fi
-f=(/mnt/root/btrbk/qr.*); f=${f[0]}
+fa=(/mnt/root/btrbk/qr.*); f=${fa[0]}
if [[ -e $f ]]; then
fstab <<EOF
$crypt_dev /qr btrfs noatime,subvol=qr$mopts 0 0
EOF
fi
-f=(/mnt/root/btrbk/ar.*); f=${f[0]}
+fa=(/mnt/root/btrbk/ar.*); f=${fa[0]}
if [[ -e $f ]]; then
fstab <<EOF
$crypt_dev /ar btrfs noatime,subvol=ar,uid=1000,gid=1000$mopts 0 0
fi
-f=(/mnt/o/btrbk/o.*); f=${f[0]}
+fa=(/mnt/o/btrbk/o.*); f=${fa[0]}
if [[ -e $f ]]; then
- fstab <<EOF
+ if [[ $o_dev != "$root_dev" ]]; then
+ fstab <<EOF
$o_dev /o btrfs noatime,subvol=o$mopts 0 0
+EOF
+ fi
+ fstab <<EOF
/o/m /m none bind$mopts 0 0
EOF
-else
- do_o=false
fi
my_pids=($$ $PPID)
loop_limit=30
count=0
-while [[ ${my_pids[-1]} != 1 && ${my_pids[-1]} != ${my_pids[-2]} && $count -lt $loop_limit ]]; do
+while [[ ${my_pids[-1]} != 1 && ${my_pids[-1]} != "${my_pids[-2]}" && $count -lt $loop_limit ]]; do
count=$((count + 1))
p=$(ps -p ${my_pids[-1]} -o ppid=)
if [[ $p == 0 || ! $p ]]; then
for vol in ${all_vols[@]}; do
d=/$vol
- if ! awk '{print $2}' /etc/fstab | grep -xF $d &>/dev/null; then
+ if ! awk '$3 == "btrfs" {print $2}' /etc/fstab | grep -xF $d &>/dev/null; then
continue
fi
# eg. when r=/q/p, for lines like
# /q/p /p none bind 0 0
# output /p
- new_roots+=($(sed -rn "s#^$r/\S+\s+(\S+)\s+none\s+(\S+,|)bind[[:space:],].*#\1#p" /etc/fstab))
+ new_roots+=("$(sed -rn "s#^$r/\S+\s+(\S+)\s+none\s+(\S+,|)bind[[:space:],].*#\1#p" /etc/fstab)")
done
(( ${#new_roots} )) || break
binds+=(${new_roots[@]})
for b in ${binds[@]}; do
if mountpoint -q $b; then
bid=$(stat -c%d $b)
- if [[ $did != $bid ]]; then
+ if [[ $did != "$bid" ]]; then
umount-kill $b
fi
fi
fi
done
if [[ $bsub ]]; then
- tmp=$(mktemp)
# in testing, same subvol is 136 bytes. allow some overhead. 32 happens sometimes under systemd.
# $ errno 32
# EPIPE 32 Broken pipe
leaf_vols=($vol.leaf.*)
count=${#leaf_vols[@]}
leaf_limit_time=$(( EPOCHSECONDS - 60*60*24*60 )) # 60 days
- leaf_new_limit_time=$(( EPOCHSECONDS - 60*60*24 )) # 1 day
- # this goes backwards from oldest. leaf_new_limit_time is just in case
- # the order gets screwed up or something.
+ leaf_new_limit_time=$(( EPOCHSECONDS - 60*60*24 * 5 )) # 5 days this
+ # goes backwards from oldest. leaf_new_limit_time is a safety
+ # measure to ensure we don't delete very recent leafs.
for leaf in ${leaf_vols[@]}; do
- leaf_time=$(date -d ${leaf#$vol.leaf.} +%s)
- if (( leaf_limit_time > leaf_time || ( leaf_new_limit_time > leaf_time && count > 15 ) )); then
+ leaf_time=$(date -d ${leaf#"$vol".leaf.} +%s)
+ if (( leaf_limit_time > leaf_time || ( leaf_new_limit_time > leaf_time && count > 30 ) )); then
x btrfs sub del $leaf
fi
count=$((count-1))
rm -f /nocow/btrfs-stale/$vol
done
+if (( $ret )); then
+ echo "$0: exit status $ret. see error above"
+fi
exit $ret