summaryrefslogtreecommitdiff
path: root/trusty/coverage/coverage.cpp
diff options
context:
space:
mode:
authorMartijn Coenen <maco@google.com>2020-05-28 16:15:55 +0200
committerMartijn Coenen <maco@google.com>2020-05-28 19:11:01 +0200
commitdd0440f4e5979e022cebb7a788e9228205df091d (patch)
treebe46efc09bd9c1aceab5238f848b44263bf17c43 /trusty/coverage/coverage.cpp
parent959dcf106dc0f09f8f63f23ad58e56e3a738a2ab (diff)
Abort FUSE filesystem when Zygote restarts.
The FUSE filesystem is implemented by a Zygote child. If Zygote dies, all of its children die along with it, including the FUSE daemon. The FUSE filesystem is cleaned up automatically whenever the /dev/fuse file descriptor of the FUSE daemon is closed. However, due to the way the binder driver holds on to the 'struct files' of processes in the kernel, the closing of FDs of all of Zygote's children is serialized. That in turn means that, if a process has a file with dirty pages on FUSE, and that FD is closed *before* the FUSE FD, the FUSE kernel driver will happily issue a request to the FUSE daemon to serve that request. But since the FUSE userspace daemon is already dead, it will never get served. And because the closing of all FDs is serialized, we will never close the FUSE fd to unblock this request. Solve this particular case by manually aborting the FUSE filesystem when Zygote restarts. Because we now explicitly close the FUSE fd, the FUSE filesystem will be cleaned up, all outstanding requests to it will be cancelled, and new ones will be skipped. Bug: 153411204 Test: kill zygote manually Change-Id: I2cb6c1a03cc1a932461ff33558894a428ff35180
Diffstat (limited to 'trusty/coverage/coverage.cpp')
0 files changed, 0 insertions, 0 deletions