Only cleanup ASECs in external storage DO NOT MERGE

Any ASEC or OBB files were unmounted when USB storage was set to UMS
mode. This changes it so only ASEC files on external storage and OBB
files mounted from external storage are unmounted.

(Cherry-pick of 93ecb38dad)

Bug: 6948035
Change-Id: Ib60727bd360caa32173797ff5b4e1e21fcf20054
gugelfrei
Kenny Root 12 years ago
parent 425524dba1
commit eacf7e03d6

@ -985,6 +985,19 @@ int VolumeManager::mountAsec(const char *id, const char *key, int ownerUid) {
return 0;
}
Volume* VolumeManager::getVolumeForFile(const char *fileName) {
VolumeCollection::iterator i;
for (i = mVolumes->begin(); i != mVolumes->end(); ++i) {
const char* mountPoint = (*i)->getMountpoint();
if (!strncmp(fileName, mountPoint, strlen(mountPoint))) {
return *i;
}
}
return NULL;
}
/**
* Mounts an image file <code>img</code>.
*/
@ -1113,7 +1126,7 @@ int VolumeManager::listMountedObbs(SocketClient* cli) {
}
// Create a string to compare against that has a trailing slash
int loopDirLen = sizeof(Volume::LOOPDIR);
int loopDirLen = strlen(Volume::LOOPDIR);
char loopDir[loopDirLen + 2];
strcpy(loopDir, Volume::LOOPDIR);
loopDir[loopDirLen++] = '/';
@ -1462,25 +1475,35 @@ bool VolumeManager::isMountpointMounted(const char *mp)
}
int VolumeManager::cleanupAsec(Volume *v, bool force) {
while(mActiveContainers->size()) {
AsecIdCollection::iterator it = mActiveContainers->begin();
int rc = unmountAllAsecsInDir(Volume::SEC_ASECDIR_EXT);
AsecIdCollection toUnmount;
// Find the remaining OBB files that are on external storage.
for (AsecIdCollection::iterator it = mActiveContainers->begin(); it != mActiveContainers->end();
++it) {
ContainerData* cd = *it;
SLOGI("Unmounting ASEC %s (dependant on %s)", cd->id, v->getMountpoint());
if (cd->type == ASEC) {
if (unmountAsec(cd->id, force)) {
SLOGE("Failed to unmount ASEC %s (%s)", cd->id, strerror(errno));
return -1;
}
// nothing
} else if (cd->type == OBB) {
if (unmountObb(cd->id, force)) {
SLOGE("Failed to unmount OBB %s (%s)", cd->id, strerror(errno));
return -1;
if (v == getVolumeForFile(cd->id)) {
toUnmount.push_back(cd);
}
} else {
SLOGE("Unknown container type %d!", cd->type);
return -1;
}
}
return 0;
for (AsecIdCollection::iterator it = toUnmount.begin(); it != toUnmount.end(); ++it) {
ContainerData *cd = *it;
SLOGI("Unmounting ASEC %s (dependant on %s)", cd->id, v->getMountpoint());
if (unmountObb(cd->id, force)) {
SLOGE("Failed to unmount OBB %s (%s)", cd->id, strerror(errno));
rc = -1;
}
}
return rc;
}

@ -117,6 +117,8 @@ public:
int unmountObb(const char *fileName, bool force);
int getObbMountPath(const char *id, char *buffer, int maxlen);
Volume* getVolumeForFile(const char *fileName);
/* Shared between ASEC and Loopback images */
int unmountLoopImage(const char *containerId, const char *loopId,
const char *fileName, const char *mountPoint, bool force);

Loading…
Cancel
Save