X-Git-Url: https://iankelling.org/git/?a=blobdiff_plain;f=mount-latest-subvol;h=d36685f3b41e6bf717b5a31ba8f152cfe1d79bde;hb=565857e91b7e8c671ec3f4314cb21b0a85c01d0f;hp=bf5ec9c844e27221d0a91548dfc834f16fdb6b05;hpb=b38f62582694bd678baa77bfeab627feefbc6a40;p=distro-setup diff --git a/mount-latest-subvol b/mount-latest-subvol index bf5ec9c..d36685f 100644 --- a/mount-latest-subvol +++ b/mount-latest-subvol @@ -15,6 +15,7 @@ # usage: mount-latest-subvol +cd / [[ $EUID == 0 ]] || exec sudo -E "$BASH_SOURCE" "$@" errcatch() { @@ -81,6 +82,17 @@ fstab() { tu /etc/fstab <<<"$l" done } +pid-check() { + for p in ${pids}; do + for m in ${my_pids[@]}; do + if (( p == m )); then + echo "$0: error: pids to kill includes our pid or a parent" >&2 + ps -f -p $p + exit 1 + fi + done + done +} kill-dir() { for sig; do echo kill-dir $sig @@ -88,11 +100,13 @@ kill-dir() { if pids=$(timeout 4 lsof -t $dir); then found_pids=true timeout 4 lsof -w $dir + pid-check kill -$sig $pids fi # fuser will find open sockets that lsof won't, for example from gpg-agent. # note: -v shows kernel processes, which then doesn't return true when we want - if timeout 4 fuser -m $dir &>/dev/null; then + if pids=$(timeout 4 fuser -m $dir 2>/dev/null); then + pid-check found_pids=true fuser -$sig -mvk $dir fi @@ -112,9 +126,25 @@ fi ret=0 ##### begin setup fstab for subvols we care about ###### -first_root_crypt=$(awk '$2 == "/" {print $1}' /etc/mtab) +root_dev=$(awk '$2 == "/" {print $1}' /etc/mtab) + + +if cryptsetup status $root_dev &>/dev/null; then + crypt_dev=$root_dev +else # if we are in a recovery boot, find the next best crypt device + noauto=,noauto + 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 + crypt_dev=$dev + break + fi + done +fi + + fstab </dev/null; then @@ -180,6 +224,7 @@ for vol in q a o i; do continue fi + # populated by check-subvol-stale fresh_snap=$(