Skip to content

Commit

Permalink
Refactor closing of persistent devices upon failure.
Browse files Browse the repository at this point in the history
Errors can occur at various places so it's best to just do it once in
a consistent manner.
  • Loading branch information
Tails developers authored and daniel-baumann committed Apr 5, 2012
1 parent 11492e8 commit 6425912
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 24 deletions.
12 changes: 11 additions & 1 deletion scripts/live
Expand Up @@ -1228,9 +1228,19 @@ setup_unionfs ()
[ -n "${DEBUG}" ] && cp ${custom_mounts} "${rootmnt}/live/persistent"

# Now we do the actual mounting (and symlinking)
do_custom_mounts ${custom_mounts}
local used_overlays=""
used_overlays=$(activate_custom_mounts ${custom_mounts})
rm ${custom_mounts}

# Close unused overlays (e.g. due to missing $persistence_list)
for overlay in ${overlay_devices}
do
if echo ${used_overlays} | grep -qve "^\(.* \)\?${device}\( .*\)\?$"
then
close_persistent_media ${overlay}
fi
done

# Look for other snapshots to copy in
try_snap "${root_snapdata}" "${rootmnt}" "ROOT"
# This second type should be removed when snapshot grow smarter
Expand Down
54 changes: 31 additions & 23 deletions scripts/live-helpers
Expand Up @@ -764,6 +764,22 @@ mount_persistent_media ()
return 0
}

close_persistent_media () {
local device=${1}
local backing="$(where_is_mounted ${device})"

if [ -d "${backing}" ]
then
umount "${backing}" >/dev/null 2>&1
rmdir "${backing}" >/dev/null 2>&1
fi

if is_active_luks_mapping ${device}
then
/sbin/cryptsetup luksClose ${device}
fi
}

open_luks_device ()
{
dev="${1}"
Expand Down Expand Up @@ -947,7 +963,7 @@ find_persistent_media ()
local luks_device=""
# Check if it's a luks device; we'll have to open the device
# in order to probe any filesystem it contains, like we do
# below. do_custom_mounts() also depends on that any luks
# below. activate_custom_mounts() also depends on that any luks
# device already has been opened.
if echo ${PERSISTENT_ENCRYPTION} | grep -qe "\<luks\>" && \
is_luks_partition ${dev}
Expand Down Expand Up @@ -1244,7 +1260,6 @@ get_custom_mounts ()
fi

local device_name="$(basename ${device})"
local device_used=""
local backing=$(mount_persistent_media ${device})
if [ -z "${backing}" ]
then
Expand All @@ -1254,12 +1269,6 @@ get_custom_mounts ()
local include_list="${backing}/${persistence_list}"
if [ ! -r "${include_list}" ]
then
umount "${backing}" >/dev/null 2>&1
rmdir "${backing}" >/dev/null 2>&1
if /sbin/cryptsetup status ${device_name} >/dev/null 2>&1
then
/sbin/cryptsetup luksClose "${device_name}"
fi
continue
fi

Expand Down Expand Up @@ -1308,39 +1317,31 @@ get_custom_mounts ()
# ensure that no multiple-/ occur in paths
local full_source="$(trim_path ${backing}/${source})"
local full_dest="$(trim_path ${rootmnt}/${dest})"
device_used="yes"
if echo ${options} | grep -qe "\<linkfiles\>";
then
echo "${full_source} ${full_dest} ${options}" >> ${links}
echo "${device} ${full_source} ${full_dest} ${options}" >> ${links}
else
echo "${full_source} ${full_dest} ${options}" >> ${bindings}
echo "${device} ${full_source} ${full_dest} ${options}" >> ${bindings}
fi
done < ${include_list}

if [ -z "${device_used}" ]
then
# this device was not used for / earlier, or
# custom mount point now, so it's useless
umount "${backing}"
rmdir "${backing}"
fi
done

# We sort the list according to destination so we're sure that
# we won't hide a previous mount. We also ignore duplicate
# destinations in a more or less arbitrary way.
[ -e "${bindings}" ] && sort -k2 -sbu ${bindings} >> ${custom_mounts} && rm ${bindings}
[ -e "${bindings}" ] && sort -k3 -sbu ${bindings} >> ${custom_mounts} && rm ${bindings}

# After all mounts are considered we add symlinks so they
# won't be hidden by some mount.
[ -e "${links}" ] && sort -k2 -sbu ${links} >> ${custom_mounts} && rm ${links}
[ -e "${links}" ] && sort -k3 -sbu ${links} >> ${custom_mounts} && rm ${links}
}

do_custom_mounts ()
activate_custom_mounts ()
{
local custom_mounts="${1}" # the ouput from get_custom_mounts()
local used_devices=""

while read source dest options # < ${custom_mounts}
while read device source dest options # < ${custom_mounts}
do
local opt_linkfiles=""
local opt_union=""
Expand Down Expand Up @@ -1466,7 +1467,14 @@ do_custom_mounts ()

PERSISTENCE_IS_ON="1"
export PERSISTENCE_IS_ON

if echo ${used_devices} | grep -qve "^\(.* \)\?${device}\( .*\)\?$"
then
used_devices="${used_devices} ${device}"
fi
done < ${custom_mounts}

echo ${used_devices}
}

fix_home_rw_compatibility ()
Expand Down

0 comments on commit 6425912

Please sign in to comment.