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
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