Sm.java revision 52cd1c5717b6f3761307f26d433902f2ee6406f6
17d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey/* 27d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey * Copyright (C) 2015 The Android Open Source Project 37d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey * 47d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey * Licensed under the Apache License, Version 2.0 (the "License"); 57d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey * you may not use this file except in compliance with the License. 67d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey * You may obtain a copy of the License at 77d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey * 87d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey * http://www.apache.org/licenses/LICENSE-2.0 97d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey * 107d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey * Unless required by applicable law or agreed to in writing, software 117d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey * distributed under the License is distributed on an "AS IS" BASIS, 127d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey * See the License for the specific language governing permissions and 147d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey * limitations under the License. 157d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey */ 167d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey 177d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkeypackage com.android.commands.sm; 187d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey 19b302c54f11d5468100c566fba8e70d8614490e1aJeff Sharkeyimport static android.os.storage.StorageManager.PROP_ADOPTABLE_FBE; 20b302c54f11d5468100c566fba8e70d8614490e1aJeff Sharkeyimport static android.os.storage.StorageManager.PROP_HAS_ADOPTABLE; 21b302c54f11d5468100c566fba8e70d8614490e1aJeff Sharkeyimport static android.os.storage.StorageManager.PROP_VIRTUAL_DISK; 22b302c54f11d5468100c566fba8e70d8614490e1aJeff Sharkey 237e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkeyimport android.os.IBinder; 247e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkeyimport android.os.IVoldTaskListener; 257e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkeyimport android.os.PersistableBundle; 267d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkeyimport android.os.RemoteException; 277d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkeyimport android.os.ServiceManager; 280d838a0fad500a3c446df501d8aa7656c2c3a7a2Jeff Sharkeyimport android.os.SystemProperties; 297d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkeyimport android.os.storage.DiskInfo; 302250d56a0b47b93016018340c8f4040325aa5611Sudheer Shankaimport android.os.storage.IStorageManager; 310d838a0fad500a3c446df501d8aa7656c2c3a7a2Jeff Sharkeyimport android.os.storage.StorageManager; 327d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkeyimport android.os.storage.VolumeInfo; 337d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkeyimport android.util.Log; 347d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey 357e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkeyimport java.util.concurrent.CompletableFuture; 367e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey 377d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkeypublic final class Sm { 387d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey private static final String TAG = "Sm"; 397d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey 402250d56a0b47b93016018340c8f4040325aa5611Sudheer Shanka IStorageManager mSm; 417d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey 427d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey private String[] mArgs; 437d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey private int mNextArg; 447d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey private String mCurArgData; 457d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey 467d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey public static void main(String[] args) { 477d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey boolean success = false; 487d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey try { 497d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey new Sm().run(args); 507d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey success = true; 517d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey } catch (Exception e) { 527d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey if (e instanceof IllegalArgumentException) { 537d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey showUsage(); 5482bfca4609244f2b8169bd779765791d6638b448Brian Carlstrom System.exit(1); 557d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey } 567d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey Log.e(TAG, "Error", e); 577d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey System.err.println("Error: " + e); 587d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey } 597d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey System.exit(success ? 0 : 1); 607d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey } 617d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey 627d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey public void run(String[] args) throws Exception { 637d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey if (args.length < 1) { 647d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey throw new IllegalArgumentException(); 657d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey } 667d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey 672250d56a0b47b93016018340c8f4040325aa5611Sudheer Shanka mSm = IStorageManager.Stub.asInterface(ServiceManager.getService("mount")); 687d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey if (mSm == null) { 697d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey throw new RemoteException("Failed to find running mount service"); 707d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey } 717d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey 727d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey mArgs = args; 737d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey String op = args[0]; 747d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey mNextArg = 1; 757d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey 767d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey if ("list-disks".equals(op)) { 777d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey runListDisks(); 787d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey } else if ("list-volumes".equals(op)) { 797d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey runListVolumes(); 800d838a0fad500a3c446df501d8aa7656c2c3a7a2Jeff Sharkey } else if ("has-adoptable".equals(op)) { 810d838a0fad500a3c446df501d8aa7656c2c3a7a2Jeff Sharkey runHasAdoptable(); 827d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey } else if ("get-primary-storage-uuid".equals(op)) { 837d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey runGetPrimaryStorageUuid(); 844c099d0c49c8366efd3c26854465b3ceef49b627Jeff Sharkey } else if ("set-force-adoptable".equals(op)) { 854c099d0c49c8366efd3c26854465b3ceef49b627Jeff Sharkey runSetForceAdoptable(); 8633dd156ed0ed839c5e77beb116f6f1a9566416e3Jeff Sharkey } else if ("set-sdcardfs".equals(op)) { 8733dd156ed0ed839c5e77beb116f6f1a9566416e3Jeff Sharkey runSetSdcardfs(); 887d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey } else if ("partition".equals(op)) { 897d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey runPartition(); 907d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey } else if ("mount".equals(op)) { 917d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey runMount(); 927d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey } else if ("unmount".equals(op)) { 937d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey runUnmount(); 947d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey } else if ("format".equals(op)) { 957d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey runFormat(); 9685ced632680642fce680d141ddd10299ff849233Jeff Sharkey } else if ("benchmark".equals(op)) { 9785ced632680642fce680d141ddd10299ff849233Jeff Sharkey runBenchmark(); 987d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey } else if ("forget".equals(op)) { 997d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey runForget(); 100f9fc6d6cc05595241bc7ced6d4cab97b45f9b901Jeff Sharkey } else if ("set-emulate-fbe".equals(op)) { 101f9fc6d6cc05595241bc7ced6d4cab97b45f9b901Jeff Sharkey runSetEmulateFbe(); 102b5e89c6debca90be92bf5bc2e0e79d109de6d08fJeff Sharkey } else if ("get-fbe-mode".equals(op)) { 103b5e89c6debca90be92bf5bc2e0e79d109de6d08fJeff Sharkey runGetFbeMode(); 10452cd1c5717b6f3761307f26d433902f2ee6406f6Jin Qian } else if ("idle-maint".equals(op)) { 10552cd1c5717b6f3761307f26d433902f2ee6406f6Jin Qian runIdleMaint(); 10631d0b7043d9077ad8a0ebfbd6ff2f98621e6f413Jeff Sharkey } else if ("fstrim".equals(op)) { 10731d0b7043d9077ad8a0ebfbd6ff2f98621e6f413Jeff Sharkey runFstrim(); 108e53e2d9576cbcf6fc2bd9c8674e162bef7297226Jeff Sharkey } else if ("set-virtual-disk".equals(op)) { 109e53e2d9576cbcf6fc2bd9c8674e162bef7297226Jeff Sharkey runSetVirtualDisk(); 1107d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey } else { 1117d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey throw new IllegalArgumentException(); 1127d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey } 1137d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey } 1147d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey 1157d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey public void runListDisks() throws RemoteException { 11685ced632680642fce680d141ddd10299ff849233Jeff Sharkey final boolean onlyAdoptable = "adoptable".equals(nextArg()); 1177d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey final DiskInfo[] disks = mSm.getDisks(); 1187d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey for (DiskInfo disk : disks) { 11985ced632680642fce680d141ddd10299ff849233Jeff Sharkey if (!onlyAdoptable || disk.isAdoptable()) { 12085ced632680642fce680d141ddd10299ff849233Jeff Sharkey System.out.println(disk.getId()); 12185ced632680642fce680d141ddd10299ff849233Jeff Sharkey } 1227d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey } 1237d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey } 1247d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey 1257d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey public void runListVolumes() throws RemoteException { 1267d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey final String filter = nextArg(); 1277d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey final int filterType; 1287d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey if ("public".equals(filter)) { 1297d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey filterType = VolumeInfo.TYPE_PUBLIC; 1307d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey } else if ("private".equals(filter)) { 1317d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey filterType = VolumeInfo.TYPE_PRIVATE; 1327d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey } else if ("emulated".equals(filter)) { 1337d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey filterType = VolumeInfo.TYPE_EMULATED; 1347d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey } else { 1357d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey filterType = -1; 1367d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey } 1377d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey 1387d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey final VolumeInfo[] vols = mSm.getVolumes(0); 1397d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey for (VolumeInfo vol : vols) { 1407d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey if (filterType == -1 || filterType == vol.getType()) { 1417d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey final String envState = VolumeInfo.getEnvironmentForState(vol.getState()); 1427d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey System.out.println(vol.getId() + " " + envState + " " + vol.getFsUuid()); 1437d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey } 1447d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey } 1457d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey } 1467d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey 1470d838a0fad500a3c446df501d8aa7656c2c3a7a2Jeff Sharkey public void runHasAdoptable() { 148b302c54f11d5468100c566fba8e70d8614490e1aJeff Sharkey final boolean hasHardware = SystemProperties.getBoolean(PROP_HAS_ADOPTABLE, false) 149b302c54f11d5468100c566fba8e70d8614490e1aJeff Sharkey || SystemProperties.getBoolean(PROP_VIRTUAL_DISK, false); 150b302c54f11d5468100c566fba8e70d8614490e1aJeff Sharkey final boolean hasSoftware; 151b302c54f11d5468100c566fba8e70d8614490e1aJeff Sharkey if (StorageManager.isFileEncryptedNativeOnly()) { 152b302c54f11d5468100c566fba8e70d8614490e1aJeff Sharkey hasSoftware = SystemProperties.getBoolean(PROP_ADOPTABLE_FBE, false); 153b302c54f11d5468100c566fba8e70d8614490e1aJeff Sharkey } else { 154b302c54f11d5468100c566fba8e70d8614490e1aJeff Sharkey hasSoftware = true; 155b302c54f11d5468100c566fba8e70d8614490e1aJeff Sharkey } 156b302c54f11d5468100c566fba8e70d8614490e1aJeff Sharkey System.out.println(hasHardware && hasSoftware); 1570d838a0fad500a3c446df501d8aa7656c2c3a7a2Jeff Sharkey } 1580d838a0fad500a3c446df501d8aa7656c2c3a7a2Jeff Sharkey 1590d838a0fad500a3c446df501d8aa7656c2c3a7a2Jeff Sharkey public void runGetPrimaryStorageUuid() throws RemoteException { 1607d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey System.out.println(mSm.getPrimaryStorageUuid()); 1617d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey } 1627d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey 1634c099d0c49c8366efd3c26854465b3ceef49b627Jeff Sharkey public void runSetForceAdoptable() throws RemoteException { 1644c099d0c49c8366efd3c26854465b3ceef49b627Jeff Sharkey final boolean forceAdoptable = Boolean.parseBoolean(nextArg()); 1654c099d0c49c8366efd3c26854465b3ceef49b627Jeff Sharkey mSm.setDebugFlags(forceAdoptable ? StorageManager.DEBUG_FORCE_ADOPTABLE : 0, 1664c099d0c49c8366efd3c26854465b3ceef49b627Jeff Sharkey StorageManager.DEBUG_FORCE_ADOPTABLE); 1674c099d0c49c8366efd3c26854465b3ceef49b627Jeff Sharkey } 16833dd156ed0ed839c5e77beb116f6f1a9566416e3Jeff Sharkey 16933dd156ed0ed839c5e77beb116f6f1a9566416e3Jeff Sharkey public void runSetSdcardfs() throws RemoteException { 17033dd156ed0ed839c5e77beb116f6f1a9566416e3Jeff Sharkey final int mask = StorageManager.DEBUG_SDCARDFS_FORCE_ON 17133dd156ed0ed839c5e77beb116f6f1a9566416e3Jeff Sharkey | StorageManager.DEBUG_SDCARDFS_FORCE_OFF; 17233dd156ed0ed839c5e77beb116f6f1a9566416e3Jeff Sharkey switch (nextArg()) { 17333dd156ed0ed839c5e77beb116f6f1a9566416e3Jeff Sharkey case "on": 17433dd156ed0ed839c5e77beb116f6f1a9566416e3Jeff Sharkey mSm.setDebugFlags(StorageManager.DEBUG_SDCARDFS_FORCE_ON, mask); 17533dd156ed0ed839c5e77beb116f6f1a9566416e3Jeff Sharkey break; 17633dd156ed0ed839c5e77beb116f6f1a9566416e3Jeff Sharkey case "off": 17733dd156ed0ed839c5e77beb116f6f1a9566416e3Jeff Sharkey mSm.setDebugFlags(StorageManager.DEBUG_SDCARDFS_FORCE_OFF, mask); 17833dd156ed0ed839c5e77beb116f6f1a9566416e3Jeff Sharkey break; 17933dd156ed0ed839c5e77beb116f6f1a9566416e3Jeff Sharkey case "default": 18033dd156ed0ed839c5e77beb116f6f1a9566416e3Jeff Sharkey mSm.setDebugFlags(0, mask); 18133dd156ed0ed839c5e77beb116f6f1a9566416e3Jeff Sharkey break; 18233dd156ed0ed839c5e77beb116f6f1a9566416e3Jeff Sharkey } 18333dd156ed0ed839c5e77beb116f6f1a9566416e3Jeff Sharkey } 1844c099d0c49c8366efd3c26854465b3ceef49b627Jeff Sharkey 185f9fc6d6cc05595241bc7ced6d4cab97b45f9b901Jeff Sharkey public void runSetEmulateFbe() throws RemoteException { 186f9fc6d6cc05595241bc7ced6d4cab97b45f9b901Jeff Sharkey final boolean emulateFbe = Boolean.parseBoolean(nextArg()); 187f9fc6d6cc05595241bc7ced6d4cab97b45f9b901Jeff Sharkey mSm.setDebugFlags(emulateFbe ? StorageManager.DEBUG_EMULATE_FBE : 0, 188f9fc6d6cc05595241bc7ced6d4cab97b45f9b901Jeff Sharkey StorageManager.DEBUG_EMULATE_FBE); 189f9fc6d6cc05595241bc7ced6d4cab97b45f9b901Jeff Sharkey } 190f9fc6d6cc05595241bc7ced6d4cab97b45f9b901Jeff Sharkey 191b5e89c6debca90be92bf5bc2e0e79d109de6d08fJeff Sharkey public void runGetFbeMode() { 192b5e89c6debca90be92bf5bc2e0e79d109de6d08fJeff Sharkey if (StorageManager.isFileEncryptedNativeOnly()) { 193b5e89c6debca90be92bf5bc2e0e79d109de6d08fJeff Sharkey System.out.println("native"); 194b5e89c6debca90be92bf5bc2e0e79d109de6d08fJeff Sharkey } else if (StorageManager.isFileEncryptedEmulatedOnly()) { 195b5e89c6debca90be92bf5bc2e0e79d109de6d08fJeff Sharkey System.out.println("emulated"); 196b5e89c6debca90be92bf5bc2e0e79d109de6d08fJeff Sharkey } else { 197b5e89c6debca90be92bf5bc2e0e79d109de6d08fJeff Sharkey System.out.println("none"); 198b5e89c6debca90be92bf5bc2e0e79d109de6d08fJeff Sharkey } 199b5e89c6debca90be92bf5bc2e0e79d109de6d08fJeff Sharkey } 200b5e89c6debca90be92bf5bc2e0e79d109de6d08fJeff Sharkey 2017d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey public void runPartition() throws RemoteException { 2027d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey final String diskId = nextArg(); 2037d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey final String type = nextArg(); 2047d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey if ("public".equals(type)) { 2057d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey mSm.partitionPublic(diskId); 2067d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey } else if ("private".equals(type)) { 2077d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey mSm.partitionPrivate(diskId); 2087d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey } else if ("mixed".equals(type)) { 2097d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey final int ratio = Integer.parseInt(nextArg()); 2107d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey mSm.partitionMixed(diskId, ratio); 2117d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey } else { 2127d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey throw new IllegalArgumentException("Unsupported partition type " + type); 2137d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey } 2147d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey } 2157d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey 2167d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey public void runMount() throws RemoteException { 2177d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey final String volId = nextArg(); 2187d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey mSm.mount(volId); 2197d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey } 2207d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey 2217d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey public void runUnmount() throws RemoteException { 2227d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey final String volId = nextArg(); 2237d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey mSm.unmount(volId); 2247d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey } 2257d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey 2267d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey public void runFormat() throws RemoteException { 2277d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey final String volId = nextArg(); 2287d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey mSm.format(volId); 2297d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey } 2307d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey 2317e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey public void runBenchmark() throws Exception { 23285ced632680642fce680d141ddd10299ff849233Jeff Sharkey final String volId = nextArg(); 2337e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey final CompletableFuture<PersistableBundle> result = new CompletableFuture<>(); 2347e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey mSm.benchmark(volId, new IVoldTaskListener.Stub() { 2357e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey @Override 2367e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey public void onStatus(int status, PersistableBundle extras) { 2377e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey // Ignored 2387e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey } 2397e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey 2407e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey @Override 2417e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey public void onFinished(int status, PersistableBundle extras) { 2427e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey // Touch to unparcel 2437e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey extras.size(); 2447e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey result.complete(extras); 2457e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey } 2467e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey }); 2477e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey System.out.println(result.get()); 24885ced632680642fce680d141ddd10299ff849233Jeff Sharkey } 24985ced632680642fce680d141ddd10299ff849233Jeff Sharkey 25031d0b7043d9077ad8a0ebfbd6ff2f98621e6f413Jeff Sharkey public void runForget() throws RemoteException { 2517d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey final String fsUuid = nextArg(); 2527d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey if ("all".equals(fsUuid)) { 2537d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey mSm.forgetAllVolumes(); 2547d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey } else { 2557d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey mSm.forgetVolume(fsUuid); 2567d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey } 2577d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey } 2587d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey 2597e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey public void runFstrim() throws Exception { 2607e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey final CompletableFuture<PersistableBundle> result = new CompletableFuture<>(); 2617e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey mSm.fstrim(0, new IVoldTaskListener.Stub() { 2627e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey @Override 2637e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey public void onStatus(int status, PersistableBundle extras) { 2647e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey // Ignored 2657e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey } 2667e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey 2677e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey @Override 2687e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey public void onFinished(int status, PersistableBundle extras) { 2697e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey // Touch to unparcel 2707e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey extras.size(); 2717e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey result.complete(extras); 2727e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey } 2737e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey }); 2747e19f53f75386eab289a2ddf33dd6619775d6f21Jeff Sharkey System.out.println(result.get()); 27531d0b7043d9077ad8a0ebfbd6ff2f98621e6f413Jeff Sharkey } 27631d0b7043d9077ad8a0ebfbd6ff2f98621e6f413Jeff Sharkey 277e53e2d9576cbcf6fc2bd9c8674e162bef7297226Jeff Sharkey public void runSetVirtualDisk() throws RemoteException { 278e53e2d9576cbcf6fc2bd9c8674e162bef7297226Jeff Sharkey final boolean virtualDisk = Boolean.parseBoolean(nextArg()); 279e53e2d9576cbcf6fc2bd9c8674e162bef7297226Jeff Sharkey mSm.setDebugFlags(virtualDisk ? StorageManager.DEBUG_VIRTUAL_DISK : 0, 280e53e2d9576cbcf6fc2bd9c8674e162bef7297226Jeff Sharkey StorageManager.DEBUG_VIRTUAL_DISK); 281e53e2d9576cbcf6fc2bd9c8674e162bef7297226Jeff Sharkey } 282e53e2d9576cbcf6fc2bd9c8674e162bef7297226Jeff Sharkey 28352cd1c5717b6f3761307f26d433902f2ee6406f6Jin Qian public void runIdleMaint() throws RemoteException { 28452cd1c5717b6f3761307f26d433902f2ee6406f6Jin Qian final boolean im_run = "run".equals(nextArg()); 28552cd1c5717b6f3761307f26d433902f2ee6406f6Jin Qian if (im_run) { 28652cd1c5717b6f3761307f26d433902f2ee6406f6Jin Qian mSm.runIdleMaintenance(); 28752cd1c5717b6f3761307f26d433902f2ee6406f6Jin Qian } else { 28852cd1c5717b6f3761307f26d433902f2ee6406f6Jin Qian mSm.abortIdleMaintenance(); 28952cd1c5717b6f3761307f26d433902f2ee6406f6Jin Qian } 29052cd1c5717b6f3761307f26d433902f2ee6406f6Jin Qian } 29152cd1c5717b6f3761307f26d433902f2ee6406f6Jin Qian 2927d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey private String nextArg() { 2937d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey if (mNextArg >= mArgs.length) { 2947d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey return null; 2957d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey } 2967d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey String arg = mArgs[mNextArg]; 2977d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey mNextArg++; 2987d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey return arg; 2997d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey } 3007d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey 3017d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey private static int showUsage() { 30285ced632680642fce680d141ddd10299ff849233Jeff Sharkey System.err.println("usage: sm list-disks [adoptable]"); 3037d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey System.err.println(" sm list-volumes [public|private|emulated|all]"); 3040d838a0fad500a3c446df501d8aa7656c2c3a7a2Jeff Sharkey System.err.println(" sm has-adoptable"); 3057d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey System.err.println(" sm get-primary-storage-uuid"); 3064c099d0c49c8366efd3c26854465b3ceef49b627Jeff Sharkey System.err.println(" sm set-force-adoptable [true|false]"); 307e53e2d9576cbcf6fc2bd9c8674e162bef7297226Jeff Sharkey System.err.println(" sm set-virtual-disk [true|false]"); 3087d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey System.err.println(""); 3097d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey System.err.println(" sm partition DISK [public|private|mixed] [ratio]"); 3107d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey System.err.println(" sm mount VOLUME"); 3117d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey System.err.println(" sm unmount VOLUME"); 3127d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey System.err.println(" sm format VOLUME"); 31385ced632680642fce680d141ddd10299ff849233Jeff Sharkey System.err.println(" sm benchmark VOLUME"); 31452cd1c5717b6f3761307f26d433902f2ee6406f6Jin Qian System.err.println(" sm idle-maint [run|abort]"); 31531d0b7043d9077ad8a0ebfbd6ff2f98621e6f413Jeff Sharkey System.err.println(" sm fstrim"); 3167d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey System.err.println(""); 3177d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey System.err.println(" sm forget [UUID|all]"); 3187d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey System.err.println(""); 319f9fc6d6cc05595241bc7ced6d4cab97b45f9b901Jeff Sharkey System.err.println(" sm set-emulate-fbe [true|false]"); 320f9fc6d6cc05595241bc7ced6d4cab97b45f9b901Jeff Sharkey System.err.println(""); 3217d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey return 1; 3227d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey } 3237d2af54a98358e9dea96f879ebd1ea915263522bJeff Sharkey} 324