Add shell commands to start checkpoint/check it is supported

Test: adb shell sm supports-checkpoint
Test: adb shell sm start-checkpoint 1 && adb reboot
Bug: 135984674
Change-Id: I08cd675b147cea88ad5b29ab4b0cd64ac445879d
Merged-In: I08cd675b147cea88ad5b29ab4b0cd64ac445879d
(cherry picked from commit 6d74942719)
This commit is contained in:
Nikita Ioffe
2020-01-14 22:19:01 +00:00
parent e88817bd42
commit bef21fbd25
2 changed files with 38 additions and 5 deletions

View File

@@ -103,6 +103,10 @@ public final class Sm {
runSetVirtualDisk();
} else if ("set-isolated-storage".equals(op)) {
runIsolatedStorage();
} else if ("start-checkpoint".equals(op)) {
runStartCheckpoint();
} else if ("supports-checkpoint".equals(op)) {
runSupportsCheckpoint();
} else {
throw new IllegalArgumentException();
}
@@ -313,6 +317,27 @@ public final class Sm {
}
}
private void runStartCheckpoint() throws RemoteException {
final String numRetriesString = nextArg();
if (numRetriesString == null) {
throw new IllegalArgumentException("Expected <num-retries>");
}
int numRetries;
try {
numRetries = Integer.parseInt(numRetriesString);
} catch (NumberFormatException e) {
throw new IllegalArgumentException("<num-retries> must be a positive integer");
}
if (numRetries <= 0) {
throw new IllegalArgumentException("<num-retries> must be a positive integer");
}
mSm.startCheckpoint(numRetries);
}
private void runSupportsCheckpoint() throws RemoteException {
System.out.println(mSm.supportsCheckpoint());
}
private String nextArg() {
if (mNextArg >= mArgs.length) {
return null;
@@ -344,6 +369,10 @@ public final class Sm {
System.err.println("");
System.err.println(" sm set-isolated-storage [on|off|default]");
System.err.println("");
System.err.println(" sm start-checkpoint <num-retries>");
System.err.println("");
System.err.println(" sm supports-checkpoint");
System.err.println("");
return 1;
}
}

View File

@@ -2648,9 +2648,11 @@ class StorageManagerService extends IStorageManager.Stub
*/
@Override
public boolean supportsCheckpoint() throws RemoteException {
// Only the system process is permitted to start checkpoints
if (Binder.getCallingUid() != android.os.Process.SYSTEM_UID) {
throw new SecurityException("no permission to check filesystem checkpoint support");
// Only the root, system_server and shell processes are permitted to start checkpoints
final int callingUid = Binder.getCallingUid();
if (callingUid != Process.SYSTEM_UID && callingUid != Process.ROOT_UID
&& callingUid != Process.SHELL_UID) {
throw new SecurityException("no permission to start filesystem checkpoint");
}
return mVold.supportsCheckpoint();
@@ -2665,8 +2667,10 @@ class StorageManagerService extends IStorageManager.Stub
*/
@Override
public void startCheckpoint(int numTries) throws RemoteException {
// Only the system process is permitted to start checkpoints
if (Binder.getCallingUid() != android.os.Process.SYSTEM_UID) {
// Only the root, system_server and shell processes are permitted to start checkpoints
final int callingUid = Binder.getCallingUid();
if (callingUid != Process.SYSTEM_UID && callingUid != Process.ROOT_UID
&& callingUid != Process.SHELL_UID) {
throw new SecurityException("no permission to start filesystem checkpoint");
}