From 901c04270f5968137d5c2911c5174003f3e2ecfe Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Fri, 20 Apr 2018 13:11:20 -0600 Subject: [PATCH] Extend adoptable override to force on or off. Virtual disks are adoptable by default, but for debugging purposes we want to treat them as unadoptable in some cases. Add the ability for the "sm" shell command to force on/off, or return to default. Bug: 77849654, 74132243 Test: manual Change-Id: Ieda317396624ca081e5dd9568795483f684f9297 --- cmds/sm/src/com/android/commands/sm/Sm.java | 20 ++++++++--- core/java/android/os/storage/StorageManager.java | 14 ++++---- .../com/android/server/StorageManagerService.java | 42 +++++++++++++--------- 3 files changed, 49 insertions(+), 27 deletions(-) diff --git a/cmds/sm/src/com/android/commands/sm/Sm.java b/cmds/sm/src/com/android/commands/sm/Sm.java index 2bb7edcc7467..09343f174587 100644 --- a/cmds/sm/src/com/android/commands/sm/Sm.java +++ b/cmds/sm/src/com/android/commands/sm/Sm.java @@ -147,9 +147,21 @@ public final class Sm { } public void runSetForceAdoptable() throws RemoteException { - final boolean forceAdoptable = Boolean.parseBoolean(nextArg()); - mSm.setDebugFlags(forceAdoptable ? StorageManager.DEBUG_FORCE_ADOPTABLE : 0, - StorageManager.DEBUG_FORCE_ADOPTABLE); + final int mask = StorageManager.DEBUG_ADOPTABLE_FORCE_ON + | StorageManager.DEBUG_ADOPTABLE_FORCE_OFF; + switch (nextArg()) { + case "on": + case "true": + mSm.setDebugFlags(StorageManager.DEBUG_ADOPTABLE_FORCE_ON, mask); + break; + case "off": + mSm.setDebugFlags(StorageManager.DEBUG_ADOPTABLE_FORCE_OFF, mask); + break; + case "default": + case "false": + mSm.setDebugFlags(0, mask); + break; + } } public void runSetSdcardfs() throws RemoteException { @@ -289,7 +301,7 @@ public final class Sm { System.err.println(" sm list-volumes [public|private|emulated|all]"); System.err.println(" sm has-adoptable"); System.err.println(" sm get-primary-storage-uuid"); - System.err.println(" sm set-force-adoptable [true|false]"); + System.err.println(" sm set-force-adoptable [on|off|default]"); System.err.println(" sm set-virtual-disk [true|false]"); System.err.println(""); System.err.println(" sm partition DISK [public|private|mixed] [ratio]"); diff --git a/core/java/android/os/storage/StorageManager.java b/core/java/android/os/storage/StorageManager.java index 8905ad1e6abc..2d1bb2f25d88 100644 --- a/core/java/android/os/storage/StorageManager.java +++ b/core/java/android/os/storage/StorageManager.java @@ -115,7 +115,7 @@ public class StorageManager { /** {@hide} */ public static final String PROP_HAS_RESERVED = "vold.has_reserved"; /** {@hide} */ - public static final String PROP_FORCE_ADOPTABLE = "persist.fw.force_adoptable"; + public static final String PROP_ADOPTABLE = "persist.sys.adoptable"; /** {@hide} */ public static final String PROP_EMULATE_FBE = "persist.sys.emulate_fbe"; /** {@hide} */ @@ -197,15 +197,17 @@ public class StorageManager { public static final String EXTRA_REQUESTED_BYTES = "android.os.storage.extra.REQUESTED_BYTES"; /** {@hide} */ - public static final int DEBUG_FORCE_ADOPTABLE = 1 << 0; + public static final int DEBUG_ADOPTABLE_FORCE_ON = 1 << 0; /** {@hide} */ - public static final int DEBUG_EMULATE_FBE = 1 << 1; + public static final int DEBUG_ADOPTABLE_FORCE_OFF = 1 << 1; /** {@hide} */ - public static final int DEBUG_SDCARDFS_FORCE_ON = 1 << 2; + public static final int DEBUG_EMULATE_FBE = 1 << 2; /** {@hide} */ - public static final int DEBUG_SDCARDFS_FORCE_OFF = 1 << 3; + public static final int DEBUG_SDCARDFS_FORCE_ON = 1 << 3; /** {@hide} */ - public static final int DEBUG_VIRTUAL_DISK = 1 << 4; + public static final int DEBUG_SDCARDFS_FORCE_OFF = 1 << 4; + /** {@hide} */ + public static final int DEBUG_VIRTUAL_DISK = 1 << 5; // NOTE: keep in sync with installd /** {@hide} */ diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java index 99e0459d5d23..6c35bdae5a3e 100644 --- a/services/core/java/com/android/server/StorageManagerService.java +++ b/services/core/java/com/android/server/StorageManagerService.java @@ -25,11 +25,9 @@ import static android.os.storage.OnObbStateChangeListener.ERROR_PERMISSION_DENIE import static android.os.storage.OnObbStateChangeListener.MOUNTED; import static android.os.storage.OnObbStateChangeListener.UNMOUNTED; -import static com.android.internal.util.XmlUtils.readBooleanAttribute; import static com.android.internal.util.XmlUtils.readIntAttribute; import static com.android.internal.util.XmlUtils.readLongAttribute; import static com.android.internal.util.XmlUtils.readStringAttribute; -import static com.android.internal.util.XmlUtils.writeBooleanAttribute; import static com.android.internal.util.XmlUtils.writeIntAttribute; import static com.android.internal.util.XmlUtils.writeLongAttribute; import static com.android.internal.util.XmlUtils.writeStringAttribute; @@ -249,7 +247,6 @@ class StorageManagerService extends IStorageManager.Stub private static final String TAG_VOLUMES = "volumes"; private static final String ATTR_VERSION = "version"; private static final String ATTR_PRIMARY_STORAGE_UUID = "primaryStorageUuid"; - private static final String ATTR_FORCE_ADOPTABLE = "forceAdoptable"; private static final String TAG_VOLUME = "volume"; private static final String ATTR_TYPE = "type"; private static final String ATTR_FS_UUID = "fsUuid"; @@ -287,8 +284,6 @@ class StorageManagerService extends IStorageManager.Stub private ArrayMap mRecords = new ArrayMap<>(); @GuardedBy("mLock") private String mPrimaryStorageUuid; - @GuardedBy("mLock") - private boolean mForceAdoptable; /** Map from disk ID to latches */ @GuardedBy("mLock") @@ -1011,9 +1006,14 @@ class StorageManagerService extends IStorageManager.Stub @Override public void onDiskCreated(String diskId, int flags) { synchronized (mLock) { - if (SystemProperties.getBoolean(StorageManager.PROP_FORCE_ADOPTABLE, false) - || mForceAdoptable) { - flags |= DiskInfo.FLAG_ADOPTABLE; + final String value = SystemProperties.get(StorageManager.PROP_ADOPTABLE); + switch (value) { + case "force_on": + flags |= DiskInfo.FLAG_ADOPTABLE; + break; + case "force_off": + flags &= ~DiskInfo.FLAG_ADOPTABLE; + break; } mDisks.put(diskId, new DiskInfo(diskId, flags)); } @@ -1530,7 +1530,6 @@ class StorageManagerService extends IStorageManager.Stub private void readSettingsLocked() { mRecords.clear(); mPrimaryStorageUuid = getDefaultPrimaryStorageUuid(); - mForceAdoptable = false; FileInputStream fis = null; try { @@ -1552,7 +1551,6 @@ class StorageManagerService extends IStorageManager.Stub mPrimaryStorageUuid = readStringAttribute(in, ATTR_PRIMARY_STORAGE_UUID); } - mForceAdoptable = readBooleanAttribute(in, ATTR_FORCE_ADOPTABLE, false); } else if (TAG_VOLUME.equals(tag)) { final VolumeRecord rec = readVolumeRecord(in); @@ -1583,7 +1581,6 @@ class StorageManagerService extends IStorageManager.Stub out.startTag(null, TAG_VOLUMES); writeIntAttribute(out, ATTR_VERSION, VERSION_FIX_PRIMARY); writeStringAttribute(out, ATTR_PRIMARY_STORAGE_UUID, mPrimaryStorageUuid); - writeBooleanAttribute(out, ATTR_FORCE_ADOPTABLE, mForceAdoptable); final int size = mRecords.size(); for (int i = 0; i < size; i++) { final VolumeRecord rec = mRecords.valueAt(i); @@ -1980,12 +1977,25 @@ class StorageManagerService extends IStorageManager.Stub } } - if ((mask & StorageManager.DEBUG_FORCE_ADOPTABLE) != 0) { - synchronized (mLock) { - mForceAdoptable = (flags & StorageManager.DEBUG_FORCE_ADOPTABLE) != 0; + if ((mask & (StorageManager.DEBUG_ADOPTABLE_FORCE_ON + | StorageManager.DEBUG_ADOPTABLE_FORCE_OFF)) != 0) { + final String value; + if ((flags & StorageManager.DEBUG_ADOPTABLE_FORCE_ON) != 0) { + value = "force_on"; + } else if ((flags & StorageManager.DEBUG_ADOPTABLE_FORCE_OFF) != 0) { + value = "force_off"; + } else { + value = ""; + } - writeSettingsLocked(); + final long token = Binder.clearCallingIdentity(); + try { + SystemProperties.set(StorageManager.PROP_ADOPTABLE, value); + + // Reset storage to kick new setting into place mHandler.obtainMessage(H_RESET).sendToTarget(); + } finally { + Binder.restoreCallingIdentity(token); } } @@ -3564,8 +3574,6 @@ class StorageManagerService extends IStorageManager.Stub pw.print(DataUnit.MEBIBYTES.toBytes(pair.second)); pw.println(" MiB)"); } - pw.println("Force adoptable: " + mForceAdoptable); - pw.println(); pw.println("Local unlocked users: " + Arrays.toString(mLocalUnlockedUsers)); pw.println("System unlocked users: " + Arrays.toString(mSystemUnlockedUsers)); } -- 2.11.0