mirror of
https://github.com/systemd/systemd
synced 2024-10-04 23:31:09 +00:00
core: rework reboot parameter logic a bit
Always warn if something fails, and clarify that the involved utility functions do so in their name. Drop the REBOOT_PARAM_FILE macro. We don't do this for other flag file paths like this, so don't do this for this one either. The path isn't configurable anyway, hence let's make this easier to read by avoiding this one indirection.
This commit is contained in:
parent
8612da973d
commit
27c06cb516
|
@ -41,8 +41,6 @@
|
|||
#define SIGNALS_CRASH_HANDLER SIGSEGV,SIGILL,SIGFPE,SIGBUS,SIGQUIT,SIGABRT
|
||||
#define SIGNALS_IGNORE SIGPIPE
|
||||
|
||||
#define REBOOT_PARAM_FILE "/run/systemd/reboot-param"
|
||||
|
||||
#ifdef HAVE_SPLIT_USR
|
||||
#define KBD_KEYMAP_DIRS \
|
||||
"/usr/share/keymaps/\0" \
|
||||
|
|
|
@ -778,16 +778,24 @@ uint64_t physical_memory(void) {
|
|||
return (uint64_t) mem * (uint64_t) page_size();
|
||||
}
|
||||
|
||||
int update_reboot_param_file(const char *param) {
|
||||
int r = 0;
|
||||
int update_reboot_parameter_and_warn(const char *param) {
|
||||
int r;
|
||||
|
||||
if (param) {
|
||||
RUN_WITH_UMASK(0022)
|
||||
r = write_string_file(REBOOT_PARAM_FILE, param, WRITE_STRING_FILE_CREATE);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to write reboot param to "REBOOT_PARAM_FILE": %m");
|
||||
} else
|
||||
(void) unlink(REBOOT_PARAM_FILE);
|
||||
if (isempty(param)) {
|
||||
if (unlink("/run/systemd/reboot-param") < 0) {
|
||||
if (errno == ENOENT)
|
||||
return 0;
|
||||
|
||||
return log_warning_errno(errno, "Failed to unlink reboot parameter file: %m");
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
RUN_WITH_UMASK(0022)
|
||||
r = write_string_file("/run/systemd/reboot-param", param, WRITE_STRING_FILE_CREATE);
|
||||
if (r < 0)
|
||||
return log_warning_errno(r, "Failed to write reboot parameter file: %m");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -184,6 +184,6 @@ int namespace_enter(int pidns_fd, int mntns_fd, int netns_fd, int userns_fd, int
|
|||
|
||||
uint64_t physical_memory(void);
|
||||
|
||||
int update_reboot_param_file(const char *param);
|
||||
int update_reboot_parameter_and_warn(const char *param);
|
||||
|
||||
int version(void);
|
||||
|
|
|
@ -61,17 +61,17 @@ int failure_action(
|
|||
case FAILURE_ACTION_REBOOT:
|
||||
log_and_status(m, "Rebooting as result of failure.");
|
||||
|
||||
update_reboot_param_file(reboot_arg);
|
||||
(void) manager_add_job_by_name_and_warn(m, JOB_START, SPECIAL_REBOOT_TARGET,
|
||||
JOB_REPLACE_IRREVERSIBLY, NULL);
|
||||
(void) update_reboot_parameter_and_warn(reboot_arg);
|
||||
(void) manager_add_job_by_name_and_warn(m, JOB_START, SPECIAL_REBOOT_TARGET, JOB_REPLACE_IRREVERSIBLY, NULL);
|
||||
|
||||
break;
|
||||
|
||||
case FAILURE_ACTION_REBOOT_FORCE:
|
||||
log_and_status(m, "Forcibly rebooting as result of failure.");
|
||||
|
||||
update_reboot_param_file(reboot_arg);
|
||||
(void) update_reboot_parameter_and_warn(reboot_arg);
|
||||
m->exit_code = MANAGER_REBOOT;
|
||||
|
||||
break;
|
||||
|
||||
case FAILURE_ACTION_REBOOT_IMMEDIATE:
|
||||
|
@ -79,9 +79,10 @@ int failure_action(
|
|||
|
||||
sync();
|
||||
|
||||
if (reboot_arg) {
|
||||
if (!isempty(reboot_arg)) {
|
||||
log_info("Rebooting with argument '%s'.", reboot_arg);
|
||||
syscall(SYS_reboot, LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, LINUX_REBOOT_CMD_RESTART2, reboot_arg);
|
||||
log_warning_errno(errno, "Failed to reboot with parameter, retrying without: %m");
|
||||
}
|
||||
|
||||
log_info("Rebooting.");
|
||||
|
@ -90,8 +91,7 @@ int failure_action(
|
|||
|
||||
case FAILURE_ACTION_POWEROFF:
|
||||
log_and_status(m, "Powering off as result of failure.");
|
||||
(void) manager_add_job_by_name_and_warn(m, JOB_START, SPECIAL_POWEROFF_TARGET,
|
||||
JOB_REPLACE_IRREVERSIBLY, NULL);
|
||||
(void) manager_add_job_by_name_and_warn(m, JOB_START, SPECIAL_POWEROFF_TARGET, JOB_REPLACE_IRREVERSIBLY, NULL);
|
||||
break;
|
||||
|
||||
case FAILURE_ACTION_POWEROFF_FORCE:
|
||||
|
|
|
@ -397,9 +397,14 @@ int main(int argc, char *argv[]) {
|
|||
if (!in_container) {
|
||||
_cleanup_free_ char *param = NULL;
|
||||
|
||||
if (read_one_line_file(REBOOT_PARAM_FILE, ¶m) >= 0) {
|
||||
r = read_one_line_file("/run/systemd/reboot-param", ¶m);
|
||||
if (r < 0)
|
||||
log_warning_errno(r, "Failed to read reboot parameter file: %m");
|
||||
|
||||
if (!isempty(param)) {
|
||||
log_info("Rebooting with argument '%s'.", param);
|
||||
syscall(SYS_reboot, LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, LINUX_REBOOT_CMD_RESTART2, param);
|
||||
log_warning_errno(errno, "Failed to reboot with parameter, retrying without: %m");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -3136,7 +3136,7 @@ static int start_special(int argc, char *argv[], void *userdata) {
|
|||
return r;
|
||||
|
||||
if (a == ACTION_REBOOT && argc > 1) {
|
||||
r = update_reboot_param_file(argv[1]);
|
||||
r = update_reboot_parameter_and_warn(argv[1]);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
|
@ -6949,7 +6949,7 @@ static int halt_parse_argv(int argc, char *argv[]) {
|
|||
}
|
||||
|
||||
if (arg_action == ACTION_REBOOT && (argc == optind || argc == optind + 1)) {
|
||||
r = update_reboot_param_file(argc == optind + 1 ? argv[optind] : NULL);
|
||||
r = update_reboot_parameter_and_warn(argc == optind + 1 ? argv[optind] : NULL);
|
||||
if (r < 0)
|
||||
return r;
|
||||
} else if (optind < argc) {
|
||||
|
@ -7450,6 +7450,7 @@ static int start_with_fallback(void) {
|
|||
}
|
||||
|
||||
static int halt_now(enum action a) {
|
||||
int r;
|
||||
|
||||
/* The kernel will automaticall flush ATA disks and suchlike
|
||||
* on reboot(), but the file systems need to be synce'd
|
||||
|
@ -7476,9 +7477,14 @@ static int halt_now(enum action a) {
|
|||
case ACTION_REBOOT: {
|
||||
_cleanup_free_ char *param = NULL;
|
||||
|
||||
if (read_one_line_file(REBOOT_PARAM_FILE, ¶m) >= 0) {
|
||||
r = read_one_line_file("/run/systemd/reboot-param", ¶m);
|
||||
if (r < 0)
|
||||
log_warning_errno(r, "Failed to read reboot parameter file: %m");
|
||||
|
||||
if (!isempty(param)) {
|
||||
log_info("Rebooting with argument '%s'.", param);
|
||||
(void) syscall(SYS_reboot, LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, LINUX_REBOOT_CMD_RESTART2, param);
|
||||
log_warning_errno(errno, "Failed to reboot with parameter, retrying without: %m");
|
||||
}
|
||||
|
||||
log_info("Rebooting.");
|
||||
|
|
Loading…
Reference in a new issue