diff --git a/init/builtins.cpp b/init/builtins.cpp index f5de1adf1..597c32d05 100644 --- a/init/builtins.cpp +++ b/init/builtins.cpp @@ -1173,6 +1173,10 @@ static Result do_remount_userdata(const BuiltinArguments& args) { } // TODO(b/135984674): check that fstab contains /data. if (auto rc = fs_mgr_remount_userdata_into_checkpointing(&fstab); rc < 0) { + std::string proc_mounts_output; + android::base::ReadFileToString("/proc/mounts", &proc_mounts_output, true); + android::base::WriteStringToFile(proc_mounts_output, + "/metadata/userspacereboot/mount_info.txt"); trigger_shutdown("reboot,mount_userdata_failed"); } if (auto result = queue_fs_event(initial_mount_fstab_return_code, true); !result.ok()) { diff --git a/init/reboot.cpp b/init/reboot.cpp index 19e83cc7a..0cce6a3c6 100644 --- a/init/reboot.cpp +++ b/init/reboot.cpp @@ -804,11 +804,19 @@ static Result DoUserspaceReboot() { auto sigkill_timeout = GetMillisProperty("init.userspace_reboot.sigkill.timeoutmillis", 10s); LOG(INFO) << "Timeout to terminate services: " << sigterm_timeout.count() << "ms " << "Timeout to kill services: " << sigkill_timeout.count() << "ms"; + std::string services_file_name = "/metadata/userspacereboot/services.txt"; + const int flags = O_RDWR | O_CREAT | O_SYNC | O_APPEND | O_CLOEXEC; StopServicesAndLogViolations(stop_first, sigterm_timeout, true /* SIGTERM */); if (int r = StopServicesAndLogViolations(stop_first, sigkill_timeout, false /* SIGKILL */); r > 0) { + auto fd = unique_fd(TEMP_FAILURE_RETRY(open(services_file_name.c_str(), flags, 0666))); + android::base::WriteStringToFd("Post-data services still running: \n", fd); + for (const auto& s : stop_first) { + if (s->IsRunning()) { + android::base::WriteStringToFd(s->name() + "\n", fd); + } + } sub_reason = "sigkill"; - // TODO(b/135984674): store information about offending services for debugging. return Error() << r << " post-data services are still running"; } if (auto result = KillZramBackingDevice(); !result.ok()) { @@ -822,8 +830,14 @@ static Result DoUserspaceReboot() { if (int r = StopServicesAndLogViolations(GetDebuggingServices(true /* only_post_data */), sigkill_timeout, false /* SIGKILL */); r > 0) { + auto fd = unique_fd(TEMP_FAILURE_RETRY(open(services_file_name.c_str(), flags, 0666))); + android::base::WriteStringToFd("Debugging services still running: \n", fd); + for (const auto& s : GetDebuggingServices(true)) { + if (s->IsRunning()) { + android::base::WriteStringToFd(s->name() + "\n", fd); + } + } sub_reason = "sigkill_debug"; - // TODO(b/135984674): store information about offending services for debugging. return Error() << r << " debugging services are still running"; } { diff --git a/rootdir/init.rc b/rootdir/init.rc index 37f911a34..44c8f27b1 100644 --- a/rootdir/init.rc +++ b/rootdir/init.rc @@ -510,6 +510,7 @@ on post-fs mkdir /metadata/bootstat 0750 system log mkdir /metadata/ota 0700 root system mkdir /metadata/ota/snapshots 0700 root system + mkdir /metadata/userspacereboot 0770 root system mkdir /metadata/apex 0700 root system mkdir /metadata/apex/sessions 0700 root system