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:
Eric Biggers 2021-06-07 12:34:39 -07:00
parent 67db7b9786
commit 8953430064

View file

@ -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;
}