xref: /aosp_15_r20/system/vold/main.cpp (revision f40fafd4c6c2594924d919feffc1a1fd6e3b30f3)
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