Forcibly unmount the sdcard after N retries.

Don't rely on the ActivityManager's reported status about killing the
storage user process since the process might have gone away in between.

Change-Id: Ia7fa43eb34553329e7ff611ab6b99375b5ae673a
diff --git a/services/java/com/android/server/MountService.java b/services/java/com/android/server/MountService.java
index 90cb585..6ceeb95 100644
--- a/services/java/com/android/server/MountService.java
+++ b/services/java/com/android/server/MountService.java
@@ -213,15 +213,14 @@
                 }
                 case H_UNMOUNT_PM_DONE: {
                     if (DEBUG_UNMOUNT) Slog.i(TAG, "H_UNMOUNT_PM_DONE");
-                    if (!mUpdatingStatus) {
-                        // Does not correspond to unmount's status update.
-                        return;
-                    }
                     if (DEBUG_UNMOUNT) Slog.i(TAG, "Updated status. Processing requests");
                     mUpdatingStatus = false;
                     int size = mForceUnmounts.size();
                     int sizeArr[] = new int[size];
                     int sizeArrN = 0;
+                    // Kill processes holding references first
+                    ActivityManagerService ams = (ActivityManagerService)
+                    ServiceManager.getService("activity");
                     for (int i = 0; i < size; i++) {
                         UnmountCallBack ucb = mForceUnmounts.get(i);
                         String path = ucb.path;
@@ -233,35 +232,30 @@
                             if (pids == null || pids.length == 0) {
                                 done = true;
                             } else {
-                                // Kill processes holding references first
-                                ActivityManagerService ams = (ActivityManagerService)
-                                ServiceManager.getService("activity");
                                 // Eliminate system process here?
-                                boolean ret = ams.killPids(pids, "Unmount media");
-                                if (ret) {
-                                    // Confirm if file references have been freed.
-                                    pids = getStorageUsers(path);
-                                    if (pids == null || pids.length == 0) {
-                                        done = true;
-                                    }
+                                ams.killPids(pids, "unmount media");
+                                // Confirm if file references have been freed.
+                                pids = getStorageUsers(path);
+                                if (pids == null || pids.length == 0) {
+                                    done = true;
                                 }
                             }
                         }
-                        if (done) {
+                        if (!done && (ucb.retries < MAX_UNMOUNT_RETRIES)) {
+                            // Retry again
+                            Slog.i(TAG, "Retrying to kill storage users again");
+                            mHandler.sendMessageDelayed(
+                                    mHandler.obtainMessage(H_UNMOUNT_PM_DONE,
+                                            ucb.retries++),
+                                    RETRY_UNMOUNT_DELAY);
+                        } else {
+                            if (ucb.retries >= MAX_UNMOUNT_RETRIES) {
+                                Slog.i(TAG, "Failed to unmount media inspite of " +
+                                        MAX_UNMOUNT_RETRIES + " retries. Forcibly killing processes now");
+                            }
                             sizeArr[sizeArrN++] = i;
                             mHandler.sendMessage(mHandler.obtainMessage(H_UNMOUNT_MS,
                                     ucb));
-                        } else {
-                            if (ucb.retries >= MAX_UNMOUNT_RETRIES) {
-                                Slog.i(TAG, "Cannot unmount media inspite of " +
-                                        MAX_UNMOUNT_RETRIES + " retries");
-                                // Send final broadcast indicating failure to unmount.                 
-                            } else {
-                                mHandler.sendMessageDelayed(
-                                        mHandler.obtainMessage(H_UNMOUNT_PM_DONE,
-                                                ucb.retries++),
-                                        RETRY_UNMOUNT_DELAY);
-                            }
                         }
                     }
                     // Remove already processed elements from list.