From 33dd156ed0ed839c5e77beb116f6f1a9566416e3 Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Thu, 7 Apr 2016 11:05:33 -0600 Subject: [PATCH] Give users and devices control over sdcardfs. Instead of relying only on kernel support for sdcardfs, give each device the ability to quickly toggle between sdcardfs and FUSE. Also add the ability to users to explicitly enable/disable the behavior for testing and debugging purposes. Bug: 27991427 Change-Id: Ia57f12f6ead888ab85101004bdd8c8003537b116 --- cmds/sm/src/com/android/commands/sm/Sm.java | 18 ++++++++++++++++++ core/java/android/os/storage/StorageManager.java | 6 ++++++ .../core/java/com/android/server/MountService.java | 22 ++++++++++++++++++++++ 3 files changed, 46 insertions(+) diff --git a/cmds/sm/src/com/android/commands/sm/Sm.java b/cmds/sm/src/com/android/commands/sm/Sm.java index 0e674c864137..d527ad73b787 100644 --- a/cmds/sm/src/com/android/commands/sm/Sm.java +++ b/cmds/sm/src/com/android/commands/sm/Sm.java @@ -74,6 +74,8 @@ public final class Sm { runGetPrimaryStorageUuid(); } else if ("set-force-adoptable".equals(op)) { runSetForceAdoptable(); + } else if ("set-sdcardfs".equals(op)) { + runSetSdcardfs(); } else if ("partition".equals(op)) { runPartition(); } else if ("mount".equals(op)) { @@ -141,6 +143,22 @@ public final class Sm { StorageManager.DEBUG_FORCE_ADOPTABLE); } + public void runSetSdcardfs() throws RemoteException { + final int mask = StorageManager.DEBUG_SDCARDFS_FORCE_ON + | StorageManager.DEBUG_SDCARDFS_FORCE_OFF; + switch (nextArg()) { + case "on": + mSm.setDebugFlags(StorageManager.DEBUG_SDCARDFS_FORCE_ON, mask); + break; + case "off": + mSm.setDebugFlags(StorageManager.DEBUG_SDCARDFS_FORCE_OFF, mask); + break; + case "default": + mSm.setDebugFlags(0, mask); + break; + } + } + public void runSetEmulateFbe() throws RemoteException { final boolean emulateFbe = Boolean.parseBoolean(nextArg()); mSm.setDebugFlags(emulateFbe ? StorageManager.DEBUG_EMULATE_FBE : 0, diff --git a/core/java/android/os/storage/StorageManager.java b/core/java/android/os/storage/StorageManager.java index f2e316cf214f..710f88413f3a 100644 --- a/core/java/android/os/storage/StorageManager.java +++ b/core/java/android/os/storage/StorageManager.java @@ -83,6 +83,8 @@ public class StorageManager { public static final String PROP_FORCE_ADOPTABLE = "persist.fw.force_adoptable"; /** {@hide} */ public static final String PROP_EMULATE_FBE = "persist.sys.emulate_fbe"; + /** {@hide} */ + public static final String PROP_SDCARDFS = "persist.sys.sdcardfs"; /** {@hide} */ public static final String UUID_PRIVATE_INTERNAL = null; @@ -93,6 +95,10 @@ public class StorageManager { public static final int DEBUG_FORCE_ADOPTABLE = 1 << 0; /** {@hide} */ public static final int DEBUG_EMULATE_FBE = 1 << 1; + /** {@hide} */ + public static final int DEBUG_SDCARDFS_FORCE_ON = 1 << 2; + /** {@hide} */ + public static final int DEBUG_SDCARDFS_FORCE_OFF = 1 << 3; // NOTE: keep in sync with installd /** {@hide} */ diff --git a/services/core/java/com/android/server/MountService.java b/services/core/java/com/android/server/MountService.java index 440d8b7b81c0..fd9a94d4e2ef 100644 --- a/services/core/java/com/android/server/MountService.java +++ b/services/core/java/com/android/server/MountService.java @@ -1984,6 +1984,28 @@ class MountService extends IMountService.Stub mHandler.obtainMessage(H_RESET).sendToTarget(); } } + + if ((mask & (StorageManager.DEBUG_SDCARDFS_FORCE_ON + | StorageManager.DEBUG_SDCARDFS_FORCE_OFF)) != 0) { + final String value; + if ((flags & StorageManager.DEBUG_SDCARDFS_FORCE_ON) != 0) { + value = "force_on"; + } else if ((flags & StorageManager.DEBUG_SDCARDFS_FORCE_OFF) != 0) { + value = "force_off"; + } else { + value = ""; + } + + final long token = Binder.clearCallingIdentity(); + try { + SystemProperties.set(StorageManager.PROP_SDCARDFS, value); + + // Reset storage to kick new setting into place + mHandler.obtainMessage(H_RESET).sendToTarget(); + } finally { + Binder.restoreCallingIdentity(token); + } + } } @Override -- 2.11.0