diff options
author | Momoko Hattori <momohatt@google.com> | 2024-03-05 09:34:11 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2024-03-05 09:34:11 +0000 |
commit | 481c20da07b0fd7cc043be9430900871b075a7df (patch) | |
tree | 3f0df342a6ad7c1f9122e1ef7f1351d4673bd452 | |
parent | 37216f1084eeafba0c68aa784ad3c2caf05efae1 (diff) | |
parent | 2f20c808c2bd77ea386d69864d975a10b7218b54 (diff) | |
download | vold-temp_319669529.tar.gz |
Merge "vold: Unmount StubVolume disks before unmounting EmulatedVolumes" into main am: 2f20c808c2temp_319669529
Original change: https://android-review.googlesource.com/c/platform/system/vold/+/2850049
Change-Id: Ib360884801c37c093d9836109f0b817987abd850
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
-rw-r--r-- | VolumeManager.cpp | 53 |
1 files changed, 40 insertions, 13 deletions
diff --git a/VolumeManager.cpp b/VolumeManager.cpp index c981f2d4..a1ac20d4 100644 --- a/VolumeManager.cpp +++ b/VolumeManager.cpp @@ -921,25 +921,34 @@ int VolumeManager::abortFuse() { int VolumeManager::reset() { // Tear down all existing disks/volumes and start from a blank slate so // newly connected framework hears all events. + + // Destroy StubVolume disks. This needs to be done before destroying + // EmulatedVolumes because in ARC (Android on ChromeOS), ChromeOS Downloads + // directory (which is in a StubVolume) is bind-mounted to + // /data/media/0/Download. + // We do not recreate StubVolumes here because they are managed from outside + // Android (e.g. from ChromeOS) and their disk recreation on reset events + // should be handled from outside by calling createStubVolume() again. + for (const auto& disk : mDisks) { + if (disk->isStub()) { + disk->destroy(); + } + } + // Remove StubVolume from both mDisks and mPendingDisks. + const auto isStub = [](const auto& disk) { return disk->isStub(); }; + mDisks.remove_if(isStub); + mPendingDisks.remove_if(isStub); + for (const auto& vol : mInternalEmulatedVolumes) { vol->destroy(); } mInternalEmulatedVolumes.clear(); - // Destroy and recreate all disks except that StubVolume disks are just - // destroyed and removed from both mDisks and mPendingDisks. - // StubVolumes are managed from outside Android (e.g. from Chrome OS) and - // their disk recreation on reset events should be handled from outside by - // calling createStubVolume() again. + // Destroy and recreate non-StubVolume disks. for (const auto& disk : mDisks) { disk->destroy(); - if (!disk->isStub()) { - disk->create(); - } + disk->create(); } - const auto isStub = [](const auto& disk) { return disk->isStub(); }; - mDisks.remove_if(isStub); - mPendingDisks.remove_if(isStub); updateVirtualDisk(); mAddedUsers.clear(); @@ -958,11 +967,20 @@ int VolumeManager::shutdown() { return 0; // already shutdown } android::vold::sSleepOnUnmount = false; + // Destroy StubVolume disks before destroying EmulatedVolumes (see the + // comment in VolumeManager::reset()). + for (const auto& disk : mDisks) { + if (disk->isStub()) { + disk->destroy(); + } + } for (const auto& vol : mInternalEmulatedVolumes) { vol->destroy(); } for (const auto& disk : mDisks) { - disk->destroy(); + if (!disk->isStub()) { + disk->destroy(); + } } mInternalEmulatedVolumes.clear(); @@ -978,11 +996,20 @@ int VolumeManager::unmountAll() { ATRACE_NAME("VolumeManager::unmountAll()"); // First, try gracefully unmounting all known devices + // Unmount StubVolume disks before unmounting EmulatedVolumes (see the + // comment in VolumeManager::reset()). + for (const auto& disk : mDisks) { + if (disk->isStub()) { + disk->unmountAll(); + } + } for (const auto& vol : mInternalEmulatedVolumes) { vol->unmount(); } for (const auto& disk : mDisks) { - disk->unmountAll(); + if (!disk->isStub()) { + disk->unmountAll(); + } } // Worst case we might have some stale mounts lurking around, so |