Skip to content

Commit

Permalink
Make cases for all different custom mounting situations more explicit.
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
Tails developers authored and daniel-baumann committed Apr 5, 2012
1 parent d4d4f98 commit d15a400
Showing 1 changed file with 58 additions and 39 deletions.
97 changes: 58 additions & 39 deletions scripts/live-helpers
Expand Up @@ -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
Expand All @@ -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

Expand Down

0 comments on commit d15a400

Please sign in to comment.