mirror of
https://github.com/systemd/systemd
synced 2025-11-14 22:34:46 +01:00
Compare commits
4 Commits
c3e80f8f2b
...
d8e38d4aaa
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d8e38d4aaa | ||
|
|
fe263e9302 | ||
|
|
a6590235df | ||
|
|
c54112bdee |
@ -423,6 +423,8 @@ static int session_load_leader(Session *s, uint64_t pidfdid) {
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
r = pidref_set_pid(&pidref, s->deserialized_pid);
|
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)
|
if (r < 0)
|
||||||
return log_error_errno(r, "Failed to deserialize leader PID for session '%s': %m", s->id);
|
return log_error_errno(r, "Failed to deserialize leader PID for session '%s': %m", s->id);
|
||||||
if (pidref.fd < 0)
|
if (pidref.fd < 0)
|
||||||
@ -437,8 +439,8 @@ static int session_load_leader(Session *s, uint64_t pidfdid) {
|
|||||||
pidref.pid);
|
pidref.pid);
|
||||||
|
|
||||||
if (pidref.fd_id != pidfdid)
|
if (pidref.fd_id != pidfdid)
|
||||||
return log_error_errno(SYNTHETIC_ERRNO(ESRCH),
|
return log_warning_errno(SYNTHETIC_ERRNO(ESRCH),
|
||||||
"Deserialized pidfd id for process " PID_FMT " (%" PRIu64 ") doesn't match with the current one (%" PRIu64 "), refusing.",
|
"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);
|
pidref.pid, pidfdid, pidref.fd_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -441,13 +441,13 @@ static int deliver_session_device_fd(Session *s, const char *fdname, int fd, dev
|
|||||||
return 0;
|
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;
|
_cleanup_(pidref_done) PidRef leader_fdstore = PIDREF_NULL;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
assert(s);
|
assert(s);
|
||||||
assert(fdname);
|
assert(fdname);
|
||||||
assert(fd >= 0);
|
|
||||||
|
|
||||||
/* Already deserialized via pidfd id? */
|
/* Already deserialized via pidfd id? */
|
||||||
if (pidref_is_set(&s->leader)) {
|
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);
|
r = pidref_set_pidfd_take(&leader_fdstore, fd);
|
||||||
if (r < 0) {
|
if (r < 0) {
|
||||||
if (r == -ESRCH)
|
log_warning_errno(r,
|
||||||
log_debug_errno(r, "Leader of session '%s' is gone while deserializing.", s->id);
|
r == -ESRCH ? "Leader of session '%s' is gone while deserializing."
|
||||||
else
|
: "Failed to create reference to leader of session '%s': %m",
|
||||||
log_warning_errno(r, "Failed to create reference to leader of session '%s': %m", s->id);
|
s->id);
|
||||||
goto fail_close;
|
goto fail_close;
|
||||||
}
|
}
|
||||||
|
TAKE_FD(fd);
|
||||||
|
|
||||||
if (leader_fdstore.pid != s->deserialized_pid)
|
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.",
|
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;
|
return 0;
|
||||||
|
|
||||||
fail_close:
|
fail_close:
|
||||||
close_and_notify_warn(fd, fdname);
|
close_and_notify_warn(TAKE_FD(fd), fdname);
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -565,7 +566,7 @@ static int manager_enumerate_sessions(Manager *m) {
|
|||||||
session_add_to_gc_queue(s);
|
session_add_to_gc_queue(s);
|
||||||
|
|
||||||
k = session_load(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));
|
RET_GATHER(r, log_warning_errno(k, "Failed to deserialize session '%s', ignoring: %m", s->id));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -259,8 +259,16 @@ static int reread_partition_table_full(sd_device *dev, int fd, RereadPartitionTa
|
|||||||
if (lock_fd < 0)
|
if (lock_fd < 0)
|
||||||
return log_device_debug_errno(dev, lock_fd, "Failed top open lock fd for block device '%s': %m", p);
|
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)
|
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);
|
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);
|
r = blockdev_partscan_enabled(dev);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user