diff options
author | Ray Strode <rstrode@redhat.com> | 2018-10-06 06:08:31 -0400 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2018-10-06 16:52:48 +0200 |
commit | ad1bf59c67e8d05629a4db00bbbe4d4c1c37fe46 (patch) | |
tree | 443c82261fd058f4363308046d9f2b090a288fcb /src/login/logind-device.c | |
parent | dcf0b8a5bea6d006b3e4e511a8158608ebf986fb (diff) | |
download | systemd-ad1bf59c67e8d05629a4db00bbbe4d4c1c37fe46.tar.gz |
logind: ensure seat0 CanGraphical state is written
For non-`seat0` seats, attaching a graphics card to a seat can
lead to it getting created. This is because the graphics device
is a "master device" which means that device is a seat-defining
device.
`seat0` may get created, even before the graphics driver is loaded,
though. This is because the graphics driver is loaded
asynchronously at startup, and `seat0` is the primary seat of
system, associated with the system VTs.
When a graphics card is attached to a seat the `CanGraphical`
property on that seat will flip to `true`.
For seats that haven't been created yet (non-`seat0` seats), this
leads to `seat_start` getting called which ultimately causes the
seat to get serialized to `/run/systemd/seats`.
For `seat0`, which is already created, `seat_start` will return
immediately, which means the updated `CanGraphical` state will
never get written to `/run/systemd/seats`.
The end result is that clients querying `sd_seat_can_graphical`
won't get the correct answer for `seat0` in cases where the
graphics device takes a long time to load until some other peice
of seat state is updated.
This commit fixes the problem by calling `seat_save` explicitly
for already running seats at the time a graphics device is
attached.
Diffstat (limited to 'src/login/logind-device.c')
-rw-r--r-- | src/login/logind-device.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/src/login/logind-device.c b/src/login/logind-device.c index 9b5b3e8798..e724365b13 100644 --- a/src/login/logind-device.c +++ b/src/login/logind-device.c @@ -99,6 +99,8 @@ void device_attach(Device *d, Seat *s) { } } - if (!had_master && d->master) + if (!had_master && d->master && s->started) { + seat_save(s); seat_send_changed(s, "CanGraphical", NULL); + } } |