VoldNativeService.cpp revision ec4fda24593e758029504e1be4bba4cbc6668160
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 17068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey#include "VoldNativeService.h" 18068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey#include "VolumeManager.h" 199462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey#include "MoveTask.h" 2011c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey#include "TrimTask.h" 21068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey 22068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey#include <fstream> 23068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey 24068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey#include <android-base/logging.h> 25068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey#include <android-base/stringprintf.h> 26068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey#include <android-base/strings.h> 2711c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey#include <fs_mgr.h> 28068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey#include <private/android_filesystem_config.h> 29068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey 30068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey#ifndef LOG_TAG 31068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey#define LOG_TAG "vold" 32068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey#endif 33068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey 34068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkeyusing android::base::StringPrintf; 35068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkeyusing std::endl; 36068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey 37068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkeynamespace android { 38068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkeynamespace vold { 39068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey 40068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkeynamespace { 41068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey 42068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkeyconstexpr const char* kDump = "android.permission.DUMP"; 43068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey 44068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkeystatic binder::Status ok() { 45068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey return binder::Status::ok(); 46068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey} 47068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey 48068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkeystatic binder::Status exception(uint32_t code, const std::string& msg) { 49068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey return binder::Status::fromExceptionCode(code, String8(msg.c_str())); 50068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey} 51068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey 529462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkeystatic binder::Status error(const std::string& msg) { 539462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey PLOG(ERROR) << msg; 549462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey return binder::Status::fromServiceSpecificError(errno, String8(msg.c_str())); 559462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey} 569462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey 579462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkeystatic binder::Status translate(uint32_t status) { 589462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey if (status == 0) { 599462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey return binder::Status::ok(); 609462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey } else { 6111c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey return binder::Status::fromServiceSpecificError(status); 629462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey } 639462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey} 649462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey 65068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkeybinder::Status checkPermission(const char* permission) { 66068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey pid_t pid; 67068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey uid_t uid; 68068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey 69068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey if (checkCallingPermission(String16(permission), reinterpret_cast<int32_t*>(&pid), 70068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey reinterpret_cast<int32_t*>(&uid))) { 71068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey return ok(); 72068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey } else { 73068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey return exception(binder::Status::EX_SECURITY, 74068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey StringPrintf("UID %d / PID %d lacks permission %s", uid, pid, permission)); 75068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey } 76068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey} 77068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey 78068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkeybinder::Status checkUid(uid_t expectedUid) { 79068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey uid_t uid = IPCThreadState::self()->getCallingUid(); 80068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey if (uid == expectedUid || uid == AID_ROOT) { 81068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey return ok(); 82068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey } else { 83068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey return exception(binder::Status::EX_SECURITY, 84068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey StringPrintf("UID %d is not expected UID %d", uid, expectedUid)); 85068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey } 86068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey} 87068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey 88ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkeybinder::Status checkArgumentId(const std::string& id) { 89ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey if (id.empty()) { 90ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey return exception(binder::Status::EX_ILLEGAL_ARGUMENT, "Missing ID"); 91ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey } 92ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey for (const char& c : id) { 93ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey if (!std::isalnum(c) && c != ':' && c != ',') { 94ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey return exception(binder::Status::EX_ILLEGAL_ARGUMENT, 95ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey StringPrintf("ID %s is malformed", id.c_str())); 96ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey } 97ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey } 98ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey return ok(); 99ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey} 100ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey 101ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkeybinder::Status checkArgumentPath(const std::string& path) { 102ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey if (path.empty()) { 103ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey return exception(binder::Status::EX_ILLEGAL_ARGUMENT, "Missing path"); 104ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey } 105ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey if (path[0] != '/') { 106ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey return exception(binder::Status::EX_ILLEGAL_ARGUMENT, 107ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey StringPrintf("Path %s is relative", path.c_str())); 108ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey } 109ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey for (const char& c : path) { 110ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey if (c == '\0' || c == '\n') { 111ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey return exception(binder::Status::EX_ILLEGAL_ARGUMENT, 112ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey StringPrintf("Path %s is malformed", path.c_str())); 113ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey } 114ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey } 115ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey return ok(); 116ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey} 117ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey 118ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkeybinder::Status checkArgumentHex(const std::string& hex) { 119ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey // Empty hex strings are allowed 120ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey for (const char& c : hex) { 121ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey if (!std::isxdigit(c) && c != ':' && c != '-') { 122ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey return exception(binder::Status::EX_ILLEGAL_ARGUMENT, 123ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey StringPrintf("Hex %s is malformed", hex.c_str())); 124ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey } 125ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey } 126ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey return ok(); 127ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey} 128ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey 129068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey#define ENFORCE_UID(uid) { \ 130068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey binder::Status status = checkUid((uid)); \ 131068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey if (!status.isOk()) { \ 132068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey return status; \ 133068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey } \ 134068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey} 135068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey 136ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey#define CHECK_ARGUMENT_ID(id) { \ 137ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey binder::Status status = checkArgumentId((id)); \ 138ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey if (!status.isOk()) { \ 139ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey return status; \ 140ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey } \ 141ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey} 142ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey 143ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey#define CHECK_ARGUMENT_PATH(path) { \ 144ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey binder::Status status = checkArgumentPath((path)); \ 145ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey if (!status.isOk()) { \ 146ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey return status; \ 147ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey } \ 148ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey} 149ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey 150ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey#define CHECK_ARGUMENT_HEX(hex) { \ 151ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey binder::Status status = checkArgumentHex((hex)); \ 152ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey if (!status.isOk()) { \ 153ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey return status; \ 154ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey } \ 155ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey} 156ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey 1579462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey#define ACQUIRE_LOCK std::lock_guard<std::mutex> lock(VolumeManager::Instance()->getLock()); 1589462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey 159068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey} // namespace 160068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey 161068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkeystatus_t VoldNativeService::start() { 162068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey IPCThreadState::self()->disableBackgroundScheduling(true); 163068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey status_t ret = BinderService<VoldNativeService>::publish(); 164068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey if (ret != android::OK) { 165068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey return ret; 166068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey } 167068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey sp<ProcessState> ps(ProcessState::self()); 168068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey ps->startThreadPool(); 169068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey ps->giveThreadPoolName(); 170068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey return android::OK; 171068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey} 172068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey 173068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkeystatus_t VoldNativeService::dump(int fd, const Vector<String16> & /* args */) { 174068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey auto out = std::fstream(StringPrintf("/proc/self/fd/%d", fd)); 175068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey const binder::Status dump_permission = checkPermission(kDump); 176068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey if (!dump_permission.isOk()) { 177068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey out << dump_permission.toString8() << endl; 178068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey return PERMISSION_DENIED; 179068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey } 180068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey 1819462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey ACQUIRE_LOCK; 182068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey out << "vold is happy!" << endl; 183068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey out.flush(); 184068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey return NO_ERROR; 185068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey} 186068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey 187068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkeybinder::Status VoldNativeService::reset() { 188068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey ENFORCE_UID(AID_SYSTEM); 1899462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey ACQUIRE_LOCK; 1909462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey 1919462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey return translate(VolumeManager::Instance()->reset()); 1929462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey} 1939462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey 1949462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkeybinder::Status VoldNativeService::shutdown() { 1959462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey ENFORCE_UID(AID_SYSTEM); 1969462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey ACQUIRE_LOCK; 1979462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey 1989462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey return translate(VolumeManager::Instance()->shutdown()); 1999462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey} 2009462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey 20111c2d380a786d9e304416be98881b90b74ff666dJeff Sharkeybinder::Status VoldNativeService::mountAll() { 2029462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey ENFORCE_UID(AID_SYSTEM); 2039462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey ACQUIRE_LOCK; 2049462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey 20511c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey struct fstab* fstab = fs_mgr_read_fstab_default(); 20611c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey int res = fs_mgr_mount_all(fstab, MOUNT_MODE_DEFAULT); 20711c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey fs_mgr_free_fstab(fstab); 20811c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey return translate(res); 2099462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey} 2109462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey 2119462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkeybinder::Status VoldNativeService::onUserAdded(int32_t userId, int32_t userSerial) { 2129462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey ENFORCE_UID(AID_SYSTEM); 2139462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey ACQUIRE_LOCK; 2149462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey 2159462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey return translate(VolumeManager::Instance()->onUserAdded(userId, userSerial)); 2169462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey} 2179462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey 2189462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkeybinder::Status VoldNativeService::onUserRemoved(int32_t userId) { 2199462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey ENFORCE_UID(AID_SYSTEM); 2209462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey ACQUIRE_LOCK; 2219462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey 2229462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey return translate(VolumeManager::Instance()->onUserRemoved(userId)); 2239462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey} 2249462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey 2259462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkeybinder::Status VoldNativeService::onUserStarted(int32_t userId) { 2269462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey ENFORCE_UID(AID_SYSTEM); 2279462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey ACQUIRE_LOCK; 2289462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey 2299462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey return translate(VolumeManager::Instance()->onUserStarted(userId)); 2309462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey} 2319462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey 2329462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkeybinder::Status VoldNativeService::onUserStopped(int32_t userId) { 2339462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey ENFORCE_UID(AID_SYSTEM); 2349462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey ACQUIRE_LOCK; 2359462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey 2369462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey return translate(VolumeManager::Instance()->onUserStopped(userId)); 2379462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey} 2389462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey 23911c2d380a786d9e304416be98881b90b74ff666dJeff Sharkeybinder::Status VoldNativeService::partition(const std::string& diskId, int32_t partitionType, 24011c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey int32_t ratio) { 2419462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey ENFORCE_UID(AID_SYSTEM); 242ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey CHECK_ARGUMENT_ID(diskId); 2439462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey ACQUIRE_LOCK; 2449462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey 2459462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey auto disk = VolumeManager::Instance()->findDisk(diskId); 2469462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey if (disk == nullptr) { 2479462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey return error("Failed to find disk " + diskId); 2489462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey } 2499462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey switch (partitionType) { 2509462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey case PARTITION_TYPE_PUBLIC: return translate(disk->partitionPublic()); 2519462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey case PARTITION_TYPE_PRIVATE: return translate(disk->partitionPrivate()); 2529462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey case PARTITION_TYPE_MIXED: return translate(disk->partitionMixed(ratio)); 2539462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey default: return error("Unknown type " + std::to_string(partitionType)); 2549462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey } 2559462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey} 256068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey 2579462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkeybinder::Status VoldNativeService::forgetPartition(const std::string& partGuid) { 2589462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey ENFORCE_UID(AID_SYSTEM); 259ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey CHECK_ARGUMENT_HEX(partGuid); 2609462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey ACQUIRE_LOCK; 2619462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey 2629462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey return translate(VolumeManager::Instance()->forgetPartition(partGuid)); 2639462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey} 2649462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey 26511c2d380a786d9e304416be98881b90b74ff666dJeff Sharkeybinder::Status VoldNativeService::mount(const std::string& volId, int32_t mountFlags, 26611c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey int32_t mountUserId) { 2679462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey ENFORCE_UID(AID_SYSTEM); 268ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey CHECK_ARGUMENT_ID(volId); 2699462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey ACQUIRE_LOCK; 2709462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey 2719462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey auto vol = VolumeManager::Instance()->findVolume(volId); 2729462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey if (vol == nullptr) { 2739462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey return error("Failed to find volume " + volId); 2749462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey } 2759462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey 2769462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey vol->setMountFlags(mountFlags); 2779462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey vol->setMountUserId(mountUserId); 2789462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey 2799462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey int res = vol->mount(); 2809462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey if (mountFlags & MOUNT_FLAG_PRIMARY) { 2819462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey VolumeManager::Instance()->setPrimary(vol); 2829462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey } 2839462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey return translate(res); 2849462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey} 2859462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey 2869462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkeybinder::Status VoldNativeService::unmount(const std::string& volId) { 2879462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey ENFORCE_UID(AID_SYSTEM); 288ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey CHECK_ARGUMENT_ID(volId); 2899462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey ACQUIRE_LOCK; 2909462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey 2919462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey auto vol = VolumeManager::Instance()->findVolume(volId); 2929462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey if (vol == nullptr) { 2939462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey return error("Failed to find volume " + volId); 2949462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey } 2959462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey return translate(vol->unmount()); 2969462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey} 2979462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey 2989462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkeybinder::Status VoldNativeService::format(const std::string& volId, const std::string& fsType) { 2999462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey ENFORCE_UID(AID_SYSTEM); 300ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey CHECK_ARGUMENT_ID(volId); 3019462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey ACQUIRE_LOCK; 3029462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey 3039462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey auto vol = VolumeManager::Instance()->findVolume(volId); 3049462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey if (vol == nullptr) { 3059462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey return error("Failed to find volume " + volId); 3069462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey } 3079462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey return translate(vol->format(fsType)); 3089462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey} 3099462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey 3109462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkeybinder::Status VoldNativeService::benchmark(const std::string& volId, int64_t* _aidl_return) { 3119462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey ENFORCE_UID(AID_SYSTEM); 312ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey CHECK_ARGUMENT_ID(volId); 3139462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey ACQUIRE_LOCK; 3149462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey 3159462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey *_aidl_return = VolumeManager::Instance()->benchmarkPrivate(volId); 3169462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey return ok(); 3179462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey} 3189462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey 31911c2d380a786d9e304416be98881b90b74ff666dJeff Sharkeybinder::Status VoldNativeService::moveStorage(const std::string& fromVolId, 32011c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey const std::string& toVolId) { 3219462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey ENFORCE_UID(AID_SYSTEM); 322ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey CHECK_ARGUMENT_ID(fromVolId); 323ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey CHECK_ARGUMENT_ID(toVolId); 3249462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey ACQUIRE_LOCK; 3259462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey 3269462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey auto fromVol = VolumeManager::Instance()->findVolume(fromVolId); 3279462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey auto toVol = VolumeManager::Instance()->findVolume(toVolId); 3289462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey if (fromVol == nullptr) { 3299462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey return error("Failed to find volume " + fromVolId); 3309462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey } else if (toVol == nullptr) { 3319462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey return error("Failed to find volume " + toVolId); 3329462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey } 3339462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey (new android::vold::MoveTask(fromVol, toVol))->start(); 334068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey return ok(); 335068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey} 336068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey 3379462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkeybinder::Status VoldNativeService::remountUid(int32_t uid, int32_t remountMode) { 3389462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey ENFORCE_UID(AID_SYSTEM); 3399462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey ACQUIRE_LOCK; 3409462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey 3419462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey std::string tmp; 3429462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey switch (remountMode) { 3439462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey case REMOUNT_MODE_NONE: tmp = "none"; break; 3449462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey case REMOUNT_MODE_DEFAULT: tmp = "default"; break; 3459462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey case REMOUNT_MODE_READ: tmp = "read"; break; 3469462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey case REMOUNT_MODE_WRITE: tmp = "write"; break; 3479462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey default: return error("Unknown mode " + std::to_string(remountMode)); 3489462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey } 3499462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey return translate(VolumeManager::Instance()->remountUid(uid, tmp)); 3509462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey} 3519462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey 3529462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkeybinder::Status VoldNativeService::mkdirs(const std::string& path) { 3539462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey ENFORCE_UID(AID_SYSTEM); 354ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey CHECK_ARGUMENT_PATH(path); 3559462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey ACQUIRE_LOCK; 3569462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey 3579462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey return translate(VolumeManager::Instance()->mkdirs(path.c_str())); 3589462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey} 3599462bdd5125bb5e410292a03aa041895af8f3486Jeff Sharkey 36011c2d380a786d9e304416be98881b90b74ff666dJeff Sharkeybinder::Status VoldNativeService::createObb(const std::string& sourcePath, 36111c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey const std::string& sourceKey, int32_t ownerGid, std::string* _aidl_return) { 36211c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey ENFORCE_UID(AID_SYSTEM); 363ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey CHECK_ARGUMENT_PATH(sourcePath); 364ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey CHECK_ARGUMENT_HEX(sourceKey); 36511c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey ACQUIRE_LOCK; 36611c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey 36711c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey return translate( 36811c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey VolumeManager::Instance()->createObb(sourcePath, sourceKey, ownerGid, _aidl_return)); 36911c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey} 37011c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey 37111c2d380a786d9e304416be98881b90b74ff666dJeff Sharkeybinder::Status VoldNativeService::destroyObb(const std::string& volId) { 37211c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey ENFORCE_UID(AID_SYSTEM); 373ec4fda24593e758029504e1be4bba4cbc6668160Jeff Sharkey CHECK_ARGUMENT_ID(volId); 37411c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey ACQUIRE_LOCK; 37511c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey 37611c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey return translate(VolumeManager::Instance()->destroyObb(volId)); 37711c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey} 37811c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey 37911c2d380a786d9e304416be98881b90b74ff666dJeff Sharkeybinder::Status VoldNativeService::fstrim(int32_t fstrimFlags) { 38011c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey ENFORCE_UID(AID_SYSTEM); 38111c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey ACQUIRE_LOCK; 38211c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey 38311c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey (new android::vold::TrimTask(fstrimFlags))->start(); 38411c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey return ok(); 38511c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey} 38611c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey 38711c2d380a786d9e304416be98881b90b74ff666dJeff Sharkeybinder::Status VoldNativeService::mountAppFuse(int32_t uid, int32_t pid, int32_t mountId, 38811c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey android::base::unique_fd* _aidl_return) { 38911c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey ENFORCE_UID(AID_SYSTEM); 39011c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey ACQUIRE_LOCK; 39111c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey 39211c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey return translate(VolumeManager::Instance()->mountAppFuse(uid, pid, mountId, _aidl_return)); 39311c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey} 39411c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey 39511c2d380a786d9e304416be98881b90b74ff666dJeff Sharkeybinder::Status VoldNativeService::unmountAppFuse(int32_t uid, int32_t pid, int32_t mountId) { 39611c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey ENFORCE_UID(AID_SYSTEM); 39711c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey ACQUIRE_LOCK; 39811c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey 39911c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey return translate(VolumeManager::Instance()->unmountAppFuse(uid, pid, mountId)); 40011c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey} 40111c2d380a786d9e304416be98881b90b74ff666dJeff Sharkey 402068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey} // namespace vold 403068c6be6227949fbf34389b2d4c023c2031b005fJeff Sharkey} // namespace android 404