1
0
mirror of https://github.com/systemd/systemd synced 2025-11-14 22:34:46 +01:00

Compare commits

...

4 Commits

Author SHA1 Message Date
Yu Watanabe
d8e38d4aaa reread-partition-table: trigger change events when we failed to lock device
Before aa47d8ade18cc4a079fef5a1aaa37d763507104e, when we failed to lock
the device node, we simply trigger change events for the device and its
partitions. But the commit killed the fallback logic. Let's restore that.

Fixes #39544.
2025-11-07 16:35:44 +09:00
Yu Watanabe
fe263e9302
logind: handle session leader termination during deserialization more gracefully (#39607)
Closes https://github.com/systemd/systemd/issues/39556
2025-11-07 16:35:32 +09:00
Mike Yuan
a6590235df
logind: handle session leader termination during deserialization more gracefully
We track session leaders by pidfd precisely to make restarts reliable,
as leader exiting before deserialization is somewhat expected.
Such case is already handled gracefully (we'd GC sessions without leader
before kicking off the new cycle), but let's also tweak the log message
a bit to reduce annoyance.

Closes #39556
2025-11-06 20:53:49 +01:00
Mike Yuan
c54112bdee
logind: fix potential fd leak in deliver_session_leader_fd_consume()
Follow-up for 45eea629e3b3a640bf6a5cd13f4c73c86b426b11
2025-11-06 19:31:56 +01:00
3 changed files with 24 additions and 13 deletions

View File

@ -423,6 +423,8 @@ static int session_load_leader(Session *s, uint64_t pidfdid) {
return 0;
r = pidref_set_pid(&pidref, s->deserialized_pid);
if (r == -ESRCH)
return log_warning_errno(r, "Leader of session '%s' is gone while deserializing.", s->id);
if (r < 0)
return log_error_errno(r, "Failed to deserialize leader PID for session '%s': %m", s->id);
if (pidref.fd < 0)
@ -437,9 +439,9 @@ static int session_load_leader(Session *s, uint64_t pidfdid) {
pidref.pid);
if (pidref.fd_id != pidfdid)
return log_error_errno(SYNTHETIC_ERRNO(ESRCH),
"Deserialized pidfd id for process " PID_FMT " (%" PRIu64 ") doesn't match with the current one (%" PRIu64 "), refusing.",
pidref.pid, pidfdid, pidref.fd_id);
return log_warning_errno(SYNTHETIC_ERRNO(ESRCH),
"Deserialized pidfd id for process " PID_FMT " (%" PRIu64 ") doesn't match the current one (%" PRIu64 "). PID recycled while deserializing?",
pidref.pid, pidfdid, pidref.fd_id);
}
r = session_set_leader_consume(s, TAKE_PIDREF(pidref));

View File

@ -441,13 +441,13 @@ static int deliver_session_device_fd(Session *s, const char *fdname, int fd, dev
return 0;
}
static int deliver_session_leader_fd_consume(Session *s, const char *fdname, int fd) {
static int deliver_session_leader_fd_consume(Session *s, const char *fdname, int fd_consume) {
_cleanup_close_ int fd = ASSERT_FD(fd_consume);
_cleanup_(pidref_done) PidRef leader_fdstore = PIDREF_NULL;
int r;
assert(s);
assert(fdname);
assert(fd >= 0);
/* Already deserialized via pidfd id? */
if (pidref_is_set(&s->leader)) {
@ -473,12 +473,13 @@ static int deliver_session_leader_fd_consume(Session *s, const char *fdname, int
r = pidref_set_pidfd_take(&leader_fdstore, fd);
if (r < 0) {
if (r == -ESRCH)
log_debug_errno(r, "Leader of session '%s' is gone while deserializing.", s->id);
else
log_warning_errno(r, "Failed to create reference to leader of session '%s': %m", s->id);
log_warning_errno(r,
r == -ESRCH ? "Leader of session '%s' is gone while deserializing."
: "Failed to create reference to leader of session '%s': %m",
s->id);
goto fail_close;
}
TAKE_FD(fd);
if (leader_fdstore.pid != s->deserialized_pid)
log_warning("Leader from pidfd (" PID_FMT ") doesn't match with LEADER=" PID_FMT " for session '%s', proceeding anyway.",
@ -491,7 +492,7 @@ static int deliver_session_leader_fd_consume(Session *s, const char *fdname, int
return 0;
fail_close:
close_and_notify_warn(fd, fdname);
close_and_notify_warn(TAKE_FD(fd), fdname);
return r;
}
@ -565,7 +566,7 @@ static int manager_enumerate_sessions(Manager *m) {
session_add_to_gc_queue(s);
k = session_load(s);
if (k < 0)
if (k < 0 && k != -ESRCH)
RET_GATHER(r, log_warning_errno(k, "Failed to deserialize session '%s', ignoring: %m", s->id));
}

View File

@ -259,8 +259,16 @@ static int reread_partition_table_full(sd_device *dev, int fd, RereadPartitionTa
if (lock_fd < 0)
return log_device_debug_errno(dev, lock_fd, "Failed top open lock fd for block device '%s': %m", p);
if (flock(lock_fd, LOCK_EX|LOCK_NB) < 0)
return log_device_debug_errno(dev, errno, "Failed to take BSD lock on block device '%s': %m", p);
if (flock(lock_fd, LOCK_EX|LOCK_NB) < 0) {
r = log_device_debug_errno(dev, errno, "Failed to take BSD lock on block device '%s': %m", p);
if (r == -EBUSY && FLAGS_SET(flags, REREADPT_FORCE_UEVENT)) {
log_device_debug(dev, "Giving up rereading partition table of '%s'. Triggering change events for the device and its partitions.", p);
(void) trigger_partitions(dev, /* blkrrpart_success= */ false);
}
return r;
}
}
r = blockdev_partscan_enabled(dev);