diff options
-rw-r--r-- | Android.mk | 1 | ||||
-rw-r--r-- | cmds/sm/src/com/android/commands/sm/Sm.java | 14 | ||||
-rw-r--r-- | core/java/android/os/storage/StorageManager.java | 2 | ||||
-rw-r--r-- | services/core/Android.mk | 1 | ||||
-rw-r--r-- | services/core/java/com/android/server/StorageManagerService.java | 151 |
5 files changed, 93 insertions, 76 deletions
diff --git a/Android.mk b/Android.mk index cedb60b00c02..05559fdf9ded 100644 --- a/Android.mk +++ b/Android.mk @@ -569,6 +569,7 @@ LOCAL_SRC_FILES += \ ../../system/netd/server/binder/android/net/INetd.aidl \ ../../system/vold/binder/android/os/IVold.aidl \ ../../system/vold/binder/android/os/IVoldListener.aidl \ + ../../system/vold/binder/android/os/IVoldTaskListener.aidl \ ../native/cmds/installd/binder/android/os/IInstalld.aidl \ LOCAL_AIDL_INCLUDES += system/update_engine/binder_bindings diff --git a/cmds/sm/src/com/android/commands/sm/Sm.java b/cmds/sm/src/com/android/commands/sm/Sm.java index 658d662de5e1..a9a4118a8e98 100644 --- a/cmds/sm/src/com/android/commands/sm/Sm.java +++ b/cmds/sm/src/com/android/commands/sm/Sm.java @@ -16,6 +16,10 @@ package com.android.commands.sm; +import static android.os.storage.StorageManager.PROP_ADOPTABLE_FBE; +import static android.os.storage.StorageManager.PROP_HAS_ADOPTABLE; +import static android.os.storage.StorageManager.PROP_VIRTUAL_DISK; + import android.os.RemoteException; import android.os.ServiceManager; import android.os.SystemProperties; @@ -134,7 +138,15 @@ public final class Sm { } public void runHasAdoptable() { - System.out.println(SystemProperties.getBoolean(StorageManager.PROP_HAS_ADOPTABLE, false)); + final boolean hasHardware = SystemProperties.getBoolean(PROP_HAS_ADOPTABLE, false) + || SystemProperties.getBoolean(PROP_VIRTUAL_DISK, false); + final boolean hasSoftware; + if (StorageManager.isFileEncryptedNativeOnly()) { + hasSoftware = SystemProperties.getBoolean(PROP_ADOPTABLE_FBE, false); + } else { + hasSoftware = true; + } + System.out.println(hasHardware && hasSoftware); } public void runGetPrimaryStorageUuid() throws RemoteException { diff --git a/core/java/android/os/storage/StorageManager.java b/core/java/android/os/storage/StorageManager.java index 70363468c097..6594cd070d24 100644 --- a/core/java/android/os/storage/StorageManager.java +++ b/core/java/android/os/storage/StorageManager.java @@ -221,8 +221,6 @@ public class StorageManager { /** {@hide} */ public static final int FSTRIM_FLAG_DEEP = IVold.FSTRIM_FLAG_DEEP_TRIM; - /** {@hide} */ - public static final int FSTRIM_FLAG_BENCHMARK = IVold.FSTRIM_FLAG_BENCHMARK_AFTER; /** @hide The volume is not encrypted. */ public static final int ENCRYPTION_STATE_NONE = diff --git a/services/core/Android.mk b/services/core/Android.mk index 7776346ff55b..599485ffe5c1 100644 --- a/services/core/Android.mk +++ b/services/core/Android.mk @@ -17,6 +17,7 @@ LOCAL_SRC_FILES += \ ../../../../system/netd/server/binder/android/net/metrics/INetdEventListener.aidl \ ../../../../system/vold/binder/android/os/IVold.aidl \ ../../../../system/vold/binder/android/os/IVoldListener.aidl \ + ../../../../system/vold/binder/android/os/IVoldTaskListener.aidl \ ../../../native/cmds/installd/binder/android/os/IInstalld.aidl \ LOCAL_AIDL_INCLUDES += \ diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java index e2c0e326365f..c0fcfd07a75f 100644 --- a/services/core/java/com/android/server/StorageManagerService.java +++ b/services/core/java/com/android/server/StorageManagerService.java @@ -58,10 +58,12 @@ import android.os.HandlerThread; import android.os.IBinder; import android.os.IVold; import android.os.IVoldListener; +import android.os.IVoldTaskListener; import android.os.Looper; import android.os.Message; import android.os.ParcelFileDescriptor; import android.os.ParcelableException; +import android.os.PersistableBundle; import android.os.PowerManager; import android.os.Process; import android.os.RemoteCallbackList; @@ -144,6 +146,7 @@ import java.util.Locale; import java.util.Map; import java.util.Map.Entry; import java.util.Objects; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; @@ -287,10 +290,6 @@ class StorageManagerService extends IStorageManager.Stub public static final int VOLUME_PATH_CHANGED = 655; public static final int VOLUME_INTERNAL_PATH_CHANGED = 656; public static final int VOLUME_DESTROYED = 659; - - public static final int MOVE_STATUS = 660; - public static final int BENCHMARK_RESULT = 661; - public static final int TRIM_RESULT = 662; } private static final int VERSION_INIT = 1; @@ -673,8 +672,8 @@ class StorageManagerService extends IStorageManager.Stub Slog.e(TAG, "Unable to record last fstrim!"); } - final int flags = shouldBenchmark() ? StorageManager.FSTRIM_FLAG_BENCHMARK : 0; - fstrim(flags); + // TODO: Reintroduce shouldBenchmark() test + fstrim(0); // invoke the completion callback, if any // TODO: fstrim is non-blocking, so remove this useless callback @@ -1249,52 +1248,6 @@ class StorageManagerService extends IStorageManager.Stub mListener.onVolumeDestroyed(volId); break; } - - case VoldResponseCode.MOVE_STATUS: { - final int status = Integer.parseInt(cooked[1]); - onMoveStatusLocked(status); - break; - } - case VoldResponseCode.BENCHMARK_RESULT: { - if (cooked.length != 7) break; - final String path = cooked[1]; - final String ident = cooked[2]; - final long create = Long.parseLong(cooked[3]); - final long drop = Long.parseLong(cooked[4]); - final long run = Long.parseLong(cooked[5]); - final long destroy = Long.parseLong(cooked[6]); - - final DropBoxManager dropBox = mContext.getSystemService(DropBoxManager.class); - dropBox.addText(TAG_STORAGE_BENCHMARK, scrubPath(path) - + " " + ident + " " + create + " " + run + " " + destroy); - - final VolumeRecord rec = findRecordForPath(path); - if (rec != null) { - rec.lastBenchMillis = System.currentTimeMillis(); - writeSettingsLocked(); - } - - break; - } - case VoldResponseCode.TRIM_RESULT: { - if (cooked.length != 4) break; - final String path = cooked[1]; - final long bytes = Long.parseLong(cooked[2]); - final long time = Long.parseLong(cooked[3]); - - final DropBoxManager dropBox = mContext.getSystemService(DropBoxManager.class); - dropBox.addText(TAG_STORAGE_TRIM, scrubPath(path) - + " " + bytes + " " + time); - - final VolumeRecord rec = findRecordForPath(path); - if (rec != null) { - rec.lastTrimMillis = System.currentTimeMillis(); - writeSettingsLocked(); - } - - break; - } - default: { Slog.d(TAG, "Unhandled vold event " + code); } @@ -2027,15 +1980,39 @@ class StorageManagerService extends IStorageManager.Stub enforcePermission(android.Manifest.permission.MOUNT_FORMAT_FILESYSTEMS); waitForReady(); + // TODO: refactor for callers to provide a listener try { - // TODO: make benchmark async so we don't block other commands - if (ENABLE_BINDER) { - return mVold.benchmark(volId); - } else { - final NativeDaemonEvent res = mConnector.execute(3 * DateUtils.MINUTE_IN_MILLIS, - "volume", "benchmark", volId); - return Long.parseLong(res.getMessage()); - } + final CompletableFuture<PersistableBundle> result = new CompletableFuture<>(); + mVold.benchmark(volId, new IVoldTaskListener.Stub() { + @Override + public void onStatus(int status, PersistableBundle extras) { + // Not currently used + } + + @Override + public void onFinished(int status, PersistableBundle extras) { + result.complete(extras); + + final String path = extras.getString("path"); + final String ident = extras.getString("ident"); + final long create = extras.getLong("create"); + final long run = extras.getLong("run"); + final long destroy = extras.getLong("destroy"); + + final DropBoxManager dropBox = mContext.getSystemService(DropBoxManager.class); + dropBox.addText(TAG_STORAGE_BENCHMARK, scrubPath(path) + + " " + ident + " " + create + " " + run + " " + destroy); + + synchronized (mLock) { + final VolumeRecord rec = findRecordForPath(path); + if (rec != null) { + rec.lastBenchMillis = System.currentTimeMillis(); + writeSettingsLocked(); + } + } + } + }); + return result.get(3, TimeUnit.MINUTES).getLong("run", Long.MAX_VALUE); } catch (Exception e) { Slog.wtf(TAG, e); return Long.MAX_VALUE; @@ -2199,16 +2176,36 @@ class StorageManagerService extends IStorageManager.Stub } else { cmd = "dotrim"; } - if ((flags & StorageManager.FSTRIM_FLAG_BENCHMARK) != 0) { - cmd += "bench"; - } try { - if (ENABLE_BINDER) { - mVold.fstrim(flags); - } else { - mConnector.execute("fstrim", cmd); - } + mVold.fstrim(flags, new IVoldTaskListener.Stub() { + @Override + public void onStatus(int status, PersistableBundle extras) { + // Ignore trim failures + if (status != 0) return; + + final String path = extras.getString("path"); + final long bytes = extras.getLong("bytes"); + final long time = extras.getLong("time"); + + final DropBoxManager dropBox = mContext.getSystemService(DropBoxManager.class); + dropBox.addText(TAG_STORAGE_TRIM, scrubPath(path) + " " + bytes + " " + time); + + synchronized (mLock) { + final VolumeRecord rec = findRecordForPath(path); + if (rec != null) { + rec.lastTrimMillis = System.currentTimeMillis(); + writeSettingsLocked(); + } + } + } + + @Override + public void onFinished(int status, PersistableBundle extras) { + // Not currently used + // TODO: benchmark when desired + } + }); } catch (Exception e) { Slog.wtf(TAG, e); } @@ -2388,11 +2385,19 @@ class StorageManagerService extends IStorageManager.Stub } try { - if (ENABLE_BINDER) { - mVold.moveStorage(from.id, to.id); - } else { - mConnector.execute("volume", "move_storage", from.id, to.id); - } + mVold.moveStorage(from.id, to.id, new IVoldTaskListener.Stub() { + @Override + public void onStatus(int status, PersistableBundle extras) { + synchronized (mLock) { + onMoveStatusLocked(status); + } + } + + @Override + public void onFinished(int status, PersistableBundle extras) { + // Not currently used + } + }); } catch (Exception e) { Slog.wtf(TAG, e); } |