forked from pool/systemd
Accepting request 127017 from home:fcrozat:branches:Base:System
- Add fix-dir-noatime-tmpfiles.patch: do not modify directory atime, which was preventing removing empty directories (bnc#751253, rh#810257). - Add improve-restart-behaviour.patch: prevent deadlock during try-restart (bnc#743218). - Add journal-bugfixes.patch: don't crash when rotating journal (bnc#768953) and prevent memleak at rotation time too. - Add ulimit-support.patch: add support for system wide ulimit (bnc#744818). - Add change-terminal.patch: use vt102 instead of vt100 as terminal for non-vc tty. - Package various .wants directories, which were no longer packaged due to plymouth units being removed from systemd package. - Fix buildrequires for manpages build. OBS-URL: https://build.opensuse.org/request/show/127017 OBS-URL: https://build.opensuse.org/package/show/Base:System/systemd?expand=0&rev=284
This commit is contained in:
parent
a8b28b94ac
commit
bd156cfcf6
37
change-terminal.patch
Normal file
37
change-terminal.patch
Normal file
@ -0,0 +1,37 @@
|
||||
From 1505a61772a6e697f2aabdbb0e827a88b0d7ee6b Mon Sep 17 00:00:00 2001
|
||||
From: Lennart Poettering <lennart@poettering.net>
|
||||
Date: Sun, 22 Apr 2012 02:45:39 +0200
|
||||
Subject: [PATCH] default to v102 everywhere, instead of vt100, to synchronize
|
||||
with agetty
|
||||
|
||||
---
|
||||
src/util.c | 2 +-
|
||||
units/serial-getty@.service.m4 | 2 +-
|
||||
2 files changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
Index: systemd-44/src/util.c
|
||||
===================================================================
|
||||
--- systemd-44.orig/src/util.c
|
||||
+++ systemd-44/src/util.c
|
||||
@@ -4425,7 +4425,7 @@ bool tty_is_vc_resolve(const char *tty)
|
||||
const char *default_term_for_tty(const char *tty) {
|
||||
assert(tty);
|
||||
|
||||
- return tty_is_vc_resolve(tty) ? "TERM=linux" : "TERM=vt100";
|
||||
+ return tty_is_vc_resolve(tty) ? "TERM=linux" : "TERM=vt102";
|
||||
}
|
||||
|
||||
bool dirent_is_file(const struct dirent *de) {
|
||||
Index: systemd-44/units/serial-getty@.service.m4
|
||||
===================================================================
|
||||
--- systemd-44.orig/units/serial-getty@.service.m4
|
||||
+++ systemd-44/units/serial-getty@.service.m4
|
||||
@@ -35,7 +35,7 @@ Before=getty.target
|
||||
IgnoreOnIsolate=yes
|
||||
|
||||
[Service]
|
||||
-Environment=TERM=vt100
|
||||
+Environment=TERM=vt102
|
||||
ExecStart=-/sbin/agetty -s %I 115200,38400,9600
|
||||
Restart=always
|
||||
RestartSec=0
|
41
fix-dir-noatime-tmpfiles.patch
Normal file
41
fix-dir-noatime-tmpfiles.patch
Normal file
@ -0,0 +1,41 @@
|
||||
From de49f6dd99aca059da24c9afc672782f1768abd2 Mon Sep 17 00:00:00 2001
|
||||
From: Kay Sievers <kay@vrfy.org>
|
||||
Date: Wed, 11 Apr 2012 21:33:12 +0200
|
||||
Subject: [PATCH] tmpfiles: open directories with O_NOATIME to preserve
|
||||
timestamp
|
||||
|
||||
Before:
|
||||
# stat /tmp/pulse-Du5ectm60QYM | grep 'Access: 20'
|
||||
Access: 2012-04-11 21:32:48.444920237 +0200
|
||||
# systemd-tmpfiles --clean
|
||||
# stat /tmp/pulse-Du5ectm60QYM | grep 'Access: 20'
|
||||
Access: 2012-04-11 21:36:27.628925459 +0200
|
||||
|
||||
After:
|
||||
# stat /tmp/pulse-Du5ectm60QYM | grep 'Access: 20'
|
||||
Access: 2012-04-11 21:32:48.444920237 +0200
|
||||
# ./systemd-tmpfiles --clean
|
||||
# stat /tmp/pulse-Du5ectm60QYM | grep 'Access: 20'
|
||||
Access: 2012-04-11 21:32:48.444920237 +0200
|
||||
|
||||
Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=810257
|
||||
---
|
||||
src/tmpfiles.c | 2 +-
|
||||
1 files changed, 1 insertions(+), 1 deletions(-)
|
||||
|
||||
diff --git a/src/tmpfiles.c b/src/tmpfiles.c
|
||||
index 21bf44d..09eefcf 100644
|
||||
--- a/src/tmpfiles.c
|
||||
+++ b/src/tmpfiles.c
|
||||
@@ -250,7 +250,7 @@ static int dir_cleanup(
|
||||
DIR *sub_dir;
|
||||
int q;
|
||||
|
||||
- sub_dir = xopendirat(dirfd(d), dent->d_name, O_NOFOLLOW);
|
||||
+ sub_dir = xopendirat(dirfd(d), dent->d_name, O_NOFOLLOW|O_NOATIME);
|
||||
if (sub_dir == NULL) {
|
||||
if (errno != ENOENT) {
|
||||
log_error("opendir(%s/%s) failed: %m", p, dent->d_name);
|
||||
--
|
||||
1.7.7
|
||||
|
7661
improve-restart-behaviour.patch
Normal file
7661
improve-restart-behaviour.patch
Normal file
File diff suppressed because it is too large
Load Diff
186
journal-bugfixes.patch
Normal file
186
journal-bugfixes.patch
Normal file
@ -0,0 +1,186 @@
|
||||
From 911efc97f9bfe2ad4f4d021f5e76d05c8d5d81ac Mon Sep 17 00:00:00 2001
|
||||
From: Lennart Poettering <lennart@poettering.net>
|
||||
Date: Thu, 12 Apr 2012 12:57:41 +0200
|
||||
Subject: [PATCH 1/4] journald: add missing flag to open()
|
||||
|
||||
---
|
||||
src/journal/journald.c | 2 +-
|
||||
1 files changed, 1 insertions(+), 1 deletions(-)
|
||||
|
||||
diff --git a/src/journal/journald.c b/src/journal/journald.c
|
||||
index baad3ab..c8b400a 100644
|
||||
--- a/src/journal/journald.c
|
||||
+++ b/src/journal/journald.c
|
||||
@@ -2461,7 +2461,7 @@ static int open_proc_kmsg(Server *s) {
|
||||
return 0;
|
||||
|
||||
|
||||
- s->proc_kmsg_fd = open("/proc/kmsg", O_CLOEXEC|O_NONBLOCK|O_NOCTTY);
|
||||
+ s->proc_kmsg_fd = open("/proc/kmsg", O_RDONLY|O_CLOEXEC|O_NONBLOCK|O_NOCTTY);
|
||||
if (s->proc_kmsg_fd < 0) {
|
||||
log_warning("Failed to open /proc/kmsg, ignoring: %m");
|
||||
return 0;
|
||||
--
|
||||
1.7.7
|
||||
|
||||
|
||||
From 94b8299358fd743137857bc0f28ab62bcf6eec92 Mon Sep 17 00:00:00 2001
|
||||
From: Lennart Poettering <lennart@poettering.net>
|
||||
Date: Fri, 13 Apr 2012 13:58:50 +0200
|
||||
Subject: [PATCH 2/4] fix a couple of things found with the llvm static
|
||||
analyzer
|
||||
|
||||
---
|
||||
src/journal/journal-file.c | 2 +-
|
||||
src/journal/journald.c | 2 +-
|
||||
src/logs-show.c | 2 +-
|
||||
src/manager.c | 2 +-
|
||||
4 files changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/src/journal/journal-file.c b/src/journal/journal-file.c
|
||||
index 474dd5c..5255c3b 100644
|
||||
--- a/src/journal/journal-file.c
|
||||
+++ b/src/journal/journal-file.c
|
||||
@@ -1974,7 +1974,7 @@ int journal_directory_vacuum(const char *directory, uint64_t max_use, uint64_t m
|
||||
size_t q;
|
||||
struct stat st;
|
||||
char *p;
|
||||
- unsigned long long seqnum, realtime;
|
||||
+ unsigned long long seqnum = 0, realtime;
|
||||
sd_id128_t seqnum_id;
|
||||
bool have_seqnum;
|
||||
|
||||
diff --git a/src/journal/journald.c b/src/journal/journald.c
|
||||
index c8b400a..1118b7e 100644
|
||||
--- a/src/journal/journald.c
|
||||
+++ b/src/journal/journald.c
|
||||
@@ -1140,7 +1140,7 @@ static void process_native_message(
|
||||
char *identifier = NULL, *message = NULL;
|
||||
|
||||
assert(s);
|
||||
- assert(buffer || n == 0);
|
||||
+ assert(buffer || buffer_size == 0);
|
||||
|
||||
p = buffer;
|
||||
remaining = buffer_size;
|
||||
diff --git a/src/logs-show.c b/src/logs-show.c
|
||||
index f71c6b0..eb9a902 100644
|
||||
--- a/src/logs-show.c
|
||||
+++ b/src/logs-show.c
|
||||
@@ -541,7 +541,7 @@ int show_journal_by_unit(
|
||||
bool follow) {
|
||||
|
||||
char *m = NULL;
|
||||
- sd_journal *j;
|
||||
+ sd_journal *j = NULL;
|
||||
int r;
|
||||
int fd;
|
||||
unsigned line = 0;
|
||||
diff --git a/src/manager.c b/src/manager.c
|
||||
index 74bd740..3e592b6 100644
|
||||
--- a/src/manager.c
|
||||
+++ b/src/manager.c
|
||||
@@ -2979,7 +2979,7 @@ bool manager_unit_pending_inactive(Manager *m, const char *name) {
|
||||
|
||||
void manager_check_finished(Manager *m) {
|
||||
char userspace[FORMAT_TIMESPAN_MAX], initrd[FORMAT_TIMESPAN_MAX], kernel[FORMAT_TIMESPAN_MAX], sum[FORMAT_TIMESPAN_MAX];
|
||||
- usec_t kernel_usec = 0, initrd_usec = 0, userspace_usec = 0, total_usec = 0;
|
||||
+ usec_t kernel_usec, initrd_usec, userspace_usec, total_usec;
|
||||
|
||||
assert(m);
|
||||
|
||||
--
|
||||
1.7.7
|
||||
|
||||
|
||||
From f83fa045b967478a80ca55477dfe6a5be5f0b4a8 Mon Sep 17 00:00:00 2001
|
||||
From: Sjoerd Simons <sjoerd@luon.net>
|
||||
Date: Sat, 14 Apr 2012 14:11:08 +0200
|
||||
Subject: [PATCH 3/4] journal: crash when filesystem is low on space
|
||||
|
||||
When space is getting too low on a file system rotating the journal file
|
||||
will fail after the rotation, as opening the new logfile will fail.
|
||||
|
||||
Recognize this when logging the error and don't try to dereference a
|
||||
NULL JournalFile pointer.
|
||||
---
|
||||
src/journal/journald.c | 16 +++++++++++++---
|
||||
1 files changed, 13 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/src/journal/journald.c b/src/journal/journald.c
|
||||
index 1118b7e..9180656 100644
|
||||
--- a/src/journal/journald.c
|
||||
+++ b/src/journal/journald.c
|
||||
@@ -330,7 +330,10 @@ static void server_rotate(Server *s) {
|
||||
if (s->runtime_journal) {
|
||||
r = journal_file_rotate(&s->runtime_journal);
|
||||
if (r < 0)
|
||||
- log_error("Failed to rotate %s: %s", s->runtime_journal->path, strerror(-r));
|
||||
+ if (s->runtime_journal)
|
||||
+ log_error("Failed to rotate %s: %s", s->runtime_journal->path, strerror(-r));
|
||||
+ else
|
||||
+ log_error("Failed to create new runtime journal: %s", strerror(-r));
|
||||
else
|
||||
server_fix_perms(s, s->runtime_journal, 0);
|
||||
}
|
||||
@@ -338,7 +341,11 @@ static void server_rotate(Server *s) {
|
||||
if (s->system_journal) {
|
||||
r = journal_file_rotate(&s->system_journal);
|
||||
if (r < 0)
|
||||
- log_error("Failed to rotate %s: %s", s->system_journal->path, strerror(-r));
|
||||
+ if (s->system_journal)
|
||||
+ log_error("Failed to rotate %s: %s", s->system_journal->path, strerror(-r));
|
||||
+ else
|
||||
+ log_error("Failed to create new system journal: %s", strerror(-r));
|
||||
+
|
||||
else
|
||||
server_fix_perms(s, s->system_journal, 0);
|
||||
}
|
||||
@@ -346,7 +353,10 @@ static void server_rotate(Server *s) {
|
||||
HASHMAP_FOREACH_KEY(f, k, s->user_journals, i) {
|
||||
r = journal_file_rotate(&f);
|
||||
if (r < 0)
|
||||
- log_error("Failed to rotate %s: %s", f->path, strerror(-r));
|
||||
+ if (f->path)
|
||||
+ log_error("Failed to rotate %s: %s", f->path, strerror(-r));
|
||||
+ else
|
||||
+ log_error("Failed to create user journal: %s", strerror(-r));
|
||||
else {
|
||||
hashmap_replace(s->user_journals, k, f);
|
||||
server_fix_perms(s, s->system_journal, PTR_TO_UINT32(k));
|
||||
--
|
||||
1.7.7
|
||||
|
||||
|
||||
From d80e2f5c26aae25c0773042bcd1599d3c583bf6a Mon Sep 17 00:00:00 2001
|
||||
From: Michal Schmidt <mschmidt@redhat.com>
|
||||
Date: Tue, 12 Jun 2012 16:45:09 +0200
|
||||
Subject: [PATCH 4/4] journal-file: fix mmap leak
|
||||
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=831132
|
||||
---
|
||||
src/journal/journal-file.c | 7 +++++--
|
||||
1 files changed, 5 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/src/journal/journal-file.c b/src/journal/journal-file.c
|
||||
index 5255c3b..e242fa2 100644
|
||||
--- a/src/journal/journal-file.c
|
||||
+++ b/src/journal/journal-file.c
|
||||
@@ -67,9 +67,12 @@ void journal_file_close(JournalFile *f) {
|
||||
|
||||
assert(f);
|
||||
|
||||
- if (f->header && f->writable)
|
||||
- f->header->state = STATE_OFFLINE;
|
||||
+ if (f->header) {
|
||||
+ if (f->writable)
|
||||
+ f->header->state = STATE_OFFLINE;
|
||||
|
||||
+ munmap(f->header, PAGE_ALIGN(sizeof(Header)));
|
||||
+ }
|
||||
|
||||
for (t = 0; t < _WINDOW_MAX; t++)
|
||||
if (f->windows[t].ptr)
|
||||
--
|
||||
1.7.7
|
||||
|
@ -1,3 +1,21 @@
|
||||
-------------------------------------------------------------------
|
||||
Tue Jul 3 17:58:39 CEST 2012 - fcrozat@suse.com
|
||||
|
||||
- Add fix-dir-noatime-tmpfiles.patch: do not modify directory
|
||||
atime, which was preventing removing empty directories
|
||||
(bnc#751253, rh#810257).
|
||||
- Add improve-restart-behaviour.patch: prevent deadlock during
|
||||
try-restart (bnc#743218).
|
||||
- Add journal-bugfixes.patch: don't crash when rotating journal
|
||||
(bnc#768953) and prevent memleak at rotation time too.
|
||||
- Add ulimit-support.patch: add support for system wide ulimit
|
||||
(bnc#744818).
|
||||
- Add change-terminal.patch: use vt102 instead of vt100 as terminal
|
||||
for non-vc tty.
|
||||
- Package various .wants directories, which were no longer packaged
|
||||
due to plymouth units being removed from systemd package.
|
||||
- Fix buildrequires for manpages build.
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Mon Jul 2 15:44:28 UTC 2012 - fcrozat@suse.com
|
||||
|
||||
|
19
systemd.spec
19
systemd.spec
@ -35,7 +35,7 @@ BuildRequires: intltool
|
||||
BuildRequires: libacl-devel
|
||||
BuildRequires: libcap-devel
|
||||
BuildRequires: libtool
|
||||
BuildRequires: libxslt1
|
||||
BuildRequires: libxslt-tools
|
||||
BuildRequires: pam-devel
|
||||
BuildRequires: pkg-config
|
||||
BuildRequires: tcpd-devel
|
||||
@ -93,6 +93,11 @@ Patch42: fixppc.patch
|
||||
Patch43: logind-logout.patch
|
||||
Patch44: fix-getty-isolate.patch
|
||||
Patch45: fix-swap-priority.patch
|
||||
Patch46: improve-restart-behaviour.patch
|
||||
Patch47: fix-dir-noatime-tmpfiles.patch
|
||||
Patch48: journal-bugfixes.patch
|
||||
Patch49: ulimit-support.patch
|
||||
Patch50: change-terminal.patch
|
||||
|
||||
%description
|
||||
Systemd is a system and service manager, compatible with SysV and LSB
|
||||
@ -148,6 +153,14 @@ Drop-in replacement of System V init tools.
|
||||
%patch43 -p1
|
||||
%patch44 -p1
|
||||
%patch45 -p1
|
||||
%patch46 -p1
|
||||
%patch47 -p1
|
||||
%patch48 -p1
|
||||
%patch49 -p1
|
||||
%patch50 -p1
|
||||
|
||||
#needed by patch49
|
||||
rm man/systemd.conf.5
|
||||
|
||||
%build
|
||||
autoreconf -fiv
|
||||
@ -163,6 +176,7 @@ export V=1
|
||||
--with-pamlibdir=/%{_lib}/security \
|
||||
--enable-split-usr \
|
||||
--disable-gtk \
|
||||
--enable-manpages \
|
||||
--disable-plymouth \
|
||||
CFLAGS="%{optflags}"
|
||||
make %{?_smp_mflags}
|
||||
@ -178,7 +192,8 @@ chmod 644 %{buildroot}%{_bindir}/systemd-analyze
|
||||
mkdir -p %{buildroot}%{_sysconfdir}/rpm
|
||||
install -m644 %{S:4} %{buildroot}%{_sysconfdir}/rpm
|
||||
find %{buildroot} -type f -name '*.la' -exec rm -f {} ';'
|
||||
mkdir -p %{buildroot}/{sbin,var/lib/systemd/sysv-convert,var/lib/systemd/migrated} %{buildroot}/lib/systemd/{system.preset,user.preset}
|
||||
mkdir -p %{buildroot}/{sbin,var/lib/systemd/sysv-convert,var/lib/systemd/migrated} %{buildroot}/lib/systemd/{system.preset,user.preset,system/halt.target.wants,system/kexec.target.wants,system/poweroff.target.wants,system/reboot.target.wants}
|
||||
|
||||
install -m755 %{S:3} -D %{buildroot}%{_sbindir}/systemd-sysv-convert
|
||||
# do not install, code has been fixed, might be useful in the future
|
||||
#install -m755 %{S:5} %{buildroot}/lib/systemd/system-generators
|
||||
|
253
ulimit-support.patch
Normal file
253
ulimit-support.patch
Normal file
@ -0,0 +1,253 @@
|
||||
From 03854532d39613723dc8b85c424737ecf2e46f74 Mon Sep 17 00:00:00 2001
|
||||
From: Lennart Poettering <lennart@poettering.net>
|
||||
Date: Mon, 16 Apr 2012 18:54:45 +0200
|
||||
Subject: [PATCH 1/3] util: introduce memdup()
|
||||
|
||||
---
|
||||
src/util.h | 2 ++
|
||||
1 files changed, 2 insertions(+), 0 deletions(-)
|
||||
|
||||
diff --git a/src/util.h b/src/util.h
|
||||
index b1af6db..06c9933 100644
|
||||
--- a/src/util.h
|
||||
+++ b/src/util.h
|
||||
@@ -99,6 +99,8 @@ bool streq_ptr(const char *a, const char *b);
|
||||
|
||||
#define new0(t, n) ((t*) calloc((n), sizeof(t)))
|
||||
|
||||
+#define newdup(t, p, n) ((t*) memdup(p, sizeof(t)*(n))
|
||||
+
|
||||
#define malloc0(n) (calloc((n), 1))
|
||||
|
||||
static inline const char* yes_no(bool b) {
|
||||
--
|
||||
1.7.7
|
||||
|
||||
|
||||
From f60b5d436f502152415b08758737f200113ce4bc Mon Sep 17 00:00:00 2001
|
||||
From: Frederic Crozat <fcrozat@suse.com>
|
||||
Date: Mon, 21 May 2012 16:53:18 +0200
|
||||
Subject: [PATCH 2/3] util: fix typo in newdup
|
||||
|
||||
Conflicts:
|
||||
|
||||
src/util.h
|
||||
---
|
||||
src/util.h | 2 +-
|
||||
1 files changed, 1 insertions(+), 1 deletions(-)
|
||||
|
||||
diff --git a/src/util.h b/src/util.h
|
||||
index 06c9933..41b4c9f 100644
|
||||
--- a/src/util.h
|
||||
+++ b/src/util.h
|
||||
@@ -99,7 +99,7 @@ bool streq_ptr(const char *a, const char *b);
|
||||
|
||||
#define new0(t, n) ((t*) calloc((n), sizeof(t)))
|
||||
|
||||
-#define newdup(t, p, n) ((t*) memdup(p, sizeof(t)*(n))
|
||||
+#define newdup(t, p, n) ((t*) memdup(p, sizeof(t)*(n)))
|
||||
|
||||
#define malloc0(n) (calloc((n), 1))
|
||||
|
||||
--
|
||||
1.7.7
|
||||
|
||||
|
||||
From 8e7fa2b3e68b691c522cf2b60ed920452c146c2e Mon Sep 17 00:00:00 2001
|
||||
From: Frederic Crozat <fcrozat@suse.com>
|
||||
Date: Wed, 27 Jun 2012 14:12:44 +0200
|
||||
Subject: [PATCH 3/3] main: allow system wide limits for services
|
||||
|
||||
---
|
||||
man/systemd.conf.xml | 27 +++++++++++++++++++++++++++
|
||||
src/main.c | 22 ++++++++++++++++++++++
|
||||
src/manager.c | 22 ++++++++++++++++++++++
|
||||
src/manager.h | 3 +++
|
||||
src/service.c | 4 ++++
|
||||
5 files changed, 78 insertions(+), 0 deletions(-)
|
||||
|
||||
diff --git a/man/systemd.conf.xml b/man/systemd.conf.xml
|
||||
index ba144da..ee461e3 100644
|
||||
--- a/man/systemd.conf.xml
|
||||
+++ b/man/systemd.conf.xml
|
||||
@@ -149,6 +149,33 @@
|
||||
controllers in separate
|
||||
hierarchies.</para></listitem>
|
||||
</varlistentry>
|
||||
+
|
||||
+ <varlistentry>
|
||||
+ <term><varname>DefaultLimitCPU=</varname></term>
|
||||
+ <term><varname>DefaultLimitFSIZE=</varname></term>
|
||||
+ <term><varname>DefaultLimitDATA=</varname></term>
|
||||
+ <term><varname>DefaultLimitSTACK=</varname></term>
|
||||
+ <term><varname>DefaultLimitCORE=</varname></term>
|
||||
+ <term><varname>DefaultLimitRSS=</varname></term>
|
||||
+ <term><varname>DefaultLimitNOFILE=</varname></term>
|
||||
+ <term><varname>DefaultLimitAS=</varname></term>
|
||||
+ <term><varname>DefaultLimitNPROC=</varname></term>
|
||||
+ <term><varname>DefaultLimitMEMLOCK=</varname></term>
|
||||
+ <term><varname>DefaultLimitLOCKS=</varname></term>
|
||||
+ <term><varname>DefaultLimitSIGPENDING=</varname></term>
|
||||
+ <term><varname>DefaultLimitMSGQUEUE=</varname></term>
|
||||
+ <term><varname>DefaultLimitNICE=</varname></term>
|
||||
+ <term><varname>DefaultLimitRTPRIO=</varname></term>
|
||||
+ <term><varname>DefaultLimitRTTIME=</varname></term>
|
||||
+ <listitem><para>These settings control
|
||||
+ various default resource limits for units. See
|
||||
+ <citerefentry><refentrytitle>setrlimit</refentrytitle><manvolnum>2</manvolnum></citerefentry>
|
||||
+ for details. Use the string
|
||||
+ <varname>infinity</varname> to
|
||||
+ configure no limit on a specific
|
||||
+ resource. They can be overriden in units files
|
||||
+ using corresponding LimitXXXX parameter.</para></listitem>
|
||||
+ </varlistentry>
|
||||
</variablelist>
|
||||
</refsect1>
|
||||
|
||||
diff --git a/src/main.c b/src/main.c
|
||||
index ed317b4..3f5f3d7 100644
|
||||
--- a/src/main.c
|
||||
+++ b/src/main.c
|
||||
@@ -79,6 +79,7 @@ static char **arg_default_controllers = NULL;
|
||||
static char ***arg_join_controllers = NULL;
|
||||
static ExecOutput arg_default_std_output = EXEC_OUTPUT_JOURNAL;
|
||||
static ExecOutput arg_default_std_error = EXEC_OUTPUT_INHERIT;
|
||||
+static struct rlimit *arg_default_rlimit[RLIMIT_NLIMITS] = {};
|
||||
|
||||
static FILE* serialization = NULL;
|
||||
|
||||
@@ -659,6 +660,22 @@ static int parse_config_file(void) {
|
||||
{ "Manager", "DefaultStandardOutput", config_parse_output, 0, &arg_default_std_output },
|
||||
{ "Manager", "DefaultStandardError", config_parse_output, 0, &arg_default_std_error },
|
||||
{ "Manager", "JoinControllers", config_parse_join_controllers, 0, &arg_join_controllers },
|
||||
+ { "Manager", "DefaultLimitCPU", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_CPU]},
|
||||
+ { "Manager", "DefaultLimitFSIZE", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_FSIZE]},
|
||||
+ { "Manager", "DefaultLimitDATA", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_DATA]},
|
||||
+ { "Manager", "DefaultLimitSTACK", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_STACK]},
|
||||
+ { "Manager", "DefaultLimitCORE", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_CORE]},
|
||||
+ { "Manager", "DefaultLimitRSS", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_RSS]},
|
||||
+ { "Manager", "DefaultLimitNOFILE", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_NOFILE]},
|
||||
+ { "Manager", "DefaultLimitAS", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_AS]},
|
||||
+ { "Manager", "DefaultLimitNPROC", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_NPROC]},
|
||||
+ { "Manager", "DefaultLimitMEMLOCK", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_MEMLOCK]},
|
||||
+ { "Manager", "DefaultLimitLOCKS", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_LOCKS]},
|
||||
+ { "Manager", "DefaultLimitSIGPENDING",config_parse_limit, 0, &arg_default_rlimit[RLIMIT_SIGPENDING]},
|
||||
+ { "Manager", "DefaultLimitMSGQUEUE", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_MSGQUEUE]},
|
||||
+ { "Manager", "DefaultLimitNICE", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_NICE]},
|
||||
+ { "Manager", "DefaultLimitRTPRIO", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_RTPRIO]},
|
||||
+ { "Manager", "DefaultLimitRTTIME", config_parse_limit, 0, &arg_default_rlimit[RLIMIT_RTTIME]},
|
||||
{ NULL, NULL, NULL, 0, NULL }
|
||||
};
|
||||
|
||||
@@ -1401,6 +1418,8 @@ int main(int argc, char *argv[]) {
|
||||
m->default_std_output = arg_default_std_output;
|
||||
m->default_std_error = arg_default_std_error;
|
||||
|
||||
+ manager_set_default_rlimits(m, arg_default_rlimit);
|
||||
+
|
||||
if (dual_timestamp_is_set(&initrd_timestamp))
|
||||
m->initrd_timestamp = initrd_timestamp;
|
||||
|
||||
@@ -1539,6 +1558,9 @@ finish:
|
||||
if (m)
|
||||
manager_free(m);
|
||||
|
||||
+ for (j = 0; j < RLIMIT_NLIMITS; j++)
|
||||
+ free (arg_default_rlimit[j]);
|
||||
+
|
||||
free(arg_default_unit);
|
||||
strv_free(arg_default_controllers);
|
||||
free_join_controllers();
|
||||
diff --git a/src/manager.c b/src/manager.c
|
||||
index 3e592b6..c6cd06c 100644
|
||||
--- a/src/manager.c
|
||||
+++ b/src/manager.c
|
||||
@@ -456,6 +456,7 @@ static void manager_clear_jobs_and_units(Manager *m) {
|
||||
|
||||
void manager_free(Manager *m) {
|
||||
UnitType c;
|
||||
+ int i;
|
||||
|
||||
assert(m);
|
||||
|
||||
@@ -501,6 +502,9 @@ void manager_free(Manager *m) {
|
||||
hashmap_free(m->cgroup_bondings);
|
||||
set_free_free(m->unit_path_cache);
|
||||
|
||||
+ for (i = 0; i < RLIMIT_NLIMITS; i++)
|
||||
+ free(m->rlimit[i]);
|
||||
+
|
||||
free(m);
|
||||
}
|
||||
|
||||
@@ -3137,6 +3141,24 @@ int manager_set_default_controllers(Manager *m, char **controllers) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
+int manager_set_default_rlimits(Manager *m, struct rlimit **default_rlimit) {
|
||||
+ int i;
|
||||
+
|
||||
+ assert(m);
|
||||
+
|
||||
+ for (i = 0; i < RLIMIT_NLIMITS; i++) {
|
||||
+ if (default_rlimit[i]) {
|
||||
+ m->rlimit[i] = newdup(struct rlimit, default_rlimit[i], 1);
|
||||
+
|
||||
+ if (!m->rlimit[i])
|
||||
+ return -ENOMEM;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+
|
||||
void manager_recheck_journal(Manager *m) {
|
||||
Unit *u;
|
||||
|
||||
diff --git a/src/manager.h b/src/manager.h
|
||||
index a9d08f0..5f5de8e 100644
|
||||
--- a/src/manager.h
|
||||
+++ b/src/manager.h
|
||||
@@ -225,6 +225,8 @@ struct Manager {
|
||||
|
||||
ExecOutput default_std_output, default_std_error;
|
||||
|
||||
+ struct rlimit *rlimit[RLIMIT_NLIMITS];
|
||||
+
|
||||
/* non-zero if we are reloading or reexecuting, */
|
||||
int n_reloading;
|
||||
|
||||
@@ -263,6 +265,7 @@ unsigned manager_dispatch_run_queue(Manager *m);
|
||||
unsigned manager_dispatch_dbus_queue(Manager *m);
|
||||
|
||||
int manager_set_default_controllers(Manager *m, char **controllers);
|
||||
+int manager_set_default_rlimits(Manager *m, struct rlimit **default_rlimit);
|
||||
|
||||
int manager_loop(Manager *m);
|
||||
|
||||
diff --git a/src/service.c b/src/service.c
|
||||
index 8b5c0b0..892392d 100644
|
||||
--- a/src/service.c
|
||||
+++ b/src/service.c
|
||||
@@ -109,6 +109,7 @@ static const UnitActiveState state_translation_table[_SERVICE_STATE_MAX] = {
|
||||
|
||||
static void service_init(Unit *u) {
|
||||
Service *s = SERVICE(u);
|
||||
+ int i;
|
||||
|
||||
assert(u);
|
||||
assert(u->load_state == UNIT_STUB);
|
||||
@@ -127,6 +128,9 @@ static void service_init(Unit *u) {
|
||||
s->guess_main_pid = true;
|
||||
|
||||
exec_context_init(&s->exec_context);
|
||||
+ for (i = 0; i < RLIMIT_NLIMITS; i++)
|
||||
+ if (UNIT(s)->manager->rlimit[i])
|
||||
+ s->exec_context.rlimit[i] = newdup(struct rlimit, UNIT(s)->manager->rlimit[i], 1);
|
||||
|
||||
RATELIMIT_INIT(s->start_limit, 10*USEC_PER_SEC, 5);
|
||||
|
||||
--
|
||||
1.7.7
|
||||
|
Loading…
Reference in New Issue
Block a user