diff options
author | Kenny Root <kroot@google.com> | 2012-08-13 11:42:56 -0700 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2012-08-13 11:42:56 -0700 |
commit | 62224a32f00c344c8ba6edab2107c833700e26a8 (patch) | |
tree | 7bb495dc62af083f08d981a721fbeb3436aa596c | |
parent | 9ee8a315eefde7e6ad1bc07bc9d50528f548e8e8 (diff) | |
parent | eacf7e03d60a2b33ac6cdaa0e01bd6a6fdd9455a (diff) | |
download | system_vold-62224a32f00c344c8ba6edab2107c833700e26a8.zip system_vold-62224a32f00c344c8ba6edab2107c833700e26a8.tar.gz system_vold-62224a32f00c344c8ba6edab2107c833700e26a8.tar.bz2 |
am eacf7e03: Only cleanup ASECs in external storage DO NOT MERGE
* commit 'eacf7e03d60a2b33ac6cdaa0e01bd6a6fdd9455a':
Only cleanup ASECs in external storage DO NOT MERGE
-rw-r--r-- | VolumeManager.cpp | 49 | ||||
-rw-r--r-- | VolumeManager.h | 2 |
2 files changed, 38 insertions, 13 deletions
diff --git a/VolumeManager.cpp b/VolumeManager.cpp index 1c48932..0388010 100644 --- a/VolumeManager.cpp +++ b/VolumeManager.cpp @@ -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; + } diff --git a/VolumeManager.h b/VolumeManager.h index 4399b76..198b5a9 100644 --- a/VolumeManager.h +++ b/VolumeManager.h @@ -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); |