various fixes and improvements
[distro-setup] / mount-latest-subvol
index 6bf68d703b7f90b3a2379ceeeca1335991afcfc6..b4bec8efe51c1aec7101d4aa78b84a219b8e1bec 100644 (file)
@@ -73,27 +73,49 @@ 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
+}
 
 ret=0
 
 ##### begin setup fstab for subvols we care about ######
 first_root_crypt=$(awk '$2 == "/" {print $1}' /etc/mtab)
-tu /etc/fstab <<EOF
+fstab <<EOF
 $first_root_crypt  /a  btrfs  noatime,subvol=a  0 0
 EOF
-case $HOSTNAME in
-    treetowl|x2|frodo)
-        tu /etc/fstab <<EOF
+
+shopt -s nullglob
+
+f=(/mnt/root/btrbk/q.*)
+if [[ -e $f ]]; then
+    fstab <<EOF
 $first_root_crypt  /q  btrfs  noatime,subvol=q  0 0
-$first_root_crypt  /o  btrfs  noatime,subvol=o  0 0
 /q/p  /p  none  bind  0 0
+EOF
+fi
+
+f=(/mnt/root/btrbk/o.*)
+if [[ -e $f ]]; then
+    fstab <<EOF
+$first_root_crypt  /o  btrfs  noatime,subvol=o  0 0
 /o/m  /m  none  bind  0 0
 EOF
-        ;;
-esac
+fi
+
+if [[ $HOSTNAME == frodo ]]; then
+    fstab <<EOF
+$first_root_crypt  /i  btrfs  noatime,subvol=i  0 0
+EOF
+fi
 ##### end setup fstab for subvols we care about ######
 
-for vol in q a o; do
+for vol in q a o i; do
     d=/$vol
     if ! awk '{print $2}' /etc/fstab | grep -xF $d &>/dev/null; then
         continue
@@ -141,11 +163,23 @@ 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
+                # lsof will fail if it finds no pids
+                if ! e timeout 4 lsof $dir; then
+                    umount_ret=false
+                    ret=1
+                    continue
+                fi
+                pids=$(lsof -t $dir) ||:
+                kill $pids
+                sleep .5
+                if e umount -R $dir; then
+                    unmounted+=($dir)
+                else
+                    umount_ret=false
+                    ret=1
+                    continue
+                fi
             fi
         fi
     done