vold: Ensure we cleanup secure containers on card removal.

Fixes bug: http://b/issue?id=2567572

Note: The framework will still likely restart since the system_server
is holding references to assets on the card which are mmaped, but
at least now storage will be available when a new card is re-inserted.

Change-Id: I4e195c0c666426b93da47198fa826a6f58d855a9
Signed-off-by: San Mehat <san@google.com>
diff --git a/DirectVolume.cpp b/DirectVolume.cpp
index c269303..1f9f084 100644
--- a/DirectVolume.cpp
+++ b/DirectVolume.cpp
@@ -284,6 +284,11 @@
                  getLabel(), getMountpoint(), major, minor);
         mVm->getBroadcaster()->sendBroadcast(ResponseCode::VolumeBadRemoval,
                                              msg, false);
+
+	if (mVm->cleanupAsec(this, true)) {
+            SLOGE("Failed to cleanup ASEC - unmount will probably fail!");
+        }
+
         if (Volume::unmountVol(true)) {
             SLOGE("Failed to unmount volume on bad removal (%s)", 
                  strerror(errno));
diff --git a/VolumeManager.cpp b/VolumeManager.cpp
index 10dbbb5..8a70c37 100644
--- a/VolumeManager.cpp
+++ b/VolumeManager.cpp
@@ -886,14 +886,7 @@
         return -1;
     }
 
-    while(mActiveContainers->size()) {
-        AsecIdCollection::iterator it = mActiveContainers->begin();
-        SLOGI("Unmounting ASEC %s (dependant on %s)", *it, v->getMountpoint());
-        if (unmountAsec(*it, force)) {
-            SLOGE("Failed to unmount ASEC %s (%s)", *it, strerror(errno));
-            return -1;
-        }
-    }
+    cleanupAsec(v, force);
 
     return v->unmountVol(force);
 }
@@ -942,3 +935,15 @@
     return false;
 }
 
+int VolumeManager::cleanupAsec(Volume *v, bool force) {
+    while(mActiveContainers->size()) {
+        AsecIdCollection::iterator it = mActiveContainers->begin();
+        SLOGI("Unmounting ASEC %s (dependant on %s)", *it, v->getMountpoint());
+        if (unmountAsec(*it, force)) {
+            SLOGE("Failed to unmount ASEC %s (%s)", *it, strerror(errno));
+            return -1;
+        }
+    }
+    return 0;
+}
+
diff --git a/VolumeManager.h b/VolumeManager.h
index a675646..2ec9eb3 100644
--- a/VolumeManager.h
+++ b/VolumeManager.h
@@ -71,6 +71,8 @@
 
     // XXX: This should be moved private once switch uevents are working
     void notifyUmsConnected(bool connected);
+    // XXX: Post froyo this should be moved and cleaned up
+    int cleanupAsec(Volume *v, bool force);
 
     void setBroadcaster(SocketListener *sl) { mBroadcaster = sl; }
     SocketListener *getBroadcaster() { return mBroadcaster; }
@@ -78,6 +80,7 @@
     static VolumeManager *Instance();
 
     static char *asecHash(const char *id, char *buffer, size_t len);
+
 private:
     VolumeManager();
     Volume *lookupVolume(const char *label);