OLD | NEW |
| (Empty) |
1 #!/bin/bash | |
2 # Copyright (c) 2009 The Chromium OS Authors. All rights reserved. | |
3 # Use of this source code is governed by a BSD-style license that can be | |
4 # found in the LICENSE file. | |
5 | |
6 set -e # exit on error | |
7 set -E # force error handler inheritance | |
8 set -u # require all variables to be defined | |
9 trap error_handler ERR; | |
10 | |
11 function error_handler() { | |
12 cryptohome::log "unmount failed: the system may be rebooted" | |
13 $sync || $true | |
14 | |
15 cryptohome::log "lsof ${DEFAULT_MOUNT_POINT}: $(lsof ${DEFAULT_MOUNT_POINT})" | |
16 cryptohome::log "current mount table: $(mount)" | |
17 | |
18 cryptohome::is_mounted && $reboot | |
19 cryptohome::log "unmount but the filesystem is no longer mounted" | |
20 | |
21 # Make sure we aren't leaving a mess or an accessible key. | |
22 if cryptohome::is_opened; then | |
23 cryptohome::log "device mapper device still present; attempting to close" | |
24 cryptohome::log \ | |
25 "lsof ${DEFAULT_MAPPER_DEVICE}: $(lsof ${DEFAULT_MAPPER_DEVICE})" | |
26 cryptohome::close || $reboot | |
27 $exit 1 | |
28 fi | |
29 | |
30 if cryptohome::attached; then | |
31 cryptohome::log "loop device still present; attempting to detach" | |
32 cryptohome::detach || $reboot | |
33 $exit 1 | |
34 fi | |
35 | |
36 cryptohome::log "forced unmount and cleanup successful" | |
37 $exit 0 | |
38 } | |
39 | |
40 function umount_main() { | |
41 # If we can't unmount, do it the hard way, for now. | |
42 local target="${1:-$DEFAULT_MOUNT_POINT}" | |
43 # Variables that define how long to wait for unmount to complete and the | |
44 # increment to check for its completion. | |
45 local max_delay=20 | |
46 local current_delay=0 | |
47 local increment=1 | |
48 | |
49 # Loop until we've unmounted cryptohome or have reached the $max_delay. | |
50 while cryptohome::is_mounted "$target" ; do | |
51 if [ $current_delay -ge $max_delay ] ; then | |
52 # If we've reached a max_delay, abort and go through reboot logic | |
53 cryptohome::log "Unmount max delay reached. Aborting." | |
54 error_handler | |
55 fi | |
56 if ! cryptohome::unmount "$target" ; then | |
57 cryptohome::log "Unmount error, sleeping and attempting to unmount again" | |
58 $sync && $sleep $increment | |
59 current_delay=$(( current_delay + increment )) | |
60 fi | |
61 done | |
62 # is_mounted ignores incognito mounts since they diverge from | |
63 # the actual cryptohome landscape (dm, losetup). | |
64 if $mount | $grep -q "^$INCOGNITO_MOUNT_NAME "; then | |
65 # We want all processes killed that use this mountpoint, but | |
66 # we also need to ensure that the user is completely gone to | |
67 # avoid processes persisting across mounts. | |
68 cryptohome::log "unmounting incognito mount" | |
69 $pkill -9 -u ${DEFAULT_USER} && $true &> /dev/null | |
70 # Since we don't have additional work after the unmount, we can | |
71 # do it lazily. | |
72 $umount -n -l "$INCOGNITO_MOUNT_NAME" | |
73 fi | |
74 } | |
75 | |
76 if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then | |
77 source "$(dirname "$0")/../lib/chromeos-cryptohome/common" | |
78 utils::declare_commands reboot exit sync | |
79 umount_main "$@" | |
80 fi | |
OLD | NEW |