diff options
3 files changed, 23 insertions, 0 deletions
diff --git a/core/java/android/os/storage/IStorageManager.aidl b/core/java/android/os/storage/IStorageManager.aidl index bf988ae59299..f114b12cc3d1 100644 --- a/core/java/android/os/storage/IStorageManager.aidl +++ b/core/java/android/os/storage/IStorageManager.aidl @@ -190,4 +190,5 @@ interface IStorageManager { void abortIdleMaintenance() = 80; String translateAppToSystem(String path, int pid, int uid) = 81; String translateSystemToApp(String path, int pid, int uid) = 82; + void commitChanges() = 83; } diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java index 923ac0063baf..74327f0fea33 100644 --- a/services/core/java/com/android/server/StorageManagerService.java +++ b/services/core/java/com/android/server/StorageManagerService.java @@ -2524,6 +2524,19 @@ class StorageManagerService extends IStorageManager.Stub } } + /** + * Signal that checkpointing partitions should commit changes + */ + @Override + public void commitChanges() throws RemoteException { + // Only the system process is permitted to commit checkpoints + if (Binder.getCallingUid() != android.os.Process.SYSTEM_UID) { + throw new SecurityException("no permission to commit checkpoint changes"); + } + + mVold.commitChanges(); + } + @Override public String getPassword() throws RemoteException { mContext.enforceCallingOrSelfPermission(Manifest.permission.CRYPT_KEEPER, diff --git a/services/core/java/com/android/server/am/UserController.java b/services/core/java/com/android/server/am/UserController.java index 353f787f9005..467c36f448e2 100644 --- a/services/core/java/com/android/server/am/UserController.java +++ b/services/core/java/com/android/server/am/UserController.java @@ -67,6 +67,7 @@ import android.os.IRemoteCallback; import android.os.IUserManager; import android.os.Looper; import android.os.Message; +import android.os.PowerManager; import android.os.Process; import android.os.RemoteCallbackList; import android.os.RemoteException; @@ -332,6 +333,14 @@ class UserController implements Handler.Callback { return; } } + // Inform checkpointing systems of success + try { + getStorageManager().commitChanges(); + } catch (Exception e) { + PowerManager pm = (PowerManager) + mInjector.getContext().getSystemService(Context.POWER_SERVICE); + pm.reboot("Checkpoint commit failed"); + } // We always walk through all the user lifecycle states to send // consistent developer events. We step into RUNNING_LOCKED here, |