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
This commit is contained in:
parent
bf8518056d
commit
2edbe28add
1 changed files with 49 additions and 0 deletions
49
main.cpp
49
main.cpp
|
@ -36,9 +36,11 @@
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
#include <dirent.h>
|
||||||
#include <fs_mgr.h>
|
#include <fs_mgr.h>
|
||||||
|
|
||||||
static int process_config(VolumeManager *vm, bool* has_adoptable);
|
static int process_config(VolumeManager *vm, bool* has_adoptable);
|
||||||
|
static void coldboot(const char *path);
|
||||||
static void parse_args(int argc, char** argv);
|
static void parse_args(int argc, char** argv);
|
||||||
|
|
||||||
struct fstab *fstab;
|
struct fstab *fstab;
|
||||||
|
@ -132,6 +134,10 @@ int main(int argc, char** argv) {
|
||||||
// a deadlock between vold and init (see b/34278978 for details)
|
// a deadlock between vold and init (see b/34278978 for details)
|
||||||
property_set("vold.has_adoptable", has_adoptable ? "1" : "0");
|
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
|
// Eventually we'll become the monitoring thread
|
||||||
while(1) {
|
while(1) {
|
||||||
pause();
|
pause();
|
||||||
|
@ -165,6 +171,49 @@ static void parse_args(int argc, char** argv) {
|
||||||
CHECK(android::vold::sFsckUntrustedContext != nullptr);
|
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) {
|
static int process_config(VolumeManager *vm, bool* has_adoptable) {
|
||||||
std::string path(android::vold::DefaultFstabPath());
|
std::string path(android::vold::DefaultFstabPath());
|
||||||
fstab = fs_mgr_read_fstab(path.c_str());
|
fstab = fs_mgr_read_fstab(path.c_str());
|
||||||
|
|
Loading…
Reference in a new issue