1*f40fafd4SAndroid Build Coastguard Worker /*
2*f40fafd4SAndroid Build Coastguard Worker * Copyright (C) 2008 The Android Open Source Project
3*f40fafd4SAndroid Build Coastguard Worker *
4*f40fafd4SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*f40fafd4SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*f40fafd4SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*f40fafd4SAndroid Build Coastguard Worker *
8*f40fafd4SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*f40fafd4SAndroid Build Coastguard Worker *
10*f40fafd4SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*f40fafd4SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*f40fafd4SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*f40fafd4SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*f40fafd4SAndroid Build Coastguard Worker * limitations under the License.
15*f40fafd4SAndroid Build Coastguard Worker */
16*f40fafd4SAndroid Build Coastguard Worker
17*f40fafd4SAndroid Build Coastguard Worker #define ATRACE_TAG ATRACE_TAG_PACKAGE_MANAGER
18*f40fafd4SAndroid Build Coastguard Worker
19*f40fafd4SAndroid Build Coastguard Worker #include "FsCrypt.h"
20*f40fafd4SAndroid Build Coastguard Worker #include "MetadataCrypt.h"
21*f40fafd4SAndroid Build Coastguard Worker #include "NetlinkManager.h"
22*f40fafd4SAndroid Build Coastguard Worker #include "VoldNativeService.h"
23*f40fafd4SAndroid Build Coastguard Worker #include "VoldUtil.h"
24*f40fafd4SAndroid Build Coastguard Worker #include "VolumeManager.h"
25*f40fafd4SAndroid Build Coastguard Worker #include "model/Disk.h"
26*f40fafd4SAndroid Build Coastguard Worker #include "sehandle.h"
27*f40fafd4SAndroid Build Coastguard Worker
28*f40fafd4SAndroid Build Coastguard Worker #include <android-base/logging.h>
29*f40fafd4SAndroid Build Coastguard Worker #include <android-base/properties.h>
30*f40fafd4SAndroid Build Coastguard Worker #include <android-base/stringprintf.h>
31*f40fafd4SAndroid Build Coastguard Worker #include <cutils/klog.h>
32*f40fafd4SAndroid Build Coastguard Worker #include <hidl/HidlTransportSupport.h>
33*f40fafd4SAndroid Build Coastguard Worker #include <utils/Trace.h>
34*f40fafd4SAndroid Build Coastguard Worker
35*f40fafd4SAndroid Build Coastguard Worker #include <dirent.h>
36*f40fafd4SAndroid Build Coastguard Worker #include <errno.h>
37*f40fafd4SAndroid Build Coastguard Worker #include <fcntl.h>
38*f40fafd4SAndroid Build Coastguard Worker #include <fs_mgr.h>
39*f40fafd4SAndroid Build Coastguard Worker #include <getopt.h>
40*f40fafd4SAndroid Build Coastguard Worker #include <stdio.h>
41*f40fafd4SAndroid Build Coastguard Worker #include <stdlib.h>
42*f40fafd4SAndroid Build Coastguard Worker #include <string.h>
43*f40fafd4SAndroid Build Coastguard Worker #include <sys/stat.h>
44*f40fafd4SAndroid Build Coastguard Worker #include <sys/types.h>
45*f40fafd4SAndroid Build Coastguard Worker
46*f40fafd4SAndroid Build Coastguard Worker typedef struct vold_configs {
47*f40fafd4SAndroid Build Coastguard Worker bool has_adoptable : 1;
48*f40fafd4SAndroid Build Coastguard Worker bool has_quota : 1;
49*f40fafd4SAndroid Build Coastguard Worker bool has_reserved : 1;
50*f40fafd4SAndroid Build Coastguard Worker bool has_compress : 1;
51*f40fafd4SAndroid Build Coastguard Worker } VoldConfigs;
52*f40fafd4SAndroid Build Coastguard Worker
53*f40fafd4SAndroid Build Coastguard Worker static int process_config(VolumeManager* vm, VoldConfigs* configs);
54*f40fafd4SAndroid Build Coastguard Worker static void coldboot(const char* path);
55*f40fafd4SAndroid Build Coastguard Worker static void parse_args(int argc, char** argv);
56*f40fafd4SAndroid Build Coastguard Worker static void VoldLogger(android::base::LogId log_buffer_id, android::base::LogSeverity severity,
57*f40fafd4SAndroid Build Coastguard Worker const char* tag, const char* file, unsigned int line, const char* message);
58*f40fafd4SAndroid Build Coastguard Worker
59*f40fafd4SAndroid Build Coastguard Worker struct selabel_handle* sehandle;
60*f40fafd4SAndroid Build Coastguard Worker android::base::LogdLogger logd_logger(android::base::SYSTEM);
61*f40fafd4SAndroid Build Coastguard Worker
62*f40fafd4SAndroid Build Coastguard Worker using android::base::StringPrintf;
63*f40fafd4SAndroid Build Coastguard Worker using android::fs_mgr::ReadDefaultFstab;
64*f40fafd4SAndroid Build Coastguard Worker
main(int argc,char ** argv)65*f40fafd4SAndroid Build Coastguard Worker int main(int argc, char** argv) {
66*f40fafd4SAndroid Build Coastguard Worker atrace_set_tracing_enabled(false);
67*f40fafd4SAndroid Build Coastguard Worker setenv("ANDROID_LOG_TAGS", "*:d", 1); // Do not submit with verbose logs enabled
68*f40fafd4SAndroid Build Coastguard Worker android::base::InitLogging(argv, &VoldLogger);
69*f40fafd4SAndroid Build Coastguard Worker
70*f40fafd4SAndroid Build Coastguard Worker LOG(INFO) << "Vold 3.0 (the awakening) firing up";
71*f40fafd4SAndroid Build Coastguard Worker
72*f40fafd4SAndroid Build Coastguard Worker ATRACE_BEGIN("main");
73*f40fafd4SAndroid Build Coastguard Worker
74*f40fafd4SAndroid Build Coastguard Worker LOG(DEBUG) << "Detected support for:"
75*f40fafd4SAndroid Build Coastguard Worker << (android::vold::IsFilesystemSupported("ext4") ? " ext4" : "")
76*f40fafd4SAndroid Build Coastguard Worker << (android::vold::IsFilesystemSupported("f2fs") ? " f2fs" : "")
77*f40fafd4SAndroid Build Coastguard Worker << (android::vold::IsFilesystemSupported("vfat") ? " vfat" : "");
78*f40fafd4SAndroid Build Coastguard Worker
79*f40fafd4SAndroid Build Coastguard Worker VolumeManager* vm;
80*f40fafd4SAndroid Build Coastguard Worker NetlinkManager* nm;
81*f40fafd4SAndroid Build Coastguard Worker
82*f40fafd4SAndroid Build Coastguard Worker parse_args(argc, argv);
83*f40fafd4SAndroid Build Coastguard Worker
84*f40fafd4SAndroid Build Coastguard Worker sehandle = selinux_android_file_context_handle();
85*f40fafd4SAndroid Build Coastguard Worker if (!sehandle) {
86*f40fafd4SAndroid Build Coastguard Worker LOG(ERROR) << "Failed to get SELinux file contexts handle";
87*f40fafd4SAndroid Build Coastguard Worker exit(1);
88*f40fafd4SAndroid Build Coastguard Worker }
89*f40fafd4SAndroid Build Coastguard Worker selinux_android_set_sehandle(sehandle);
90*f40fafd4SAndroid Build Coastguard Worker
91*f40fafd4SAndroid Build Coastguard Worker mkdir("/dev/block/vold", 0755);
92*f40fafd4SAndroid Build Coastguard Worker
93*f40fafd4SAndroid Build Coastguard Worker /* For when cryptfs checks and mounts an encrypted filesystem */
94*f40fafd4SAndroid Build Coastguard Worker klog_set_level(6);
95*f40fafd4SAndroid Build Coastguard Worker
96*f40fafd4SAndroid Build Coastguard Worker /* Create our singleton managers */
97*f40fafd4SAndroid Build Coastguard Worker if (!(vm = VolumeManager::Instance())) {
98*f40fafd4SAndroid Build Coastguard Worker LOG(ERROR) << "Unable to create VolumeManager";
99*f40fafd4SAndroid Build Coastguard Worker exit(1);
100*f40fafd4SAndroid Build Coastguard Worker }
101*f40fafd4SAndroid Build Coastguard Worker
102*f40fafd4SAndroid Build Coastguard Worker if (!(nm = NetlinkManager::Instance())) {
103*f40fafd4SAndroid Build Coastguard Worker LOG(ERROR) << "Unable to create NetlinkManager";
104*f40fafd4SAndroid Build Coastguard Worker exit(1);
105*f40fafd4SAndroid Build Coastguard Worker }
106*f40fafd4SAndroid Build Coastguard Worker
107*f40fafd4SAndroid Build Coastguard Worker if (android::base::GetBoolProperty("vold.debug", false)) {
108*f40fafd4SAndroid Build Coastguard Worker vm->setDebug(true);
109*f40fafd4SAndroid Build Coastguard Worker }
110*f40fafd4SAndroid Build Coastguard Worker
111*f40fafd4SAndroid Build Coastguard Worker if (vm->start()) {
112*f40fafd4SAndroid Build Coastguard Worker PLOG(ERROR) << "Unable to start VolumeManager";
113*f40fafd4SAndroid Build Coastguard Worker exit(1);
114*f40fafd4SAndroid Build Coastguard Worker }
115*f40fafd4SAndroid Build Coastguard Worker
116*f40fafd4SAndroid Build Coastguard Worker VoldConfigs configs = {};
117*f40fafd4SAndroid Build Coastguard Worker if (process_config(vm, &configs)) {
118*f40fafd4SAndroid Build Coastguard Worker PLOG(ERROR) << "Error reading configuration... continuing anyways";
119*f40fafd4SAndroid Build Coastguard Worker }
120*f40fafd4SAndroid Build Coastguard Worker
121*f40fafd4SAndroid Build Coastguard Worker android::hardware::configureRpcThreadpool(1, false /* callerWillJoin */);
122*f40fafd4SAndroid Build Coastguard Worker
123*f40fafd4SAndroid Build Coastguard Worker ATRACE_BEGIN("VoldNativeService::start");
124*f40fafd4SAndroid Build Coastguard Worker if (android::vold::VoldNativeService::start() != android::OK) {
125*f40fafd4SAndroid Build Coastguard Worker LOG(ERROR) << "Unable to start VoldNativeService";
126*f40fafd4SAndroid Build Coastguard Worker exit(1);
127*f40fafd4SAndroid Build Coastguard Worker }
128*f40fafd4SAndroid Build Coastguard Worker ATRACE_END();
129*f40fafd4SAndroid Build Coastguard Worker
130*f40fafd4SAndroid Build Coastguard Worker LOG(DEBUG) << "VoldNativeService::start() completed OK";
131*f40fafd4SAndroid Build Coastguard Worker
132*f40fafd4SAndroid Build Coastguard Worker ATRACE_BEGIN("NetlinkManager::start");
133*f40fafd4SAndroid Build Coastguard Worker if (nm->start()) {
134*f40fafd4SAndroid Build Coastguard Worker PLOG(ERROR) << "Unable to start NetlinkManager";
135*f40fafd4SAndroid Build Coastguard Worker exit(1);
136*f40fafd4SAndroid Build Coastguard Worker }
137*f40fafd4SAndroid Build Coastguard Worker ATRACE_END();
138*f40fafd4SAndroid Build Coastguard Worker
139*f40fafd4SAndroid Build Coastguard Worker // This call should go after listeners are started to avoid
140*f40fafd4SAndroid Build Coastguard Worker // a deadlock between vold and init (see b/34278978 for details)
141*f40fafd4SAndroid Build Coastguard Worker android::base::SetProperty("vold.has_adoptable", configs.has_adoptable ? "1" : "0");
142*f40fafd4SAndroid Build Coastguard Worker android::base::SetProperty("vold.has_quota", configs.has_quota ? "1" : "0");
143*f40fafd4SAndroid Build Coastguard Worker android::base::SetProperty("vold.has_reserved", configs.has_reserved ? "1" : "0");
144*f40fafd4SAndroid Build Coastguard Worker android::base::SetProperty("vold.has_compress", configs.has_compress ? "1" : "0");
145*f40fafd4SAndroid Build Coastguard Worker
146*f40fafd4SAndroid Build Coastguard Worker // Do coldboot here so it won't block booting,
147*f40fafd4SAndroid Build Coastguard Worker // also the cold boot is needed in case we have flash drive
148*f40fafd4SAndroid Build Coastguard Worker // connected before Vold launched
149*f40fafd4SAndroid Build Coastguard Worker coldboot("/sys/block");
150*f40fafd4SAndroid Build Coastguard Worker
151*f40fafd4SAndroid Build Coastguard Worker ATRACE_END();
152*f40fafd4SAndroid Build Coastguard Worker
153*f40fafd4SAndroid Build Coastguard Worker android::IPCThreadState::self()->joinThreadPool();
154*f40fafd4SAndroid Build Coastguard Worker LOG(INFO) << "vold shutting down";
155*f40fafd4SAndroid Build Coastguard Worker
156*f40fafd4SAndroid Build Coastguard Worker exit(0);
157*f40fafd4SAndroid Build Coastguard Worker }
158*f40fafd4SAndroid Build Coastguard Worker
parse_args(int argc,char ** argv)159*f40fafd4SAndroid Build Coastguard Worker static void parse_args(int argc, char** argv) {
160*f40fafd4SAndroid Build Coastguard Worker static struct option opts[] = {
161*f40fafd4SAndroid Build Coastguard Worker {"blkid_context", required_argument, 0, 'b'},
162*f40fafd4SAndroid Build Coastguard Worker {"blkid_untrusted_context", required_argument, 0, 'B'},
163*f40fafd4SAndroid Build Coastguard Worker {"fsck_context", required_argument, 0, 'f'},
164*f40fafd4SAndroid Build Coastguard Worker {"fsck_untrusted_context", required_argument, 0, 'F'},
165*f40fafd4SAndroid Build Coastguard Worker {nullptr, 0, nullptr, 0},
166*f40fafd4SAndroid Build Coastguard Worker };
167*f40fafd4SAndroid Build Coastguard Worker
168*f40fafd4SAndroid Build Coastguard Worker int c;
169*f40fafd4SAndroid Build Coastguard Worker while ((c = getopt_long(argc, argv, "", opts, nullptr)) != -1) {
170*f40fafd4SAndroid Build Coastguard Worker switch (c) {
171*f40fafd4SAndroid Build Coastguard Worker // clang-format off
172*f40fafd4SAndroid Build Coastguard Worker case 'b': android::vold::sBlkidContext = optarg; break;
173*f40fafd4SAndroid Build Coastguard Worker case 'B': android::vold::sBlkidUntrustedContext = optarg; break;
174*f40fafd4SAndroid Build Coastguard Worker case 'f': android::vold::sFsckContext = optarg; break;
175*f40fafd4SAndroid Build Coastguard Worker case 'F': android::vold::sFsckUntrustedContext = optarg; break;
176*f40fafd4SAndroid Build Coastguard Worker // clang-format on
177*f40fafd4SAndroid Build Coastguard Worker }
178*f40fafd4SAndroid Build Coastguard Worker }
179*f40fafd4SAndroid Build Coastguard Worker
180*f40fafd4SAndroid Build Coastguard Worker CHECK(android::vold::sBlkidContext != nullptr);
181*f40fafd4SAndroid Build Coastguard Worker CHECK(android::vold::sBlkidUntrustedContext != nullptr);
182*f40fafd4SAndroid Build Coastguard Worker CHECK(android::vold::sFsckContext != nullptr);
183*f40fafd4SAndroid Build Coastguard Worker CHECK(android::vold::sFsckUntrustedContext != nullptr);
184*f40fafd4SAndroid Build Coastguard Worker }
185*f40fafd4SAndroid Build Coastguard Worker
do_coldboot(DIR * d,int lvl)186*f40fafd4SAndroid Build Coastguard Worker static void do_coldboot(DIR* d, int lvl) {
187*f40fafd4SAndroid Build Coastguard Worker struct dirent* de;
188*f40fafd4SAndroid Build Coastguard Worker int dfd, fd;
189*f40fafd4SAndroid Build Coastguard Worker
190*f40fafd4SAndroid Build Coastguard Worker dfd = dirfd(d);
191*f40fafd4SAndroid Build Coastguard Worker
192*f40fafd4SAndroid Build Coastguard Worker fd = openat(dfd, "uevent", O_WRONLY | O_CLOEXEC);
193*f40fafd4SAndroid Build Coastguard Worker if (fd >= 0) {
194*f40fafd4SAndroid Build Coastguard Worker write(fd, "add\n", 4);
195*f40fafd4SAndroid Build Coastguard Worker close(fd);
196*f40fafd4SAndroid Build Coastguard Worker }
197*f40fafd4SAndroid Build Coastguard Worker
198*f40fafd4SAndroid Build Coastguard Worker while ((de = readdir(d))) {
199*f40fafd4SAndroid Build Coastguard Worker DIR* d2;
200*f40fafd4SAndroid Build Coastguard Worker
201*f40fafd4SAndroid Build Coastguard Worker if (de->d_name[0] == '.') continue;
202*f40fafd4SAndroid Build Coastguard Worker
203*f40fafd4SAndroid Build Coastguard Worker if (de->d_type != DT_DIR && lvl > 0) continue;
204*f40fafd4SAndroid Build Coastguard Worker
205*f40fafd4SAndroid Build Coastguard Worker fd = openat(dfd, de->d_name, O_RDONLY | O_DIRECTORY | O_CLOEXEC);
206*f40fafd4SAndroid Build Coastguard Worker if (fd < 0) continue;
207*f40fafd4SAndroid Build Coastguard Worker
208*f40fafd4SAndroid Build Coastguard Worker d2 = fdopendir(fd);
209*f40fafd4SAndroid Build Coastguard Worker if (d2 == 0)
210*f40fafd4SAndroid Build Coastguard Worker close(fd);
211*f40fafd4SAndroid Build Coastguard Worker else {
212*f40fafd4SAndroid Build Coastguard Worker do_coldboot(d2, lvl + 1);
213*f40fafd4SAndroid Build Coastguard Worker closedir(d2);
214*f40fafd4SAndroid Build Coastguard Worker }
215*f40fafd4SAndroid Build Coastguard Worker }
216*f40fafd4SAndroid Build Coastguard Worker }
217*f40fafd4SAndroid Build Coastguard Worker
coldboot(const char * path)218*f40fafd4SAndroid Build Coastguard Worker static void coldboot(const char* path) {
219*f40fafd4SAndroid Build Coastguard Worker ATRACE_NAME("coldboot");
220*f40fafd4SAndroid Build Coastguard Worker DIR* d = opendir(path);
221*f40fafd4SAndroid Build Coastguard Worker if (d) {
222*f40fafd4SAndroid Build Coastguard Worker do_coldboot(d, 0);
223*f40fafd4SAndroid Build Coastguard Worker closedir(d);
224*f40fafd4SAndroid Build Coastguard Worker }
225*f40fafd4SAndroid Build Coastguard Worker }
226*f40fafd4SAndroid Build Coastguard Worker
process_config(VolumeManager * vm,VoldConfigs * configs)227*f40fafd4SAndroid Build Coastguard Worker static int process_config(VolumeManager* vm, VoldConfigs* configs) {
228*f40fafd4SAndroid Build Coastguard Worker ATRACE_NAME("process_config");
229*f40fafd4SAndroid Build Coastguard Worker
230*f40fafd4SAndroid Build Coastguard Worker if (!ReadDefaultFstab(&fstab_default)) {
231*f40fafd4SAndroid Build Coastguard Worker PLOG(ERROR) << "Failed to open default fstab";
232*f40fafd4SAndroid Build Coastguard Worker return -1;
233*f40fafd4SAndroid Build Coastguard Worker }
234*f40fafd4SAndroid Build Coastguard Worker
235*f40fafd4SAndroid Build Coastguard Worker /* Loop through entries looking for ones that vold manages */
236*f40fafd4SAndroid Build Coastguard Worker configs->has_adoptable = false;
237*f40fafd4SAndroid Build Coastguard Worker configs->has_quota = false;
238*f40fafd4SAndroid Build Coastguard Worker configs->has_reserved = false;
239*f40fafd4SAndroid Build Coastguard Worker configs->has_compress = false;
240*f40fafd4SAndroid Build Coastguard Worker for (auto& entry : fstab_default) {
241*f40fafd4SAndroid Build Coastguard Worker if (entry.fs_mgr_flags.quota) {
242*f40fafd4SAndroid Build Coastguard Worker configs->has_quota = true;
243*f40fafd4SAndroid Build Coastguard Worker }
244*f40fafd4SAndroid Build Coastguard Worker if (entry.reserved_size > 0) {
245*f40fafd4SAndroid Build Coastguard Worker configs->has_reserved = true;
246*f40fafd4SAndroid Build Coastguard Worker }
247*f40fafd4SAndroid Build Coastguard Worker if (entry.fs_mgr_flags.fs_compress) {
248*f40fafd4SAndroid Build Coastguard Worker configs->has_compress = true;
249*f40fafd4SAndroid Build Coastguard Worker }
250*f40fafd4SAndroid Build Coastguard Worker
251*f40fafd4SAndroid Build Coastguard Worker /* Make sure logical partitions have an updated blk_device. */
252*f40fafd4SAndroid Build Coastguard Worker if (entry.fs_mgr_flags.logical && !fs_mgr_update_logical_partition(&entry) &&
253*f40fafd4SAndroid Build Coastguard Worker !entry.fs_mgr_flags.no_fail) {
254*f40fafd4SAndroid Build Coastguard Worker PLOG(FATAL) << "could not find logical partition " << entry.blk_device;
255*f40fafd4SAndroid Build Coastguard Worker }
256*f40fafd4SAndroid Build Coastguard Worker
257*f40fafd4SAndroid Build Coastguard Worker if (entry.mount_point == "/data" && !entry.metadata_key_dir.empty()) {
258*f40fafd4SAndroid Build Coastguard Worker // Pre-populate userdata dm-devices since the uevents are asynchronous (b/198405417).
259*f40fafd4SAndroid Build Coastguard Worker android::vold::defaultkey_precreate_dm_device();
260*f40fafd4SAndroid Build Coastguard Worker }
261*f40fafd4SAndroid Build Coastguard Worker
262*f40fafd4SAndroid Build Coastguard Worker if (entry.fs_mgr_flags.vold_managed) {
263*f40fafd4SAndroid Build Coastguard Worker if (entry.fs_mgr_flags.nonremovable) {
264*f40fafd4SAndroid Build Coastguard Worker LOG(WARNING) << "nonremovable no longer supported; ignoring volume";
265*f40fafd4SAndroid Build Coastguard Worker continue;
266*f40fafd4SAndroid Build Coastguard Worker }
267*f40fafd4SAndroid Build Coastguard Worker
268*f40fafd4SAndroid Build Coastguard Worker std::string sysPattern(entry.blk_device);
269*f40fafd4SAndroid Build Coastguard Worker std::string nickname(entry.label);
270*f40fafd4SAndroid Build Coastguard Worker int flags = 0;
271*f40fafd4SAndroid Build Coastguard Worker
272*f40fafd4SAndroid Build Coastguard Worker if (entry.is_encryptable()) {
273*f40fafd4SAndroid Build Coastguard Worker flags |= android::vold::Disk::Flags::kAdoptable;
274*f40fafd4SAndroid Build Coastguard Worker configs->has_adoptable = true;
275*f40fafd4SAndroid Build Coastguard Worker }
276*f40fafd4SAndroid Build Coastguard Worker if (entry.fs_mgr_flags.no_emulated_sd ||
277*f40fafd4SAndroid Build Coastguard Worker android::base::GetBoolProperty("vold.debug.default_primary", false)) {
278*f40fafd4SAndroid Build Coastguard Worker flags |= android::vold::Disk::Flags::kDefaultPrimary;
279*f40fafd4SAndroid Build Coastguard Worker }
280*f40fafd4SAndroid Build Coastguard Worker
281*f40fafd4SAndroid Build Coastguard Worker vm->addDiskSource(std::shared_ptr<VolumeManager::DiskSource>(
282*f40fafd4SAndroid Build Coastguard Worker new VolumeManager::DiskSource(sysPattern, nickname, flags)));
283*f40fafd4SAndroid Build Coastguard Worker }
284*f40fafd4SAndroid Build Coastguard Worker }
285*f40fafd4SAndroid Build Coastguard Worker return 0;
286*f40fafd4SAndroid Build Coastguard Worker }
287*f40fafd4SAndroid Build Coastguard Worker
VoldLogger(android::base::LogId log_buffer_id,android::base::LogSeverity severity,const char * tag,const char * file,unsigned int line,const char * message)288*f40fafd4SAndroid Build Coastguard Worker static void VoldLogger(android::base::LogId log_buffer_id, android::base::LogSeverity severity,
289*f40fafd4SAndroid Build Coastguard Worker const char* tag, const char* file, unsigned int line, const char* message) {
290*f40fafd4SAndroid Build Coastguard Worker logd_logger(log_buffer_id, severity, tag, file, line, message);
291*f40fafd4SAndroid Build Coastguard Worker
292*f40fafd4SAndroid Build Coastguard Worker if (severity >= android::base::WARNING) {
293*f40fafd4SAndroid Build Coastguard Worker static bool early_boot_done = false;
294*f40fafd4SAndroid Build Coastguard Worker
295*f40fafd4SAndroid Build Coastguard Worker // If metadata encryption setup (fscrypt_mount_metadata_encrypted) or
296*f40fafd4SAndroid Build Coastguard Worker // basic FBE setup (fscrypt_init_user0) fails, then the boot will fail
297*f40fafd4SAndroid Build Coastguard Worker // before adb can be started, so logcat won't be available. To allow
298*f40fafd4SAndroid Build Coastguard Worker // debugging these early boot failures, log early errors and warnings to
299*f40fafd4SAndroid Build Coastguard Worker // the kernel log. This allows diagnosing failures via the serial log,
300*f40fafd4SAndroid Build Coastguard Worker // or via last dmesg/"fastboot oem dmesg" on devices that support it.
301*f40fafd4SAndroid Build Coastguard Worker //
302*f40fafd4SAndroid Build Coastguard Worker // As a very quick-and-dirty test for whether /data has been mounted,
303*f40fafd4SAndroid Build Coastguard Worker // check whether /data/misc/vold exists.
304*f40fafd4SAndroid Build Coastguard Worker if (!early_boot_done) {
305*f40fafd4SAndroid Build Coastguard Worker if (access("/data/misc/vold", F_OK) == 0 && fscrypt_init_user0_done) {
306*f40fafd4SAndroid Build Coastguard Worker early_boot_done = true;
307*f40fafd4SAndroid Build Coastguard Worker return;
308*f40fafd4SAndroid Build Coastguard Worker }
309*f40fafd4SAndroid Build Coastguard Worker android::base::KernelLogger(log_buffer_id, severity, tag, file, line, message);
310*f40fafd4SAndroid Build Coastguard Worker }
311*f40fafd4SAndroid Build Coastguard Worker }
312*f40fafd4SAndroid Build Coastguard Worker }
313