vold: Ensure we cleanup secure containers on card removal.
Fixes bug: http://b/issue?id=2567572 Note: The framework will still likely restart since the system_server is holding references to assets on the card which are mmaped, but at least now storage will be available when a new card is re-inserted. Change-Id: I4e195c0c666426b93da47198fa826a6f58d855a9 Signed-off-by: San Mehat <san@google.com>
This commit is contained in:
parent
97ac40e4e6
commit
1a06edaf4d
3 changed files with 21 additions and 8 deletions
|
@ -284,6 +284,11 @@ void DirectVolume::handlePartitionRemoved(const char *devpath, NetlinkEvent *evt
|
|||
getLabel(), getMountpoint(), major, minor);
|
||||
mVm->getBroadcaster()->sendBroadcast(ResponseCode::VolumeBadRemoval,
|
||||
msg, false);
|
||||
|
||||
if (mVm->cleanupAsec(this, true)) {
|
||||
SLOGE("Failed to cleanup ASEC - unmount will probably fail!");
|
||||
}
|
||||
|
||||
if (Volume::unmountVol(true)) {
|
||||
SLOGE("Failed to unmount volume on bad removal (%s)",
|
||||
strerror(errno));
|
||||
|
|
|
@ -886,14 +886,7 @@ int VolumeManager::unmountVolume(const char *label, bool force) {
|
|||
return -1;
|
||||
}
|
||||
|
||||
while(mActiveContainers->size()) {
|
||||
AsecIdCollection::iterator it = mActiveContainers->begin();
|
||||
SLOGI("Unmounting ASEC %s (dependant on %s)", *it, v->getMountpoint());
|
||||
if (unmountAsec(*it, force)) {
|
||||
SLOGE("Failed to unmount ASEC %s (%s)", *it, strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
cleanupAsec(v, force);
|
||||
|
||||
return v->unmountVol(force);
|
||||
}
|
||||
|
@ -942,3 +935,15 @@ bool VolumeManager::isMountpointMounted(const char *mp)
|
|||
return false;
|
||||
}
|
||||
|
||||
int VolumeManager::cleanupAsec(Volume *v, bool force) {
|
||||
while(mActiveContainers->size()) {
|
||||
AsecIdCollection::iterator it = mActiveContainers->begin();
|
||||
SLOGI("Unmounting ASEC %s (dependant on %s)", *it, v->getMountpoint());
|
||||
if (unmountAsec(*it, force)) {
|
||||
SLOGE("Failed to unmount ASEC %s (%s)", *it, strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -71,6 +71,8 @@ public:
|
|||
|
||||
// XXX: This should be moved private once switch uevents are working
|
||||
void notifyUmsConnected(bool connected);
|
||||
// XXX: Post froyo this should be moved and cleaned up
|
||||
int cleanupAsec(Volume *v, bool force);
|
||||
|
||||
void setBroadcaster(SocketListener *sl) { mBroadcaster = sl; }
|
||||
SocketListener *getBroadcaster() { return mBroadcaster; }
|
||||
|
@ -78,6 +80,7 @@ public:
|
|||
static VolumeManager *Instance();
|
||||
|
||||
static char *asecHash(const char *id, char *buffer, size_t len);
|
||||
|
||||
private:
|
||||
VolumeManager();
|
||||
Volume *lookupVolume(const char *label);
|
||||
|
|
Loading…
Reference in a new issue