1
0
mirror of https://github.com/systemd/systemd.git synced 2024-12-22 17:35:35 +03:00

pid1: order units using TTYVHangup= after vconsole setup

The goal of this change is to delay getty services until after
systemd-vconsole-setup has finished. systemd-vconsole-setup starts loadkeys,
and it seems that when loadkeys is interrupted by the TTY hangup call we do
when starting tty services [1], so that loadkeys starts getting EIO from the
ioctl("/dev/tty1", KDSKBENT) syscall it does.

Fixes #26908.

[1] https://github.com/legionus/kbd/issues/92#issuecomment-1554451788

Initially I wanted to add ordering dependencies to individual units, but
TTYVHangup= can be added to other various external units too. The solution with
an implicit dependency should cover those cases too.
This commit is contained in:
Zbigniew Jędrzejewski-Szmek 2023-05-19 15:50:04 +02:00
parent ce0fe01f22
commit e019ea738d
8 changed files with 35 additions and 6 deletions

View File

@ -70,8 +70,12 @@
<listitem><para>Units whose standard output or error output is connected to <option>journal</option> or
<option>kmsg</option> (or their combinations with console output, see below) automatically acquire
dependencies of type <varname>After=</varname> on
<filename>systemd-journald.socket</filename>.</para></listitem>
dependencies of type <varname>After=</varname> on <filename>systemd-journald.socket</filename>.
</para></listitem>
<listitem><para>Units using the terminal (standard input, output, or error are connected to a terminal
or <varname>TTYPath=</varname> is used) automatically acquire an <varname>After=</varname> dependency
on <filename>systemd-vconsole-setup.service</filename>.</para></listitem>
<listitem><para>Units using <varname>LogNamespace=</varname> will automatically gain ordering and
requirement dependencies on the two socket units associated with

View File

@ -85,6 +85,7 @@
#define SPECIAL_QUOTACHECK_SERVICE "systemd-quotacheck.service"
#define SPECIAL_QUOTAON_SERVICE "quotaon.service"
#define SPECIAL_REMOUNT_FS_SERVICE "systemd-remount-fs.service"
#define SPECIAL_VCONSOLE_SETUP_SERVICE "systemd-vconsole-setup.service"
#define SPECIAL_VOLATILE_ROOT_SERVICE "systemd-volatile-root.service"
#define SPECIAL_UDEVD_SERVICE "systemd-udevd.service"
#define SPECIAL_GROWFS_SERVICE "systemd-growfs@.service"

View File

@ -6870,6 +6870,16 @@ bool exec_context_has_encrypted_credentials(ExecContext *c) {
return false;
}
int exec_context_add_default_dependencies(Unit *u, const ExecContext *c) {
assert(u);
assert(u->default_dependencies);
if (c && exec_context_needs_term(c))
return unit_add_dependency_by_name(u, UNIT_AFTER, SPECIAL_VCONSOLE_SETUP_SERVICE,
/* add_reference= */ true, UNIT_DEPENDENCY_DEFAULT);
return 0;
}
void exec_status_start(ExecStatus *s, pid_t pid) {
assert(s);

View File

@ -486,6 +486,7 @@ void exec_context_revert_tty(ExecContext *c);
int exec_context_get_clean_directories(ExecContext *c, char **prefix, ExecCleanMask mask, char ***ret);
int exec_context_get_clean_mask(ExecContext *c, ExecCleanMask *ret);
int exec_context_add_default_dependencies(Unit *u, const ExecContext *c);
void exec_status_start(ExecStatus *s, pid_t pid);
void exec_status_exit(ExecStatus *s, const ExecContext *context, pid_t pid, int code, int status);

View File

@ -575,7 +575,7 @@ static int mount_add_default_dependencies(Mount *m) {
return r;
}
return 0;
return exec_context_add_default_dependencies(UNIT(m), &m->exec_context);
}
static int mount_verify(Mount *m) {

View File

@ -740,7 +740,12 @@ static int service_add_default_dependencies(Service *s) {
return r;
/* Third, add us in for normal shutdown. */
return unit_add_two_dependencies_by_name(UNIT(s), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_SHUTDOWN_TARGET, true, UNIT_DEPENDENCY_DEFAULT);
r = unit_add_two_dependencies_by_name(UNIT(s), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_SHUTDOWN_TARGET, true, UNIT_DEPENDENCY_DEFAULT);
if (r < 0)
return r;
/* Fourth, add generic dependencies */
return exec_context_add_default_dependencies(UNIT(s), &s->exec_context);
}
static void service_fix_stdio(Service *s) {

View File

@ -276,7 +276,11 @@ static int socket_add_default_dependencies(Socket *s) {
return r;
}
return unit_add_two_dependencies_by_name(UNIT(s), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_SHUTDOWN_TARGET, true, UNIT_DEPENDENCY_DEFAULT);
r = unit_add_two_dependencies_by_name(UNIT(s), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_SHUTDOWN_TARGET, true, UNIT_DEPENDENCY_DEFAULT);
if (r < 0)
return r;
return exec_context_add_default_dependencies(UNIT(s), &s->exec_context);
}
_pure_ static bool socket_has_exec(Socket *s) {

View File

@ -270,7 +270,11 @@ static int swap_add_default_dependencies(Swap *s) {
if (r < 0)
return r;
return unit_add_two_dependencies_by_name(UNIT(s), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_UMOUNT_TARGET, true, UNIT_DEPENDENCY_DEFAULT);
r = unit_add_two_dependencies_by_name(UNIT(s), UNIT_BEFORE, UNIT_CONFLICTS, SPECIAL_UMOUNT_TARGET, true, UNIT_DEPENDENCY_DEFAULT);
if (r < 0)
return r;
return exec_context_add_default_dependencies(UNIT(s), &s->exec_context);
}
static int swap_verify(Swap *s) {