am eacf7e03
: Only cleanup ASECs in external storage DO NOT MERGE
* commit 'eacf7e03d60a2b33ac6cdaa0e01bd6a6fdd9455a': Only cleanup ASECs in external storage DO NOT MERGE
This commit is contained in:
commit
62224a32f0
2 changed files with 38 additions and 13 deletions
|
@ -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…
Reference in a new issue