summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTreehugger Robot <treehugger-gerrit@google.com>2021-12-08 08:43:32 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2021-12-08 08:43:32 +0000
commit344c737ba0aa081b67043f36f51b2aefae5dfc30 (patch)
treec1678fbd444d906969a8daa3fc4214eee4beef61
parent64a5600c83962b2425bc8dd28db7d73eea8e4acd (diff)
parente8d0e486a39ee07765c7f757ea3c1119bdf4726b (diff)
downloadvold-temp-sc-sam.tar.gz
Merge "Remove StubVolume disks upon vold reset events" am: e8d0e486a3temp_sam_210511427temp-sc-sam
Original change: https://android-review.googlesource.com/c/platform/system/vold/+/1902674 Change-Id: Id6edfe90aadae4db1b23c5bc0de4981170ba42f2
-rw-r--r--VolumeManager.cpp13
-rw-r--r--model/Disk.h4
2 files changed, 14 insertions, 3 deletions
diff --git a/VolumeManager.cpp b/VolumeManager.cpp
index 02025b74..93113215 100644
--- a/VolumeManager.cpp
+++ b/VolumeManager.cpp
@@ -899,10 +899,21 @@ int VolumeManager::reset() {
}
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.
for (const auto& disk : mDisks) {
disk->destroy();
- disk->create();
+ if (!disk->isStub()) {
+ disk->create();
+ }
}
+ const auto isStub = [](const auto& disk) { return disk->isStub(); };
+ mDisks.remove_if(isStub);
+ mPendingDisks.remove_if(isStub);
+
updateVirtualDisk();
mAddedUsers.clear();
mStartedUsers.clear();
diff --git a/model/Disk.h b/model/Disk.h
index 16476dce..8c75f59b 100644
--- a/model/Disk.h
+++ b/model/Disk.h
@@ -70,6 +70,8 @@ class Disk {
const std::string& getLabel() const { return mLabel; }
int getFlags() const { return mFlags; }
+ bool isStub() const { return (mFlags & kStubInvisible) || (mFlags & kStubVisible); }
+
std::shared_ptr<VolumeBase> findVolume(const std::string& id);
void listVolumes(VolumeBase::Type type, std::list<std::string>& list) const;
@@ -123,8 +125,6 @@ class Disk {
int getMaxMinors();
- bool isStub() { return (mFlags & kStubInvisible) || (mFlags & kStubVisible); }
-
DISALLOW_COPY_AND_ASSIGN(Disk);
};