Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 41cd681f authored by Jeff Sharkey's avatar Jeff Sharkey
Browse files

Move even more vold commands over to Binder.

This moves fstrim, obb and appfuse commands over to the new Binder
interface.  This change also separates creating/destroying and
mounting/unmounting of OBB volumes, which means they finally flow
nicely into the modern VolumeInfo/VolumeBase design.

Test: cts-tradefed run commandAndExit cts-dev -m CtsOsTestCases -t android.os.storage.cts.StorageManagerTest
Bug: 13758960
Change-Id: I4de45889828a9ab9858cc7c4f094a90eaff10f96
parent 09fc5ea3
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@ import android.os.Binder;
import android.os.Environment;
import android.os.FileUtils;
import android.os.Handler;
import android.os.IVold;
import android.os.Looper;
import android.os.Message;
import android.os.ParcelFileDescriptor;
@@ -219,9 +220,9 @@ public class StorageManager {
    public static final int FLAG_INCLUDE_INVISIBLE = 1 << 10;

    /** {@hide} */
    public static final int FSTRIM_FLAG_DEEP = 1 << 0;
    public static final int FSTRIM_FLAG_DEEP = IVold.FSTRIM_FLAG_DEEP_TRIM;
    /** {@hide} */
    public static final int FSTRIM_FLAG_BENCHMARK = 1 << 1;
    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 = 1;
+69 −22
Original line number Diff line number Diff line
@@ -530,13 +530,13 @@ class StorageManagerService extends IStorageManager.Stub

    class ObbState implements IBinder.DeathRecipient {
        public ObbState(String rawPath, String canonicalPath, int callingUid,
                IObbActionListener token, int nonce) {
                IObbActionListener token, int nonce, String volId) {
            this.rawPath = rawPath;
            this.canonicalPath = canonicalPath;

            this.ownerGid = UserHandle.getSharedAppGid(callingUid);
            this.token = token;
            this.nonce = nonce;
            this.volId = volId;
        }

        final String rawPath;
@@ -550,6 +550,8 @@ class StorageManagerService extends IStorageManager.Stub
        // Identifier to pass back to the token
        final int nonce;

        String volId;

        public IBinder getBinder() {
            return token.asBinder();
        }
@@ -576,6 +578,7 @@ class StorageManagerService extends IStorageManager.Stub
            sb.append(",ownerGid=").append(ownerGid);
            sb.append(",token=").append(token);
            sb.append(",binder=").append(getBinder());
            sb.append(",volId=").append(volId);
            sb.append('}');
            return sb.toString();
        }
@@ -686,6 +689,7 @@ class StorageManagerService extends IStorageManager.Stub
                    try {
                        if (ENABLE_BINDER) {
                            mVold.shutdown();
                            success = true;
                        } else {
                            success = mConnector.execute("volume", "shutdown").isClassOk();
                        }
@@ -2087,9 +2091,13 @@ class StorageManagerService extends IStorageManager.Stub
        }

        try {
            if (ENABLE_BINDER) {
                mVold.fstrim(flags);
            } else {
                mConnector.execute("fstrim", cmd);
        } catch (NativeDaemonConnectorException e) {
            Slog.e(TAG, "Failed to run fstrim: " + e);
            }
        } catch (Exception e) {
            Slog.wtf(TAG, e);
        }
    }

@@ -2651,6 +2659,10 @@ class StorageManagerService extends IStorageManager.Stub
            return null;
        }

        if (ENABLE_BINDER) {
            return findVolumeByIdOrThrow(state.volId).getPath().getAbsolutePath();
        }

        final NativeDaemonEvent event;
        try {
            event = mConnector.execute("obb", "path", state.canonicalPath);
@@ -2682,7 +2694,8 @@ class StorageManagerService extends IStorageManager.Stub
        Preconditions.checkNotNull(token, "token cannot be null");

        final int callingUid = Binder.getCallingUid();
        final ObbState obbState = new ObbState(rawPath, canonicalPath, callingUid, token, nonce);
        final ObbState obbState = new ObbState(rawPath, canonicalPath,
                callingUid, token, nonce, null);
        final ObbAction action = new MountObbAction(obbState, key, callingUid);
        mObbActionHandler.sendMessage(mObbActionHandler.obtainMessage(OBB_RUN_ACTION, action));

@@ -2702,8 +2715,8 @@ class StorageManagerService extends IStorageManager.Stub
        if (existingState != null) {
            // TODO: separate state object from request data
            final int callingUid = Binder.getCallingUid();
            final ObbState newState = new ObbState(
                    rawPath, existingState.canonicalPath, callingUid, token, nonce);
            final ObbState newState = new ObbState(rawPath, existingState.canonicalPath,
                    callingUid, token, nonce, existingState.volId);
            final ObbAction action = new UnmountObbAction(newState, force);
            mObbActionHandler.sendMessage(mObbActionHandler.obtainMessage(OBB_RUN_ACTION, action));

@@ -3167,7 +3180,15 @@ class StorageManagerService extends IStorageManager.Stub

        @Override
        public ParcelFileDescriptor open() throws NativeDaemonConnectorException {
            final NativeDaemonEvent event = StorageManagerService.this.mConnector.execute(
            if (ENABLE_BINDER) {
                try {
                    return new ParcelFileDescriptor(
                            mVold.mountAppFuse(uid, Process.myPid(), mountId));
                } catch (Exception e) {
                    throw new NativeDaemonConnectorException("Failed to mount", e);
                }
            } else {
                final NativeDaemonEvent event = mConnector.execute(
                        "appfuse", "mount", uid, Process.myPid(), mountId);
                opened = true;
                if (event.getFileDescriptors() == null ||
@@ -3176,11 +3197,16 @@ class StorageManagerService extends IStorageManager.Stub
                }
                return new ParcelFileDescriptor(event.getFileDescriptors()[0]);
            }
        }

        @Override
        public void close() throws Exception {
            if (opened) {
                if (ENABLE_BINDER) {
                    mVold.unmountAppFuse(uid, Process.myPid(), mountId);
                } else {
                    mConnector.execute("appfuse", "unmount", uid, Process.myPid(), mountId);
                }
                opened = false;
            }
        }
@@ -3848,8 +3874,10 @@ class StorageManagerService extends IStorageManager.Stub
            }

            final String hashedKey;
            final String binderKey;
            if (mKey == null) {
                hashedKey = "none";
                binderKey = "";
            } else {
                try {
                    SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
@@ -3859,6 +3887,7 @@ class StorageManagerService extends IStorageManager.Stub
                    SecretKey key = factory.generateSecret(ks);
                    BigInteger bi = new BigInteger(key.getEncoded());
                    hashedKey = bi.toString(16);
                    binderKey = hashedKey;
                } catch (NoSuchAlgorithmException e) {
                    Slog.e(TAG, "Could not load PBKDF2 algorithm", e);
                    sendNewStatusOrIgnore(OnObbStateChangeListener.ERROR_INTERNAL);
@@ -3872,13 +3901,22 @@ class StorageManagerService extends IStorageManager.Stub

            int rc = StorageResultCode.OperationSucceeded;
            try {
                mConnector.execute("obb", "mount", mObbState.canonicalPath, new SensitiveArg(hashedKey),
                if (ENABLE_BINDER) {
                    mObbState.volId = mVold.createObb(mObbState.canonicalPath, binderKey,
                            mObbState.ownerGid);
                    mVold.mount(mObbState.volId, 0, -1);
                } else {
                    mConnector.execute("obb", "mount", mObbState.canonicalPath,
                            new SensitiveArg(hashedKey), mObbState.ownerGid);
                }
            } catch (NativeDaemonConnectorException e) {
                int code = e.getCode();
                if (code != VoldResponseCode.OpFailedStorageBusy) {
                    rc = StorageResultCode.OperationFailedInternalError;
                }
            } catch (Exception e) {
                Slog.w(TAG, e);
                rc = StorageResultCode.OperationFailedInternalError;
            }

            if (rc == StorageResultCode.OperationSucceeded) {
@@ -3944,11 +3982,17 @@ class StorageManagerService extends IStorageManager.Stub

            int rc = StorageResultCode.OperationSucceeded;
            try {
                if (ENABLE_BINDER) {
                    mVold.unmount(mObbState.volId);
                    mVold.destroyObb(mObbState.volId);
                    mObbState.volId = null;
                } else {
                    final Command cmd = new Command("obb", "unmount", mObbState.canonicalPath);
                    if (mForceUnmount) {
                        cmd.appendArg("force");
                    }
                    mConnector.execute(cmd);
                }
            } catch (NativeDaemonConnectorException e) {
                int code = e.getCode();
                if (code == VoldResponseCode.OpFailedStorageBusy) {
@@ -3959,6 +4003,9 @@ class StorageManagerService extends IStorageManager.Stub
                } else {
                    rc = StorageResultCode.OperationFailedInternalError;
                }
            } catch (Exception e) {
                Slog.w(TAG, e);
                rc = StorageResultCode.OperationFailedInternalError;
            }

            if (rc == StorageResultCode.OperationSucceeded) {