summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKenny Root <kroot@google.com>2012-08-13 11:42:56 -0700
committerAndroid Git Automerger <android-git-automerger@android.com>2012-08-13 11:42:56 -0700
commit62224a32f00c344c8ba6edab2107c833700e26a8 (patch)
tree7bb495dc62af083f08d981a721fbeb3436aa596c
parent9ee8a315eefde7e6ad1bc07bc9d50528f548e8e8 (diff)
parenteacf7e03d60a2b33ac6cdaa0e01bd6a6fdd9455a (diff)
downloadsystem_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.cpp49
-rw-r--r--VolumeManager.h2
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);