vold: Unmount secure containers when the underlying media is removed.

Signed-off-by: San Mehat <san@google.com>
This commit is contained in:
San Mehat 2010-01-15 09:26:28 -08:00
parent 0586d54053
commit 88705166ab
2 changed files with 32 additions and 1 deletions

View file

@ -51,12 +51,15 @@ VolumeManager *VolumeManager::Instance() {
VolumeManager::VolumeManager() {
mBlockDevices = new BlockDeviceCollection();
mVolumes = new VolumeCollection();
mActiveContainers = new AsecIdCollection();
mBroadcaster = NULL;
mUsbMassStorageConnected = false;
}
VolumeManager::~VolumeManager() {
delete mBlockDevices;
delete mVolumes;
delete mActiveContainers;
}
int VolumeManager::start() {
@ -257,7 +260,8 @@ int VolumeManager::createAsec(const char *id, unsigned int numSectors,
unlink(asecFileName);
return -1;
}
mActiveContainers->push_back(strdup(id));
return 0;
}
@ -324,6 +328,8 @@ int VolumeManager::unmountAsec(const char *id) {
return -1;
}
unlink(mountPoint);
if (Devmapper::destroy(id) && errno != ENXIO) {
LOGE("Failed to destroy devmapper instance (%s)", strerror(errno));
}
@ -332,6 +338,18 @@ int VolumeManager::unmountAsec(const char *id) {
if (!Loop::lookupActive(asecFileName, loopDevice, sizeof(loopDevice))) {
Loop::destroyByDevice(loopDevice);
}
AsecIdCollection::iterator it;
for (it = mActiveContainers->begin(); it != mActiveContainers->end(); ++it) {
if (!strcmp(*it, id)) {
free(*it);
mActiveContainers->erase(it);
break;
}
}
if (it == mActiveContainers->end()) {
LOGW("mActiveContainers is inconsistent!");
}
return 0;
}
@ -441,6 +459,7 @@ int VolumeManager::mountAsec(const char *id, const char *key, int ownerUid) {
return -1;
}
mActiveContainers->push_back(strdup(id));
LOGD("ASEC %s mounted", id);
return 0;
}
@ -610,6 +629,15 @@ int VolumeManager::unmountVolume(const char *label) {
return -1;
}
while(mActiveContainers->size()) {
AsecIdCollection::iterator it = mActiveContainers->begin();
LOGI("Unmounting ASEC %s (dependant on %s)", *it, v->getMountpoint());
if (unmountAsec(*it)) {
LOGE("Failed to unmount ASEC %s (%s) - unmount of %s may fail!", *it,
strerror(errno), v->getMountpoint());
}
}
return v->unmountVol();
}

View file

@ -25,6 +25,8 @@
#include "BlockDevice.h"
#include "Volume.h"
typedef android::List<char *> AsecIdCollection;
class VolumeManager {
private:
static VolumeManager *sInstance;
@ -34,6 +36,7 @@ private:
BlockDeviceCollection *mBlockDevices;
VolumeCollection *mVolumes;
AsecIdCollection *mActiveContainers;
bool mUsbMassStorageConnected;
public: