summaryrefslogtreecommitdiff
path: root/main.cpp
diff options
context:
space:
mode:
authorWei Wang <wvw@google.com>2017-03-06 17:27:05 -0800
committerWei Wang <wvw@google.com>2017-03-06 17:49:37 -0800
commit2edbe28add016d95fd91c71fb157542f0ce55979 (patch)
tree57d5b195620c5865f21fe1442935d3411cb8614f /main.cpp
parentbf8518056dc37fd36eb623729217d1ee9108096f (diff)
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
Diffstat (limited to 'main.cpp')
-rw-r--r--main.cpp49
1 files changed, 49 insertions, 0 deletions
diff --git a/main.cpp b/main.cpp
index 4810d43..6754b0a 100644
--- a/main.cpp
+++ b/main.cpp
@@ -36,9 +36,11 @@
#include <sys/types.h>
#include <getopt.h>
#include <fcntl.h>
+#include <dirent.h>
#include <fs_mgr.h>
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());