VoldNativeService.cpp revision 01a0e7fa189b37b82be971bc50ecce5883523293
1068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey/*
2068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey * Copyright (C) 2017 The Android Open Source Project
3068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey *
4068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey * Licensed under the Apache License, Version 2.0 (the "License");
5068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey * you may not use this file except in compliance with the License.
6068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey * You may obtain a copy of the License at
7068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey *
8068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey *      http://www.apache.org/licenses/LICENSE-2.0
9068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey *
10068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey * Unless required by applicable law or agreed to in writing, software
11068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey * distributed under the License is distributed on an "AS IS" BASIS,
12068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey * See the License for the specific language governing permissions and
14068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey * limitations under the License.
15068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey */
16068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey
1767b8c4953051cb14d0333856a057e5acba273d0eJeff Sharkey#define ATRACE_TAG ATRACE_TAG_PACKAGE_MANAGER
1867b8c4953051cb14d0333856a057e5acba273d0eJeff Sharkey
19068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey#include "VoldNativeService.h"
20068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey#include "VolumeManager.h"
2101a0e7fa189b37b82be971bc50ecce5883523293Jeff Sharkey#include "Benchmark.h"
2201a0e7fa189b37b82be971bc50ecce5883523293Jeff Sharkey#include "MoveStorage.h"
2383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey#include "Process.h"
2401a0e7fa189b37b82be971bc50ecce5883523293Jeff Sharkey#include "IdleMaint.h"
25068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey
2683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey#include "cryptfs.h"
2783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey#include "Ext4Crypt.h"
2883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey#include "MetadataCrypt.h"
2983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
30068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey#include <fstream>
3101a0e7fa189b37b82be971bc50ecce5883523293Jeff Sharkey#include <thread>
32068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey
33068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey#include <android-base/logging.h>
34068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey#include <android-base/stringprintf.h>
35068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey#include <android-base/strings.h>
363b71fc51005ac566fd8120f01b784d5f251ad886Paul Crowley#include <ext4_utils/ext4_crypt.h>
3711c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey#include <fs_mgr.h>
38068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey#include <private/android_filesystem_config.h>
3967b8c4953051cb14d0333856a057e5acba273d0eJeff Sharkey#include <utils/Trace.h>
40068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey
41068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkeyusing android::base::StringPrintf;
42068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkeyusing std::endl;
43068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey
44068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkeynamespace android {
45068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkeynamespace vold {
46068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey
47068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkeynamespace {
48068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey
49068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkeyconstexpr const char* kDump = "android.permission.DUMP";
50068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey
51068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkeystatic binder::Status ok() {
52068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    return binder::Status::ok();
53068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey}
54068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey
55068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkeystatic binder::Status exception(uint32_t code, const std::string& msg) {
56068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    return binder::Status::fromExceptionCode(code, String8(msg.c_str()));
57068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey}
58068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey
599462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkeystatic binder::Status error(const std::string& msg) {
609462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    PLOG(ERROR) << msg;
619462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    return binder::Status::fromServiceSpecificError(errno, String8(msg.c_str()));
629462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey}
639462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
6483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeystatic binder::Status translate(int status) {
659462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    if (status == 0) {
669462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey        return binder::Status::ok();
679462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    } else {
6811c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey        return binder::Status::fromServiceSpecificError(status);
699462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    }
709462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey}
719462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
7283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeystatic binder::Status translateBool(bool status) {
7383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    if (status) {
7483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        return binder::Status::ok();
7583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    } else {
7683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        return binder::Status::fromServiceSpecificError(status);
7783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    }
7883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
7983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
80068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkeybinder::Status checkPermission(const char* permission) {
81068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    pid_t pid;
82068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    uid_t uid;
83068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey
84068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    if (checkCallingPermission(String16(permission), reinterpret_cast<int32_t*>(&pid),
85068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey            reinterpret_cast<int32_t*>(&uid))) {
86068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey        return ok();
87068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    } else {
88068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey        return exception(binder::Status::EX_SECURITY,
89068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey                StringPrintf("UID %d / PID %d lacks permission %s", uid, pid, permission));
90068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    }
91068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey}
92068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey
93068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkeybinder::Status checkUid(uid_t expectedUid) {
94068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    uid_t uid = IPCThreadState::self()->getCallingUid();
95068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    if (uid == expectedUid || uid == AID_ROOT) {
96068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey        return ok();
97068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    } else {
98068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey        return exception(binder::Status::EX_SECURITY,
99068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey                StringPrintf("UID %d is not expected UID %d", uid, expectedUid));
100068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    }
101068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey}
102068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey
103ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkeybinder::Status checkArgumentId(const std::string& id) {
104ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    if (id.empty()) {
105ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey        return exception(binder::Status::EX_ILLEGAL_ARGUMENT, "Missing ID");
106ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    }
107ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    for (const char& c : id) {
108ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey        if (!std::isalnum(c) && c != ':' && c != ',') {
109ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey            return exception(binder::Status::EX_ILLEGAL_ARGUMENT,
110ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey                    StringPrintf("ID %s is malformed", id.c_str()));
111ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey        }
112ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    }
113ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    return ok();
114ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey}
115ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey
116ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkeybinder::Status checkArgumentPath(const std::string& path) {
117ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    if (path.empty()) {
118ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey        return exception(binder::Status::EX_ILLEGAL_ARGUMENT, "Missing path");
119ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    }
120ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    if (path[0] != '/') {
121ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey        return exception(binder::Status::EX_ILLEGAL_ARGUMENT,
122ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey                StringPrintf("Path %s is relative", path.c_str()));
123ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    }
12401a0e7fa189b37b82be971bc50ecce5883523293Jeff Sharkey    if ((path + '/').find("/../") != std::string::npos) {
12501a0e7fa189b37b82be971bc50ecce5883523293Jeff Sharkey        return exception(binder::Status::EX_ILLEGAL_ARGUMENT,
12601a0e7fa189b37b82be971bc50ecce5883523293Jeff Sharkey                StringPrintf("Path %s is shady", path.c_str()));
12701a0e7fa189b37b82be971bc50ecce5883523293Jeff Sharkey    }
128ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    for (const char& c : path) {
129ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey        if (c == '\0' || c == '\n') {
130ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey            return exception(binder::Status::EX_ILLEGAL_ARGUMENT,
131ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey                    StringPrintf("Path %s is malformed", path.c_str()));
132ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey        }
133ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    }
134ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    return ok();
135ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey}
136ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey
137ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkeybinder::Status checkArgumentHex(const std::string& hex) {
138ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    // Empty hex strings are allowed
139ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    for (const char& c : hex) {
140ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey        if (!std::isxdigit(c) && c != ':' && c != '-') {
141ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey            return exception(binder::Status::EX_ILLEGAL_ARGUMENT,
142ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey                    StringPrintf("Hex %s is malformed", hex.c_str()));
143ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey        }
144ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    }
145ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    return ok();
146ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey}
147ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey
148068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey#define ENFORCE_UID(uid) {                                  \
149068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    binder::Status status = checkUid((uid));                \
150068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    if (!status.isOk()) {                                   \
151068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey        return status;                                      \
152068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    }                                                       \
153068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey}
154068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey
155ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey#define CHECK_ARGUMENT_ID(id) {                             \
156ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    binder::Status status = checkArgumentId((id));          \
157ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    if (!status.isOk()) {                                   \
158ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey        return status;                                      \
159ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    }                                                       \
160ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey}
161ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey
162ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey#define CHECK_ARGUMENT_PATH(path) {                         \
163ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    binder::Status status = checkArgumentPath((path));      \
164ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    if (!status.isOk()) {                                   \
165ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey        return status;                                      \
166ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    }                                                       \
167ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey}
168ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey
169ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey#define CHECK_ARGUMENT_HEX(hex) {                           \
170ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    binder::Status status = checkArgumentHex((hex));        \
171ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    if (!status.isOk()) {                                   \
172ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey        return status;                                      \
173ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    }                                                       \
174ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey}
175ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey
17683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey#define ACQUIRE_LOCK \
17767b8c4953051cb14d0333856a057e5acba273d0eJeff Sharkey    std::lock_guard<std::mutex> lock(VolumeManager::Instance()->getLock()); \
17867b8c4953051cb14d0333856a057e5acba273d0eJeff Sharkey    ATRACE_CALL();
17983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
18083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey#define ACQUIRE_CRYPT_LOCK \
18167b8c4953051cb14d0333856a057e5acba273d0eJeff Sharkey    std::lock_guard<std::mutex> lock(VolumeManager::Instance()->getCryptLock()); \
18267b8c4953051cb14d0333856a057e5acba273d0eJeff Sharkey    ATRACE_CALL();
1839462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
184068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey}  // namespace
185068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey
186068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkeystatus_t VoldNativeService::start() {
187068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    IPCThreadState::self()->disableBackgroundScheduling(true);
188068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    status_t ret = BinderService<VoldNativeService>::publish();
189068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    if (ret != android::OK) {
190068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey        return ret;
191068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    }
192068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    sp<ProcessState> ps(ProcessState::self());
193068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    ps->startThreadPool();
194068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    ps->giveThreadPoolName();
195068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    return android::OK;
196068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey}
197068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey
198068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkeystatus_t VoldNativeService::dump(int fd, const Vector<String16> & /* args */) {
199068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    auto out = std::fstream(StringPrintf("/proc/self/fd/%d", fd));
200068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    const binder::Status dump_permission = checkPermission(kDump);
201068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    if (!dump_permission.isOk()) {
202068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey        out << dump_permission.toString8() << endl;
203068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey        return PERMISSION_DENIED;
204068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    }
205068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey
2069462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ACQUIRE_LOCK;
207068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    out << "vold is happy!" << endl;
208068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    out.flush();
209068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    return NO_ERROR;
210068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey}
211068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey
212814e9d308e89b721e70025d3469b021b4ff10042Jeff Sharkeybinder::Status VoldNativeService::setListener(
213814e9d308e89b721e70025d3469b021b4ff10042Jeff Sharkey        const android::sp<android::os::IVoldListener>& listener) {
214814e9d308e89b721e70025d3469b021b4ff10042Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
215814e9d308e89b721e70025d3469b021b4ff10042Jeff Sharkey    ACQUIRE_LOCK;
216814e9d308e89b721e70025d3469b021b4ff10042Jeff Sharkey
217814e9d308e89b721e70025d3469b021b4ff10042Jeff Sharkey    VolumeManager::Instance()->setListener(listener);
218814e9d308e89b721e70025d3469b021b4ff10042Jeff Sharkey    return ok();
219814e9d308e89b721e70025d3469b021b4ff10042Jeff Sharkey}
220814e9d308e89b721e70025d3469b021b4ff10042Jeff Sharkey
221cbe69fc060d021be972af44904dd76ed1aa2a5a2Jeff Sharkeybinder::Status VoldNativeService::monitor() {
222cbe69fc060d021be972af44904dd76ed1aa2a5a2Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
223cbe69fc060d021be972af44904dd76ed1aa2a5a2Jeff Sharkey
224cbe69fc060d021be972af44904dd76ed1aa2a5a2Jeff Sharkey    // Simply acquire/release each lock for watchdog
225cbe69fc060d021be972af44904dd76ed1aa2a5a2Jeff Sharkey    {
226cbe69fc060d021be972af44904dd76ed1aa2a5a2Jeff Sharkey        ACQUIRE_LOCK;
227cbe69fc060d021be972af44904dd76ed1aa2a5a2Jeff Sharkey    }
228cbe69fc060d021be972af44904dd76ed1aa2a5a2Jeff Sharkey    {
229cbe69fc060d021be972af44904dd76ed1aa2a5a2Jeff Sharkey        ACQUIRE_CRYPT_LOCK;
230cbe69fc060d021be972af44904dd76ed1aa2a5a2Jeff Sharkey    }
231cbe69fc060d021be972af44904dd76ed1aa2a5a2Jeff Sharkey
232cbe69fc060d021be972af44904dd76ed1aa2a5a2Jeff Sharkey    return ok();
233cbe69fc060d021be972af44904dd76ed1aa2a5a2Jeff Sharkey}
234cbe69fc060d021be972af44904dd76ed1aa2a5a2Jeff Sharkey
235068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkeybinder::Status VoldNativeService::reset() {
236068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    ENFORCE_UID(AID_SYSTEM);
2379462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ACQUIRE_LOCK;
2389462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
2399462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    return translate(VolumeManager::Instance()->reset());
2409462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey}
2419462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
2429462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkeybinder::Status VoldNativeService::shutdown() {
2439462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
2449462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ACQUIRE_LOCK;
2459462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
2469462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    return translate(VolumeManager::Instance()->shutdown());
2479462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey}
2489462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
24911c2d380a786d9e304416be98881b90b74ff666dJeff Sharkeybinder::Status VoldNativeService::mountAll() {
2509462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
2519462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ACQUIRE_LOCK;
2529462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
25311c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey    struct fstab* fstab = fs_mgr_read_fstab_default();
25411c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey    int res = fs_mgr_mount_all(fstab, MOUNT_MODE_DEFAULT);
25511c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey    fs_mgr_free_fstab(fstab);
25611c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey    return translate(res);
2579462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey}
2589462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
2599462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkeybinder::Status VoldNativeService::onUserAdded(int32_t userId, int32_t userSerial) {
2609462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
2619462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ACQUIRE_LOCK;
2629462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
2639462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    return translate(VolumeManager::Instance()->onUserAdded(userId, userSerial));
2649462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey}
2659462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
2669462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkeybinder::Status VoldNativeService::onUserRemoved(int32_t userId) {
2679462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
2689462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ACQUIRE_LOCK;
2699462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
2709462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    return translate(VolumeManager::Instance()->onUserRemoved(userId));
2719462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey}
2729462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
2739462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkeybinder::Status VoldNativeService::onUserStarted(int32_t userId) {
2749462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
2759462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ACQUIRE_LOCK;
2769462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
2779462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    return translate(VolumeManager::Instance()->onUserStarted(userId));
2789462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey}
2799462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
2809462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkeybinder::Status VoldNativeService::onUserStopped(int32_t userId) {
2819462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
2829462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ACQUIRE_LOCK;
2839462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
2849462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    return translate(VolumeManager::Instance()->onUserStopped(userId));
2859462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey}
2869462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
28711c2d380a786d9e304416be98881b90b74ff666dJeff Sharkeybinder::Status VoldNativeService::partition(const std::string& diskId, int32_t partitionType,
28811c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey        int32_t ratio) {
2899462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
290ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    CHECK_ARGUMENT_ID(diskId);
2919462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ACQUIRE_LOCK;
2929462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
2939462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    auto disk = VolumeManager::Instance()->findDisk(diskId);
2949462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    if (disk == nullptr) {
2959462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey        return error("Failed to find disk " + diskId);
2969462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    }
2979462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    switch (partitionType) {
2989462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    case PARTITION_TYPE_PUBLIC: return translate(disk->partitionPublic());
2999462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    case PARTITION_TYPE_PRIVATE: return translate(disk->partitionPrivate());
3009462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    case PARTITION_TYPE_MIXED: return translate(disk->partitionMixed(ratio));
3019462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    default: return error("Unknown type " + std::to_string(partitionType));
3029462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    }
3039462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey}
304068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey
3059462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkeybinder::Status VoldNativeService::forgetPartition(const std::string& partGuid) {
3069462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
307ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    CHECK_ARGUMENT_HEX(partGuid);
3089462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ACQUIRE_LOCK;
3099462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
3109462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    return translate(VolumeManager::Instance()->forgetPartition(partGuid));
3119462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey}
3129462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
31311c2d380a786d9e304416be98881b90b74ff666dJeff Sharkeybinder::Status VoldNativeService::mount(const std::string& volId, int32_t mountFlags,
31411c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey        int32_t mountUserId) {
3159462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
316ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    CHECK_ARGUMENT_ID(volId);
3179462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ACQUIRE_LOCK;
3189462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
3199462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    auto vol = VolumeManager::Instance()->findVolume(volId);
3209462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    if (vol == nullptr) {
3219462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey        return error("Failed to find volume " + volId);
3229462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    }
3239462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
3249462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    vol->setMountFlags(mountFlags);
3259462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    vol->setMountUserId(mountUserId);
3269462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
3279462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    int res = vol->mount();
32883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    if ((mountFlags & MOUNT_FLAG_PRIMARY) != 0) {
3299462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey        VolumeManager::Instance()->setPrimary(vol);
3309462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    }
3319462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    return translate(res);
3329462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey}
3339462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
3349462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkeybinder::Status VoldNativeService::unmount(const std::string& volId) {
3359462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
336ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    CHECK_ARGUMENT_ID(volId);
3379462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ACQUIRE_LOCK;
3389462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
3399462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    auto vol = VolumeManager::Instance()->findVolume(volId);
3409462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    if (vol == nullptr) {
3419462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey        return error("Failed to find volume " + volId);
3429462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    }
3439462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    return translate(vol->unmount());
3449462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey}
3459462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
3469462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkeybinder::Status VoldNativeService::format(const std::string& volId, const std::string& fsType) {
3479462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
348ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    CHECK_ARGUMENT_ID(volId);
3499462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ACQUIRE_LOCK;
3509462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
3519462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    auto vol = VolumeManager::Instance()->findVolume(volId);
3529462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    if (vol == nullptr) {
3539462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey        return error("Failed to find volume " + volId);
3549462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    }
3559462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    return translate(vol->format(fsType));
3569462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey}
3579462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
35852f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkeybinder::Status VoldNativeService::benchmark(const std::string& volId,
35952f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkey        const android::sp<android::os::IVoldTaskListener>& listener) {
3609462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
361ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    CHECK_ARGUMENT_ID(volId);
3629462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ACQUIRE_LOCK;
3639462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
36452f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkey    std::string path;
36552f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkey    if (volId == "private" || volId == "null") {
36652f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkey        path = "/data";
36752f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkey    } else {
36852f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkey        auto vol = VolumeManager::Instance()->findVolume(volId);
36952f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkey        if (vol == nullptr) {
37052f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkey            return error("Failed to find volume " + volId);
37152f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkey        }
37252f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkey        if (vol->getType() != VolumeBase::Type::kPrivate) {
37352f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkey            return error("Volume " + volId + " not private");
37452f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkey        }
37552f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkey        if (vol->getState() != VolumeBase::State::kMounted) {
37652f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkey            return error("Volume " + volId + " not mounted");
37752f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkey        }
37852f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkey        path = vol->getPath();
37952f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkey    }
38052f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkey
38152f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkey    if (path.empty()) {
38252f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkey        return error("Volume " + volId + " missing path");
38352f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkey    }
38452f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkey
38501a0e7fa189b37b82be971bc50ecce5883523293Jeff Sharkey    std::thread([=]() {
38601a0e7fa189b37b82be971bc50ecce5883523293Jeff Sharkey        android::vold::Benchmark(path, listener);
38701a0e7fa189b37b82be971bc50ecce5883523293Jeff Sharkey    }).detach();
3889462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    return ok();
3899462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey}
3909462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
39111c2d380a786d9e304416be98881b90b74ff666dJeff Sharkeybinder::Status VoldNativeService::moveStorage(const std::string& fromVolId,
39252f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkey        const std::string& toVolId, const android::sp<android::os::IVoldTaskListener>& listener) {
3939462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
394ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    CHECK_ARGUMENT_ID(fromVolId);
395ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    CHECK_ARGUMENT_ID(toVolId);
3969462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ACQUIRE_LOCK;
3979462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
3989462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    auto fromVol = VolumeManager::Instance()->findVolume(fromVolId);
3999462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    auto toVol = VolumeManager::Instance()->findVolume(toVolId);
4009462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    if (fromVol == nullptr) {
4019462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey        return error("Failed to find volume " + fromVolId);
4029462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    } else if (toVol == nullptr) {
4039462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey        return error("Failed to find volume " + toVolId);
4049462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    }
40501a0e7fa189b37b82be971bc50ecce5883523293Jeff Sharkey
40601a0e7fa189b37b82be971bc50ecce5883523293Jeff Sharkey    std::thread([=]() {
40701a0e7fa189b37b82be971bc50ecce5883523293Jeff Sharkey        android::vold::MoveStorage(fromVol, toVol, listener);
40801a0e7fa189b37b82be971bc50ecce5883523293Jeff Sharkey    }).detach();
409068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey    return ok();
410068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey}
411068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey
4129462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkeybinder::Status VoldNativeService::remountUid(int32_t uid, int32_t remountMode) {
4139462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
4149462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ACQUIRE_LOCK;
4159462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
4169462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    std::string tmp;
4179462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    switch (remountMode) {
4189462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    case REMOUNT_MODE_NONE: tmp = "none"; break;
4199462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    case REMOUNT_MODE_DEFAULT: tmp = "default"; break;
4209462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    case REMOUNT_MODE_READ: tmp = "read"; break;
4219462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    case REMOUNT_MODE_WRITE: tmp = "write"; break;
4229462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    default: return error("Unknown mode " + std::to_string(remountMode));
4239462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    }
4249462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    return translate(VolumeManager::Instance()->remountUid(uid, tmp));
4259462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey}
4269462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
4279462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkeybinder::Status VoldNativeService::mkdirs(const std::string& path) {
4289462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
429ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    CHECK_ARGUMENT_PATH(path);
4309462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey    ACQUIRE_LOCK;
4319462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
4323472e52fc259b6a549acece21d4901d99d6a421fJeff Sharkey    return translate(VolumeManager::Instance()->mkdirs(path));
4339462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey}
4349462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey
43511c2d380a786d9e304416be98881b90b74ff666dJeff Sharkeybinder::Status VoldNativeService::createObb(const std::string& sourcePath,
43611c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey        const std::string& sourceKey, int32_t ownerGid, std::string* _aidl_return) {
43711c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey    ENFORCE_UID(AID_SYSTEM);
438ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    CHECK_ARGUMENT_PATH(sourcePath);
439ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    CHECK_ARGUMENT_HEX(sourceKey);
44011c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey    ACQUIRE_LOCK;
44111c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey
44211c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey    return translate(
44311c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey            VolumeManager::Instance()->createObb(sourcePath, sourceKey, ownerGid, _aidl_return));
44411c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey}
44511c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey
44611c2d380a786d9e304416be98881b90b74ff666dJeff Sharkeybinder::Status VoldNativeService::destroyObb(const std::string& volId) {
44711c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey    ENFORCE_UID(AID_SYSTEM);
448ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey    CHECK_ARGUMENT_ID(volId);
44911c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey    ACQUIRE_LOCK;
45011c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey
45111c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey    return translate(VolumeManager::Instance()->destroyObb(volId));
45211c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey}
45311c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey
45452f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkeybinder::Status VoldNativeService::fstrim(int32_t fstrimFlags,
45552f7a9193479a48c3377fa597191d4dac71f4416Jeff Sharkey        const android::sp<android::os::IVoldTaskListener>& listener) {
45611c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey    ENFORCE_UID(AID_SYSTEM);
45711c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey    ACQUIRE_LOCK;
45811c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey
45901a0e7fa189b37b82be971bc50ecce5883523293Jeff Sharkey    std::thread([=]() {
46001a0e7fa189b37b82be971bc50ecce5883523293Jeff Sharkey        android::vold::Trim(listener);
46101a0e7fa189b37b82be971bc50ecce5883523293Jeff Sharkey    }).detach();
46211c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey    return ok();
46311c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey}
46411c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey
46511c2d380a786d9e304416be98881b90b74ff666dJeff Sharkeybinder::Status VoldNativeService::mountAppFuse(int32_t uid, int32_t pid, int32_t mountId,
46611c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey        android::base::unique_fd* _aidl_return) {
46711c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey    ENFORCE_UID(AID_SYSTEM);
46811c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey    ACQUIRE_LOCK;
46911c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey
47011c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey    return translate(VolumeManager::Instance()->mountAppFuse(uid, pid, mountId, _aidl_return));
47111c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey}
47211c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey
47311c2d380a786d9e304416be98881b90b74ff666dJeff Sharkeybinder::Status VoldNativeService::unmountAppFuse(int32_t uid, int32_t pid, int32_t mountId) {
47411c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey    ENFORCE_UID(AID_SYSTEM);
47511c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey    ACQUIRE_LOCK;
47611c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey
47711c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey    return translate(VolumeManager::Instance()->unmountAppFuse(uid, pid, mountId));
47811c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey}
47911c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey
48083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::fdeCheckPassword(const std::string& password) {
48183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
48283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
48383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
48483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return translate(cryptfs_check_passwd(password.c_str()));
48583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
48683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
48783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::fdeRestart() {
48883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
48983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
49083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
49183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    // Spawn as thread so init can issue commands back to vold without
49283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    // causing deadlock, usually as a result of prep_data_fs.
49383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    std::thread(&cryptfs_restart).detach();
49483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return ok();
49583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
49683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
49783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::fdeComplete(int32_t* _aidl_return) {
49883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
49983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
50083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
50183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    *_aidl_return = cryptfs_crypto_complete();
50283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return ok();
50383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
50483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
50583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeystatic int fdeEnableInternal(int32_t passwordType, const std::string& password,
50683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        int32_t encryptionFlags) {
50783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    bool noUi = (encryptionFlags & VoldNativeService::ENCRYPTION_FLAG_NO_UI) != 0;
50883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
50983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    std::string how;
51083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    if ((encryptionFlags & VoldNativeService::ENCRYPTION_FLAG_IN_PLACE) != 0) {
51183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        how = "inplace";
51283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    } else if ((encryptionFlags & VoldNativeService::ENCRYPTION_FLAG_WIPE) != 0) {
51383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        how = "wipe";
51483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    } else {
51583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        LOG(ERROR) << "Missing encryption flag";
51683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        return -1;
51783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    }
51883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
51983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    for (int tries = 0; tries < 2; ++tries) {
52083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        int rc;
52183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        if (passwordType == VoldNativeService::PASSWORD_TYPE_DEFAULT) {
52283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey            rc = cryptfs_enable_default(how.c_str(), noUi);
52383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        } else {
52483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey            rc = cryptfs_enable(how.c_str(), passwordType, password.c_str(), noUi);
52583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        }
52683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
52783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        if (rc == 0) {
52883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey            return 0;
52983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        } else if (tries == 0) {
5303472e52fc259b6a549acece21d4901d99d6a421fJeff Sharkey            KillProcessesWithOpenFiles(DATA_MNT_POINT, SIGKILL);
53183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        }
53283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    }
53383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
53483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return -1;
53583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
53683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
53783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::fdeEnable(int32_t passwordType,
53883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        const std::string& password, int32_t encryptionFlags) {
53983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
54083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
54183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
54283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    if (e4crypt_is_native()) {
54383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        if (passwordType != PASSWORD_TYPE_DEFAULT) {
54483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey            return error("Unexpected password type");
54583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        }
54683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        if (encryptionFlags != (ENCRYPTION_FLAG_IN_PLACE | ENCRYPTION_FLAG_NO_UI)) {
54783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey            return error("Unexpected flags");
54883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        }
54983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        return translateBool(e4crypt_enable_crypto());
55083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    }
55183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
55283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    // Spawn as thread so init can issue commands back to vold without
55383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    // causing deadlock, usually as a result of prep_data_fs.
55483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    std::thread(&fdeEnableInternal, passwordType, password, encryptionFlags).detach();
55583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return ok();
55683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
55783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
55883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::fdeChangePassword(int32_t passwordType,
55983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        const std::string& password) {
56083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
56183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
56283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
56383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return translate(cryptfs_changepw(passwordType, password.c_str()));
56483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
56583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
56683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::fdeVerifyPassword(const std::string& password) {
56783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
56883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
56983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
57083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return translate(cryptfs_verify_passwd(password.c_str()));
57183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
57283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
57383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::fdeGetField(const std::string& key,
57483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        std::string* _aidl_return) {
57583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
57683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
57783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
57883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    char buf[PROPERTY_VALUE_MAX];
57983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    if (cryptfs_getfield(key.c_str(), buf, sizeof(buf)) != CRYPTO_GETFIELD_OK) {
58083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        return error(StringPrintf("Failed to read field %s", key.c_str()));
58183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    } else {
58283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        *_aidl_return = buf;
58383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        return ok();
58483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    }
58583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
58683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
58783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::fdeSetField(const std::string& key,
58883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        const std::string& value) {
58983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
59083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
59183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
59283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return translate(cryptfs_setfield(key.c_str(), value.c_str()));
59383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
59483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
59583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::fdeGetPasswordType(int32_t* _aidl_return) {
59683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
59783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
59883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
59983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    *_aidl_return = cryptfs_get_password_type();
60083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return ok();
60183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
60283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
60383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::fdeGetPassword(std::string* _aidl_return) {
60483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
60583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
60683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
60783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    const char* res = cryptfs_get_password();
60883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    if (res != nullptr) {
60983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        *_aidl_return = res;
61083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    }
61183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return ok();
61283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
61383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
61483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::fdeClearPassword() {
61583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
61683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
61783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
61883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    cryptfs_clear_password();
61983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return ok();
62083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
62183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
62283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::fbeEnable() {
62383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
62483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
62583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
62683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return translateBool(e4crypt_initialize_global_de());
62783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
62883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
62983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::mountDefaultEncrypted() {
63083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
63183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
63283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
63383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    if (e4crypt_is_native()) {
63483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        return translateBool(e4crypt_mount_metadata_encrypted());
63583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    } else {
63683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        // Spawn as thread so init can issue commands back to vold without
63783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        // causing deadlock, usually as a result of prep_data_fs.
63883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        std::thread(&cryptfs_mount_default_encrypted).detach();
63983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        return ok();
64083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    }
64183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
64283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
64383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::initUser0() {
64483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
64583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
64683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
64783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return translateBool(e4crypt_init_user0());
64883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
64983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
65083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::isConvertibleToFbe(bool* _aidl_return) {
65183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
65283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
65383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
65483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    *_aidl_return = cryptfs_isConvertibleToFBE() != 0;
65583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return ok();
65683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
65783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
65883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::createUserKey(int32_t userId, int32_t userSerial,
65983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        bool ephemeral) {
66083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
66183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
66283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
66383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return translateBool(e4crypt_vold_create_user_key(userId, userSerial, ephemeral));
66483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
66583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
66683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::destroyUserKey(int32_t userId) {
66783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
66883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
66983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
67083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return translateBool(e4crypt_destroy_user_key(userId));
67183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
67283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
67383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::addUserKeyAuth(int32_t userId, int32_t userSerial,
67483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        const std::string& token, const std::string& secret) {
67583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
67683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
67783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
6783b71fc51005ac566fd8120f01b784d5f251ad886Paul Crowley    return translateBool(e4crypt_add_user_key_auth(userId, userSerial, token, secret));
67983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
68083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
68183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::fixateNewestUserKeyAuth(int32_t userId) {
68283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
68383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
68483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
68583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return translateBool(e4crypt_fixate_newest_user_key_auth(userId));
68683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
68783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
68883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::unlockUserKey(int32_t userId, int32_t userSerial,
68983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        const std::string& token, const std::string& secret) {
69083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
69183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
69283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
6933b71fc51005ac566fd8120f01b784d5f251ad886Paul Crowley    return translateBool(e4crypt_unlock_user_key(userId, userSerial, token, secret));
69483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
69583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
69683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::lockUserKey(int32_t userId) {
69783b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
69883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
69983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
70083b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return translateBool(e4crypt_lock_user_key(userId));
70183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
70283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
70383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::prepareUserStorage(const std::unique_ptr<std::string>& uuid,
70483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        int32_t userId, int32_t userSerial, int32_t flags) {
70583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
7063b71fc51005ac566fd8120f01b784d5f251ad886Paul Crowley    std::string empty_string = "";
7073b71fc51005ac566fd8120f01b784d5f251ad886Paul Crowley    auto uuid_ = uuid ? *uuid : empty_string;
70806f762d577d8b3e5424c002c7f6d838e9f0e5dedPaul Crowley    CHECK_ARGUMENT_HEX(uuid_);
70906f762d577d8b3e5424c002c7f6d838e9f0e5dedPaul Crowley
71006f762d577d8b3e5424c002c7f6d838e9f0e5dedPaul Crowley    ACQUIRE_CRYPT_LOCK;
71183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return translateBool(e4crypt_prepare_user_storage(uuid_, userId, userSerial, flags));
71283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
71383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
71483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::destroyUserStorage(const std::unique_ptr<std::string>& uuid,
71583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey        int32_t userId, int32_t flags) {
71683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
7173b71fc51005ac566fd8120f01b784d5f251ad886Paul Crowley    std::string empty_string = "";
7183b71fc51005ac566fd8120f01b784d5f251ad886Paul Crowley    auto uuid_ = uuid ? *uuid : empty_string;
71906f762d577d8b3e5424c002c7f6d838e9f0e5dedPaul Crowley    CHECK_ARGUMENT_HEX(uuid_);
72006f762d577d8b3e5424c002c7f6d838e9f0e5dedPaul Crowley
72106f762d577d8b3e5424c002c7f6d838e9f0e5dedPaul Crowley    ACQUIRE_CRYPT_LOCK;
72283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    return translateBool(e4crypt_destroy_user_storage(uuid_, userId, flags));
72383b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
72483b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
72583b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkeybinder::Status VoldNativeService::secdiscard(const std::string& path) {
72683b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ENFORCE_UID(AID_SYSTEM);
72701a0e7fa189b37b82be971bc50ecce5883523293Jeff Sharkey    CHECK_ARGUMENT_PATH(path);
72883b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey    ACQUIRE_CRYPT_LOCK;
72983b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
7303b71fc51005ac566fd8120f01b784d5f251ad886Paul Crowley    return translateBool(e4crypt_secdiscard(path));
73183b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey}
73283b559ced41c1be0d7a65ba99e179efd79d8d257Jeff Sharkey
733068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey}  // namespace vold
734068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey}  // namespace android
735