Make cases for all different custom mounting situations more explicit.
authorTails developers <amnesia@boum.org>
Mon, 26 Mar 2012 17:23:56 +0000 (19:23 +0200)
committerDaniel Baumann <daniel@debian.org>
Thu, 5 Apr 2012 05:54:43 +0000 (07:54 +0200)
The old code had grown wild over time and was hard to follow, and
consequently contained bugs (all related to linkfiles custom mounts in
read-only mode) that that became obvious and were fixed solely all
thanks to this re-write.

scripts/live-helpers

index 78de240..889d157 100644 (file)
@@ -1466,49 +1466,73 @@ activate_custom_mounts ()
 
                # XXX: If CONFIG_AUFS_ROBR is added to the Debian kernel we can
                # ignore the loop below and set rofs_dest_backing=$dest
-               rofs_dest_backing=""
-               for d in ${rootmnt}/live/rofs/*
-               do
-                       if [ -n "${rootmnt}" ]
-                       then
-                               rofs_dest_backing="${d}/$(echo ${dest} | sed -e "s|${rootmnt}||")"
-                       else
-                               rofs_dest_backing="${d}/${dest}"
-                       fi
-                       if [ -d "${rofs_dest_backing}" ]
-                       then
-                               break
-                       else
-                               rofs_dest_backing=""
-                       fi
-               done
+               local rofs_dest_backing=""
+               if [ -n "${opt_linkfiles}"]
+               then
+                       for d in ${rootmnt}/live/rofs/*
+                       do
+                               if [ -n "${rootmnt}" ]
+                               then
+                                       rofs_dest_backing="${d}/$(echo ${dest} | sed -e "s|${rootmnt}||")"
+                               else
+                                       rofs_dest_backing="${d}/${dest}"
+                               fi
+                               if [ -d "${rofs_dest_backing}" ]
+                               then
+                                       break
+                               else
+                                       rofs_dest_backing=""
+                               fi
+                       done
+               fi
 
-               if [ -z "${PERSISTENT_READONLY}" ]
+               if [ -n "${opt_linkfiles}" ] && [ -z "${PERSISTENT_READONLY}" ]
                then
-                       if [ -n "${opt_linkfiles}" ]
-                       then
-                               links_source="${source}"
-                               links_dest="${dest}"
-                       elif [ -n "${opt_union}" ]
+                       link_files ${source} ${dest} ${rootmnt}
+               elif [ -n "${opt_linkfiles}" ] && [ -n "${PERSISTENT_READONLY}" ]
+               then
+                       mkdir -p ${rootmnt}/live/persistent
+                       local links_source=$(mktemp -d ${rootmnt}/live/persistent/links-source-XXXXXX)
+                       chown_ref ${source} ${links_source}
+                       chmod_ref ${source} ${links_source}
+                       # We put the cow dir in the below strange place to
+                       # make it absolutely certain that the link source
+                       # has its own directory and isn't nested with some
+                       # other custom mount (if so that mount's files would
+                       # be linked, causing breakage.
+                       if [ -n "${rootmnt}" ]
                        then
-                               do_union ${dest} ${source} ${rofs_dest_backing}
+                               local cow_dir="/cow/live/persistent/$(basename ${links_source})"
                        else
-                               mount --bind "${source}" "${dest}"
-                       fi
-               else
-                       if [ -n "${opt_linkfiles}" ]
-                       then
-                               links_dest="${dest}"
-                               dest="$(mktemp -d ${persistent_backing}/links_source-XXXXXX)"
-                               links_source="${dest}"
+                               # This is happens if persistence is activated
+                               # post boot
+                               local cow_dir="/live/cow/live/persistent/$(basename ${links_source})"
                        fi
+                       mkdir -p ${cow_dir}
+                       chown_ref "${source}" "${cow_dir}"
+                       chmod_ref "${source}" "${cow_dir}"
+                       do_union ${links_source} ${cow_dir} ${source} ${rofs_dest_backing}
+                       link_files ${links_source} ${dest} ${rootmnt}
+               elif [ -n "${opt_union}" ] && [ -z "${PERSISTENT_READONLY}" ]
+               then
+                       do_union ${dest} ${source} ${rofs_dest_backing}
+               elif [ -n "${opt_bind}" ] && [ -z "${PERSISTENT_READONLY}" ]
+               then
+                       mount --bind "${source}" "${dest}"
+               elif [ -n "${opt_bind}" -o -n "${opt_union}" ] && [ -n "${PERSISTENT_READONLY}" ]
+               then
+                       # bind-mount and union mount are handled the same
+                       # in read-only mode, but note that rofs_dest_backing
+                       # is non-empty (and necessary) only for unions
                        if [ -n "${rootmnt}" ]
                        then
-                               cow_dir="$(echo ${dest} | sed -e "s|${rootmnt}|/cow/|")"
+                               local cow_dir="$(echo ${dest} | sed -e "s|^${rootmnt}|/cow/|")"
                        else
-                               cow_dir="/live/cow/${dest}"
+                               # This is happens if persistence is activated
+                               # post boot
+                               local cow_dir="/live/cow/${dest}"
                        fi
-                       if [ -e "${cow_dir}" ]
+                       if [ -e "${cow_dir}" ] && [ -z "${opt_linkfiles}" ]
                        then
                                # If an earlier custom mount has files here
                                # it will "block" the current mount's files
@@ -1521,11 +1545,6 @@ activate_custom_mounts ()
                        do_union ${dest} ${cow_dir} ${source} ${rofs_dest_backing}
                fi
 
-               if [ -n "${opt_linkfiles}" ]
-               then
-                       link_files "${links_source}" "${links_dest}" "${rootmnt}"
-               fi
-
                PERSISTENCE_IS_ON="1"
                export PERSISTENCE_IS_ON