diff --git a/src/basic/rlimit-util.c b/src/basic/rlimit-util.c index 1cf64d9cdd..259553b6f6 100644 --- a/src/basic/rlimit-util.c +++ b/src/basic/rlimit-util.c @@ -395,7 +395,11 @@ int rlimit_nofile_safe(void) { if (rl.rlim_cur <= FD_SETSIZE) return 0; - rl.rlim_cur = FD_SETSIZE; + /* So we might have inherited a hard limit that's larger than the kernel's maximum limit as stored in + * /proc/sys/fs/nr_open. If we pass this hard limit unmodified to setrlimit(), we'll get EPERM. To + * make sure that doesn't happen, let's limit our hard limit to the value from nr_open. */ + rl.rlim_max = MIN(rl.rlim_max, (rlim_t) read_nr_open()); + rl.rlim_cur = MIN((rlim_t) FD_SETSIZE, rl.rlim_max); if (setrlimit(RLIMIT_NOFILE, &rl) < 0) return log_debug_errno(errno, "Failed to lower RLIMIT_NOFILE's soft limit to " RLIM_FMT ": %m", rl.rlim_cur); diff --git a/src/shared/mkfs-util.c b/src/shared/mkfs-util.c index b936a4733f..6fb0e2a165 100644 --- a/src/shared/mkfs-util.c +++ b/src/shared/mkfs-util.c @@ -603,7 +603,7 @@ int make_filesystem( /*except_fds=*/ NULL, /*n_except_fds=*/ 0, FORK_RESET_SIGNALS|FORK_RLIMIT_NOFILE_SAFE|FORK_DEATHSIG|FORK_LOG|FORK_WAIT| - FORK_CLOSE_ALL_FDS|FORK_REARRANGE_STDIO|FORK_NEW_MOUNTNS, + FORK_CLOSE_ALL_FDS|FORK_REARRANGE_STDIO|FORK_NEW_MOUNTNS|FORK_REOPEN_LOG, /*ret_pid=*/ NULL); if (r < 0) return r;