diff options
4 files changed, 86 insertions, 3 deletions
diff --git a/cmds/sm/src/com/android/commands/sm/Sm.java b/cmds/sm/src/com/android/commands/sm/Sm.java index 699de94a0240..77e8efafa2a0 100644 --- a/cmds/sm/src/com/android/commands/sm/Sm.java +++ b/cmds/sm/src/com/android/commands/sm/Sm.java @@ -101,6 +101,8 @@ public final class Sm { runSetEmulateFbe(); } else if ("get-fbe-mode".equals(op)) { runGetFbeMode(); + } else if ("idle-maint".equals(op)) { + runIdleMaint(); } else if ("fstrim".equals(op)) { runFstrim(); } else if ("set-virtual-disk".equals(op)) { @@ -278,6 +280,15 @@ public final class Sm { StorageManager.DEBUG_VIRTUAL_DISK); } + public void runIdleMaint() throws RemoteException { + final boolean im_run = "run".equals(nextArg()); + if (im_run) { + mSm.runIdleMaintenance(); + } else { + mSm.abortIdleMaintenance(); + } + } + private String nextArg() { if (mNextArg >= mArgs.length) { return null; @@ -300,6 +311,7 @@ public final class Sm { System.err.println(" sm unmount VOLUME"); System.err.println(" sm format VOLUME"); System.err.println(" sm benchmark VOLUME"); + System.err.println(" sm idle-maint [run|abort]"); System.err.println(" sm fstrim"); System.err.println(""); System.err.println(" sm forget [UUID|all]"); diff --git a/core/java/android/os/storage/IStorageManager.aidl b/core/java/android/os/storage/IStorageManager.aidl index 0b76eec4ae0b..2ffc7b028d9b 100644 --- a/core/java/android/os/storage/IStorageManager.aidl +++ b/core/java/android/os/storage/IStorageManager.aidl @@ -186,4 +186,6 @@ interface IStorageManager { long getAllocatableBytes(String volumeUuid, int flags, String callingPackage) = 77; void allocateBytes(String volumeUuid, long bytes, int flags, String callingPackage) = 78; void secdiscard(in String path) = 79; + void runIdleMaintenance() = 80; + void abortIdleMaintenance() = 81; } diff --git a/services/core/java/com/android/server/MountServiceIdler.java b/services/core/java/com/android/server/MountServiceIdler.java index d8bd0bb5a93c..1891ba9b1742 100644 --- a/services/core/java/com/android/server/MountServiceIdler.java +++ b/services/core/java/com/android/server/MountServiceIdler.java @@ -72,7 +72,7 @@ public class MountServiceIdler extends JobService { synchronized (mFinishCallback) { mStarted = true; } - ms.runIdleMaintenance(mFinishCallback); + ms.runIdleMaint(mFinishCallback); } return ms != null; } @@ -82,8 +82,12 @@ public class MountServiceIdler extends JobService { // Once we kick off the fstrim we aren't actually interruptible; just note // that we don't need to call jobFinished(), and let everything happen in // the callback from the mount service. - synchronized (mFinishCallback) { - mStarted = false; + StorageManagerService ms = StorageManagerService.sSelf; + if (ms != null) { + ms.abortIdleMaint(mFinishCallback); + synchronized (mFinishCallback) { + mStarted = false; + } } return false; } diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java index 75e8000ea2c1..3c955eb0f0db 100644 --- a/services/core/java/com/android/server/StorageManagerService.java +++ b/services/core/java/com/android/server/StorageManagerService.java @@ -542,6 +542,8 @@ class StorageManagerService extends IStorageManager.Stub implements Watchdog.Mon private static final int H_VOLUME_UNMOUNT = 8; private static final int H_PARTITION_FORGET = 9; private static final int H_RESET = 10; + private static final int H_RUN_IDLE_MAINT = 11; + private static final int H_ABORT_IDLE_MAINT = 12; class StorageManagerServiceHandler extends Handler { public StorageManagerServiceHandler(Looper looper) { @@ -650,6 +652,17 @@ class StorageManagerService extends IStorageManager.Stub implements Watchdog.Mon resetIfReadyAndConnected(); break; } + case H_RUN_IDLE_MAINT: { + Slog.i(TAG, "Running idle maintenance"); + runIdleMaint((Runnable)msg.obj); + break; + } + case H_ABORT_IDLE_MAINT: { + Slog.i(TAG, "Aborting idle maintenance"); + abortIdleMaint((Runnable)msg.obj); + break; + } + } } } @@ -1779,6 +1792,58 @@ class StorageManagerService extends IStorageManager.Stub implements Watchdog.Mon } } + void runIdleMaint(Runnable callback) { + enforcePermission(android.Manifest.permission.MOUNT_FORMAT_FILESYSTEMS); + + try { + mVold.runIdleMaint(new IVoldTaskListener.Stub() { + @Override + public void onStatus(int status, PersistableBundle extras) { + // Not currently used + } + @Override + public void onFinished(int status, PersistableBundle extras) { + if (callback != null) { + BackgroundThread.getHandler().post(callback); + } + } + }); + } catch (Exception e) { + Slog.wtf(TAG, e); + } + } + + @Override + public void runIdleMaintenance() { + runIdleMaint(null); + } + + void abortIdleMaint(Runnable callback) { + enforcePermission(android.Manifest.permission.MOUNT_FORMAT_FILESYSTEMS); + + try { + mVold.abortIdleMaint(new IVoldTaskListener.Stub() { + @Override + public void onStatus(int status, PersistableBundle extras) { + // Not currently used + } + @Override + public void onFinished(int status, PersistableBundle extras) { + if (callback != null) { + BackgroundThread.getHandler().post(callback); + } + } + }); + } catch (Exception e) { + Slog.wtf(TAG, e); + } + } + + @Override + public void abortIdleMaintenance() { + abortIdleMaint(null); + } + private void remountUidExternalStorage(int uid, int mode) { try { mVold.remountUid(uid, mode); |