diff --git a/VolumeManager.cpp b/VolumeManager.cpp index 02025b7..9311321 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 16476dc..8c75f59 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 findVolume(const std::string& id); void listVolumes(VolumeBase::Type type, std::list& list) const; @@ -123,8 +125,6 @@ class Disk { int getMaxMinors(); - bool isStub() { return (mFlags & kStubInvisible) || (mFlags & kStubVisible); } - DISALLOW_COPY_AND_ASSIGN(Disk); };