Remove StubVolume disks upon vold reset events

StubVolumes are managed from outside Android (e.g. from Chrome OS). So,
their disk recreation on vold reset events should also be handled from
outside by 1) listening to reset events, and 2) calling
createStubVolume() for existing StubVolumes on reset events.

Bug: 175281783
Test: m
Test: (Tested in R) Manually induce a vold reset event, and confirm that
Test: 1) vold does not crash, and 2) existing volumes are successfully
Test: mounted again (by calling createStubVolume() for StubVolumes).
Change-Id: I4628eabf809037a547aeef43faedf4dfa57529a6
This commit is contained in:
Youkichi Hosoi 2021-11-25 16:24:35 +09:00
parent e9c951590e
commit dfaff1dc15
2 changed files with 14 additions and 3 deletions

View file

@ -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();

View file

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