From 2edbe28add016d95fd91c71fb157542f0ce55979 Mon Sep 17 00:00:00 2001 From: Wei Wang Date: Mon, 6 Mar 2017 17:27:05 -0800 Subject: [PATCH] vold: add coldboot back and make sure it won't block booting coldboot is needed when device rebooted with USB device attched so Vold netlink won't miss the information. This CL added back coldboot and moved down so that it won't block vold cl and ccl threads. Bug: 36007238 Test: reboot marlin with flash drive attached and flash drive is recognized Change-Id: Ie39f348e97a8500515e394e386541289a91b2425 --- main.cpp | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/main.cpp b/main.cpp index 4810d43..6754b0a 100644 --- a/main.cpp +++ b/main.cpp @@ -36,9 +36,11 @@ #include #include #include +#include #include static int process_config(VolumeManager *vm, bool* has_adoptable); +static void coldboot(const char *path); static void parse_args(int argc, char** argv); struct fstab *fstab; @@ -132,6 +134,10 @@ int main(int argc, char** argv) { // a deadlock between vold and init (see b/34278978 for details) property_set("vold.has_adoptable", has_adoptable ? "1" : "0"); + // Do coldboot here so it won't block booting, + // also the cold boot is needed in case we have flash drive + // connected before Vold launched + coldboot("/sys/block"); // Eventually we'll become the monitoring thread while(1) { pause(); @@ -165,6 +171,49 @@ static void parse_args(int argc, char** argv) { CHECK(android::vold::sFsckUntrustedContext != nullptr); } +static void do_coldboot(DIR *d, int lvl) { + struct dirent *de; + int dfd, fd; + + dfd = dirfd(d); + + fd = openat(dfd, "uevent", O_WRONLY | O_CLOEXEC); + if(fd >= 0) { + write(fd, "add\n", 4); + close(fd); + } + + while((de = readdir(d))) { + DIR *d2; + + if (de->d_name[0] == '.') + continue; + + if (de->d_type != DT_DIR && lvl > 0) + continue; + + fd = openat(dfd, de->d_name, O_RDONLY | O_DIRECTORY); + if(fd < 0) + continue; + + d2 = fdopendir(fd); + if(d2 == 0) + close(fd); + else { + do_coldboot(d2, lvl + 1); + closedir(d2); + } + } +} + +static void coldboot(const char *path) { + DIR *d = opendir(path); + if(d) { + do_coldboot(d, 0); + closedir(d); + } +} + static int process_config(VolumeManager *vm, bool* has_adoptable) { std::string path(android::vold::DefaultFstabPath()); fstab = fs_mgr_read_fstab(path.c_str());