MountService: Add API call for getting a list of pids currently using the specified mountpoint

Signed-off-by: San Mehat <san@google.com>
diff --git a/core/java/android/os/storage/IMountService.aidl b/core/java/android/os/storage/IMountService.aidl
index 3d1ef25..816baf3 100644
--- a/core/java/android/os/storage/IMountService.aidl
+++ b/core/java/android/os/storage/IMountService.aidl
@@ -72,6 +72,12 @@
     int formatVolume(String mountPoint);
 
     /**
+     * Returns an array of pids with open files on
+     * the specified path.
+     */
+    int[] getStorageUsers(String path);
+
+    /**
      * Gets the state of an volume via it's mountpoint.
      */
     String getVolumeState(String mountPoint);
@@ -94,7 +100,7 @@
      * NOTE: Ensure all references are released prior to deleting.
      * Returns an int consistent with MountServiceResultCode
      */
-     int destroySecureContainer(String id);
+    int destroySecureContainer(String id);
 
     /*
      * Mount a secure container with the specified key and owner UID.
diff --git a/services/java/com/android/server/MountService.java b/services/java/com/android/server/MountService.java
index e764bbb..4e2ffa4 100644
--- a/services/java/com/android/server/MountService.java
+++ b/services/java/com/android/server/MountService.java
@@ -80,6 +80,7 @@
          */
         public static final int VolumeListResult               = 110;
         public static final int AsecListResult                 = 111;
+        public static final int StorageUsersListResult         = 112;
 
         /*
          * 200 series - Requestion action has been successfully completed.
@@ -795,6 +796,31 @@
         return doFormatVolume(path);
     }
 
+    public int []getStorageUsers(String path) {
+        validatePermission(android.Manifest.permission.MOUNT_UNMOUNT_FILESYSTEMS);
+        waitForReady();
+        try {
+            String[] r = mConnector.doListCommand(
+                    String.format("storage users %s", path),
+                            VoldResponseCode.StorageUsersListResult);
+            // FMT: <pid> <process name>
+            int[] data = new int[r.length];
+            for (int i = 0; i < r.length; i++) {
+                String []tok = r[i].split(" ");
+                try {
+                    data[i] = Integer.parseInt(tok[0]);
+                } catch (NumberFormatException nfe) {
+                    Log.e(TAG, String.format("Error parsing pid %s", tok[0]));
+                    return new int[0];
+                }
+            }
+            return data;
+        } catch (NativeDaemonConnectorException e) {
+            Log.e(TAG, "Failed to retrieve storage users list", e);
+            return new int[0];
+        }
+    }
+
     private void warnOnNotMounted() {
         if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
             Log.w(TAG, "getSecureContainerList() called when storage not mounted");