cryptfs: try harder to unmount subdirectory mounts
ensure_subdirectory_unmounted() was ignoring the return value from umount(), so it wasn't possible to tell whether it succeeded or failed. Make it log an error message on failure. Also, there might be cases where ensure_subdirectory_unmounted() fails initially but would succeed later, e.g. due to files in a subdirectory mount being open and requiring processes to be killed. To make this more robust, keep calling ensure_subdirectory_unmounted() before each attempt of umount("/data"). I'm not sure whether this will actually fix bug 189250652, as it hasn't been root-caused yet, but this might help. Bug: 189250652 Change-Id: I979b12d3c6a88fe3335ff548b1f8a5db43683c4f
This commit is contained in:
parent
67db7b9786
commit
8953430064
1 changed files with 7 additions and 4 deletions
11
cryptfs.cpp
11
cryptfs.cpp
|
@ -1508,20 +1508,23 @@ static void ensure_subdirectory_unmounted(const char *prefix) {
|
|||
[](const std::string& s1, const std::string& s2) {return s1.length() > s2.length(); });
|
||||
|
||||
for (std::string& mount_point : umount_points) {
|
||||
umount(mount_point.c_str());
|
||||
SLOGW("umount sub-directory mount %s\n", mount_point.c_str());
|
||||
SLOGW("unmounting sub-directory mount %s\n", mount_point.c_str());
|
||||
if (umount(mount_point.c_str()) != 0) {
|
||||
SLOGE("unmounting %s failed: %s\n", mount_point.c_str(), strerror(errno));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int wait_and_unmount(const char* mountpoint) {
|
||||
int i, err, rc;
|
||||
|
||||
// Subdirectory mount will cause a failure of umount.
|
||||
ensure_subdirectory_unmounted(mountpoint);
|
||||
#define WAIT_UNMOUNT_COUNT 20
|
||||
|
||||
/* Now umount the tmpfs filesystem */
|
||||
for (i = 0; i < WAIT_UNMOUNT_COUNT; i++) {
|
||||
// Subdirectory mount will cause a failure of umount.
|
||||
ensure_subdirectory_unmounted(mountpoint);
|
||||
|
||||
if (umount(mountpoint) == 0) {
|
||||
break;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue