X-Git-Url: https://iankelling.org/git/?a=blobdiff_plain;f=mount-latest-subvol;h=36895aa1612ad1d58bc923775d19887117fdf60f;hb=b857462732e15f455e41f26e3048a390d7b399c0;hp=6bf68d703b7f90b3a2379ceeeca1335991afcfc6;hpb=4c39892ef8fa3379ce36adbe870723324cb71cea;p=distro-setup diff --git a/mount-latest-subvol b/mount-latest-subvol index 6bf68d7..36895aa 100644 --- a/mount-latest-subvol +++ b/mount-latest-subvol @@ -73,27 +73,80 @@ mnt() { e mount $dir fi } +fstab() { + while read -r start mpoint end; do + l="$start $mpoint $end" + # kill off any lines that duplicate the mount point. + sed --follow-symlinks -ri "\%$l%b;\%^\s*\S+\s+$mpoint\s%d" /etc/fstab + tu /etc/fstab <<<"$l" + done +} +kill-dir() { + for sig; do + echo kill-dir $sig + found_pids=false + if pids=$(timeout 4 lsof -t $dir); then + found_pids=true + timeout 4 lsof -w $dir + 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 + found_pids=true + fuser -$sig -mvk $dir + fi + sleep .5 + if ! $found_pids; then + return 0 + fi + done + return 1 +} + +force=false +if [[ $1 == -f ]]; then + force=true +fi ret=0 ##### begin setup fstab for subvols we care about ###### first_root_crypt=$(awk '$2 == "/" {print $1}' /etc/mtab) -tu /etc/fstab </dev/null; then continue @@ -141,11 +194,18 @@ for vol in q a o; do if e umount -R $dir; then unmounted+=($dir) else - umount_ret=false - ret=1 - echo "$0: failed to umount $dir" - e lsof $dir - break + if ! kill-dir TERM TERM TERM INT INT HUP HUP; then + if $force; then kill-dir KILL; fi + fi + + if e umount -R $dir; then + unmounted+=($dir) + else + echo "$0: failed to umount $dir" + umount_ret=false + ret=1 + continue + fi fi fi done