[systemd/f16] socket tarpits and other fixes from upstream

Michal Schmidt michich at fedoraproject.org
Tue Mar 6 09:18:17 UTC 2012


commit a661dbaae228b47dade96fb5f7f38dd87ed4e495
Author: Michal Schmidt <mschmidt at redhat.com>
Date:   Tue Mar 6 10:16:27 2012 +0100

    socket tarpits and other fixes from upstream
    
      - avoid socket tarpits when the service keeps failing
      - get rid of awk, sed, grep in bash completion
      - and minor fixes

 0155-fix-sparse-warnings.patch                     |   94 ++++++++++++++++
 ...-the-socket-if-the-service-keeps-dying-on.patch |  101 +++++++++++++++++
 ...me-broken-failure-result-to-failed-perman.patch |   77 +++++++++++++
 0158-nspawn-be-less-cryptic-when-clone-fails.patch |   31 ++++++
 ...sh-completion-get-rid-of-awk-sed-and-grep.patch |  113 ++++++++++++++++++++
 ...ount-properly-check-return-for-mount_add_.patch |   25 +++++
 systemd.spec                                       |   15 +++-
 7 files changed, 455 insertions(+), 1 deletions(-)
---
diff --git a/0155-fix-sparse-warnings.patch b/0155-fix-sparse-warnings.patch
new file mode 100644
index 0000000..82bcf79
--- /dev/null
+++ b/0155-fix-sparse-warnings.patch
@@ -0,0 +1,94 @@
+From e425ad8c3800e126450f3fc8e49a357f674fc3eb Mon Sep 17 00:00:00 2001
+From: Frederic Crozat <fcrozat at suse.com>
+Date: Wed, 29 Feb 2012 14:42:49 +0100
+Subject: [PATCH] fix sparse warnings (cherry picked from commit
+ 6a39419fe4e4ab7beb2412b6a52b5fd513509452)
+
+Conflicts:
+
+	src/log.c
+---
+ src/getty-generator.c |    2 +-
+ src/hashmap.c         |    4 ++--
+ src/macro.h           |    1 +
+ src/mount.c           |    2 +-
+ src/util.c            |    4 ++--
+ 5 files changed, 7 insertions(+), 6 deletions(-)
+
+diff --git a/src/getty-generator.c b/src/getty-generator.c
+index 6b5b254..1bb0d34 100644
+--- a/src/getty-generator.c
++++ b/src/getty-generator.c
+@@ -28,7 +28,7 @@
+ #include "unit-name.h"
+ #include "virt.h"
+ 
+-const char *arg_dest = "/tmp";
++static const char *arg_dest = "/tmp";
+ 
+ static int add_symlink(const char *fservice, const char *tservice) {
+         char *from = NULL, *to = NULL;
+diff --git a/src/hashmap.c b/src/hashmap.c
+index 7ef8097..6928118 100644
+--- a/src/hashmap.c
++++ b/src/hashmap.c
+@@ -55,10 +55,10 @@ struct pool {
+         unsigned n_used;
+ };
+ 
+-struct pool *first_hashmap_pool = NULL;
++static struct pool *first_hashmap_pool = NULL;
+ static void *first_hashmap_tile = NULL;
+ 
+-struct pool *first_entry_pool = NULL;
++static struct pool *first_entry_pool = NULL;
+ static void *first_entry_tile = NULL;
+ 
+ static void* allocate_tile(struct pool **first_pool, void **first_tile, size_t tile_size) {
+diff --git a/src/macro.h b/src/macro.h
+index 3f30aa7..5515490 100644
+--- a/src/macro.h
++++ b/src/macro.h
+@@ -23,6 +23,7 @@
+ ***/
+ 
+ #include <assert.h>
++#include <sys/param.h>
+ #include <sys/types.h>
+ #include <sys/uio.h>
+ #include <inttypes.h>
+diff --git a/src/mount.c b/src/mount.c
+index 3dc14bb..8281082 100644
+--- a/src/mount.c
++++ b/src/mount.c
+@@ -271,7 +271,7 @@ static char* mount_test_option(const char *haystack, const char *needle) {
+          * struct mntent */
+ 
+         if (!haystack)
+-                return false;
++                return NULL;
+ 
+         zero(me);
+         me.mnt_opts = (char*) haystack;
+diff --git a/src/util.c b/src/util.c
+index 6065463..a488289 100644
+--- a/src/util.c
++++ b/src/util.c
+@@ -891,7 +891,7 @@ int load_env_file(
+                 char ***rl) {
+ 
+         FILE *f;
+-        char **m = 0;
++        char **m = NULL;
+         int r;
+ 
+         assert(fname);
+@@ -4172,7 +4172,7 @@ int wait_for_terminate_and_warn(const char *name, pid_t pid) {
+ 
+ }
+ 
+-void freeze(void) {
++_noreturn_ void freeze(void) {
+ 
+         /* Make sure nobody waits for us on a socket anymore */
+         close_all_fds(NULL, 0);
diff --git a/0156-socket-fail-the-socket-if-the-service-keeps-dying-on.patch b/0156-socket-fail-the-socket-if-the-service-keeps-dying-on.patch
new file mode 100644
index 0000000..e76a500
--- /dev/null
+++ b/0156-socket-fail-the-socket-if-the-service-keeps-dying-on.patch
@@ -0,0 +1,101 @@
+From 6af0f4d18a60f01d005410b541eb9a0655bc2a86 Mon Sep 17 00:00:00 2001
+From: Michal Schmidt <mschmidt at redhat.com>
+Date: Mon, 5 Mar 2012 22:47:54 +0100
+Subject: [PATCH] socket: fail the socket if the service keeps dying on start
+
+If the service reaches the start limit, mark the sockets that activate
+it as failed (with the result code 'service-broken').
+This way the sockets won't act as tarpits for clients connecting to
+them.
+(cherry picked from commit c2f3480897b51dd9b2137f1eeddb4c851e9c6e3b)
+
+Conflicts:
+
+	src/service.c
+	src/socket.c
+	src/socket.h
+---
+ src/service.c |    7 ++++---
+ src/socket.c  |    9 ++++++---
+ src/socket.h  |    2 +-
+ 3 files changed, 11 insertions(+), 7 deletions(-)
+
+diff --git a/src/service.c b/src/service.c
+index f99ee60..950e495 100644
+--- a/src/service.c
++++ b/src/service.c
+@@ -1375,7 +1375,7 @@ static int service_search_main_pid(Service *s) {
+         return 0;
+ }
+ 
+-static void service_notify_sockets_dead(Service *s) {
++static void service_notify_sockets_dead(Service *s, bool broken) {
+         Iterator i;
+         Unit *u;
+ 
+@@ -1388,7 +1388,7 @@ static void service_notify_sockets_dead(Service *s) {
+ 
+         SET_FOREACH(u, s->meta.dependencies[UNIT_TRIGGERED_BY], i)
+                 if (u->meta.type == UNIT_SOCKET)
+-                        socket_notify_service_dead(SOCKET(u));
++                        socket_notify_service_dead(SOCKET(u), broken);
+ 
+         return;
+ }
+@@ -1450,7 +1450,7 @@ static void service_set_state(Service *s, ServiceState state) {
+             state == SERVICE_FINAL_SIGKILL ||
+             state == SERVICE_FAILED ||
+             state == SERVICE_AUTO_RESTART)
+-                service_notify_sockets_dead(s);
++                service_notify_sockets_dead(s, false);
+ 
+         if (state != SERVICE_START_PRE &&
+             state != SERVICE_START &&
+@@ -2275,6 +2275,7 @@ static int service_start(Unit *u) {
+         /* Make sure we don't enter a busy loop of some kind. */
+         if (!ratelimit_test(&s->ratelimit)) {
+                 log_warning("%s start request repeated too quickly, refusing to start.", u->meta.id);
++                service_notify_sockets_dead(s, true);
+                 return -ECANCELED;
+         }
+ 
+diff --git a/src/socket.c b/src/socket.c
+index 8bce18c..4b85528 100644
+--- a/src/socket.c
++++ b/src/socket.c
+@@ -2016,7 +2016,7 @@ int socket_collect_fds(Socket *s, int **fds, unsigned *n_fds) {
+         return 0;
+ }
+ 
+-void socket_notify_service_dead(Socket *s) {
++void socket_notify_service_dead(Socket *s, bool broken) {
+         assert(s);
+ 
+         /* The service is dead. Dang!
+@@ -2025,8 +2025,11 @@ void socket_notify_service_dead(Socket *s) {
+          * services. */
+ 
+         if (s->state == SOCKET_RUNNING) {
+-                log_debug("%s got notified about service death.", s->meta.id);
+-                socket_enter_listening(s);
++                log_debug("%s got notified about service death (broken: %s)", s->meta.id, yes_no(broken));
++                if (broken)
++                        socket_enter_stop_pre(s, false);
++                else
++                        socket_enter_listening(s);
+         }
+ }
+ 
+diff --git a/src/socket.h b/src/socket.h
+index 4fc2cbe..31b9552 100644
+--- a/src/socket.h
++++ b/src/socket.h
+@@ -137,7 +137,7 @@ struct Socket {
+ int socket_collect_fds(Socket *s, int **fds, unsigned *n_fds);
+ 
+ /* Called from the service when it shut down */
+-void socket_notify_service_dead(Socket *s);
++void socket_notify_service_dead(Socket *s, bool broken);
+ 
+ /* Called from the mount code figure out if a mount is a dependency of
+  * any of the sockets of this socket */
diff --git a/0157-socket-rename-broken-failure-result-to-failed-perman.patch b/0157-socket-rename-broken-failure-result-to-failed-perman.patch
new file mode 100644
index 0000000..c9f30fa
--- /dev/null
+++ b/0157-socket-rename-broken-failure-result-to-failed-perman.patch
@@ -0,0 +1,77 @@
+From dda7fed7d225da9242c767f2e548a4bf4d5fe022 Mon Sep 17 00:00:00 2001
+From: Lennart Poettering <lennart at poettering.net>
+Date: Tue, 6 Mar 2012 01:29:29 +0100
+Subject: [PATCH] socket: rename 'broken' failure result to 'failed-permanent'
+ on order not to introduce new terminology (cherry picked
+ from commit 6bda96a0234e2d3d61bc36de99c19a9293721fef)
+
+Conflicts:
+
+	src/service.c
+	src/socket.c
+	src/socket.h
+---
+ src/service.c |    4 ++--
+ src/socket.c  |    6 +++---
+ src/socket.h  |    2 +-
+ 3 files changed, 6 insertions(+), 6 deletions(-)
+
+diff --git a/src/service.c b/src/service.c
+index 950e495..af83b6e 100644
+--- a/src/service.c
++++ b/src/service.c
+@@ -1375,7 +1375,7 @@ static int service_search_main_pid(Service *s) {
+         return 0;
+ }
+ 
+-static void service_notify_sockets_dead(Service *s, bool broken) {
++static void service_notify_sockets_dead(Service *s, bool failed_permanent) {
+         Iterator i;
+         Unit *u;
+ 
+@@ -1388,7 +1388,7 @@ static void service_notify_sockets_dead(Service *s, bool broken) {
+ 
+         SET_FOREACH(u, s->meta.dependencies[UNIT_TRIGGERED_BY], i)
+                 if (u->meta.type == UNIT_SOCKET)
+-                        socket_notify_service_dead(SOCKET(u), broken);
++                        socket_notify_service_dead(SOCKET(u), failed_permanent);
+ 
+         return;
+ }
+diff --git a/src/socket.c b/src/socket.c
+index 4b85528..b40b7a1 100644
+--- a/src/socket.c
++++ b/src/socket.c
+@@ -2016,7 +2016,7 @@ int socket_collect_fds(Socket *s, int **fds, unsigned *n_fds) {
+         return 0;
+ }
+ 
+-void socket_notify_service_dead(Socket *s, bool broken) {
++void socket_notify_service_dead(Socket *s, bool failed_permanent) {
+         assert(s);
+ 
+         /* The service is dead. Dang!
+@@ -2025,8 +2025,8 @@ void socket_notify_service_dead(Socket *s, bool broken) {
+          * services. */
+ 
+         if (s->state == SOCKET_RUNNING) {
+-                log_debug("%s got notified about service death (broken: %s)", s->meta.id, yes_no(broken));
+-                if (broken)
++                log_debug("%s got notified about service death (failed permanently: %s)", s->meta.id, yes_no(failed_permanent));
++                if (failed_permanent)
+                         socket_enter_stop_pre(s, false);
+                 else
+                         socket_enter_listening(s);
+diff --git a/src/socket.h b/src/socket.h
+index 31b9552..b172402 100644
+--- a/src/socket.h
++++ b/src/socket.h
+@@ -137,7 +137,7 @@ struct Socket {
+ int socket_collect_fds(Socket *s, int **fds, unsigned *n_fds);
+ 
+ /* Called from the service when it shut down */
+-void socket_notify_service_dead(Socket *s, bool broken);
++void socket_notify_service_dead(Socket *s, bool failed_permanent);
+ 
+ /* Called from the mount code figure out if a mount is a dependency of
+  * any of the sockets of this socket */
diff --git a/0158-nspawn-be-less-cryptic-when-clone-fails.patch b/0158-nspawn-be-less-cryptic-when-clone-fails.patch
new file mode 100644
index 0000000..5f2b9ef
--- /dev/null
+++ b/0158-nspawn-be-less-cryptic-when-clone-fails.patch
@@ -0,0 +1,31 @@
+From a92d0708fa5755e2c66943c7827c538824473596 Mon Sep 17 00:00:00 2001
+From: Lennart Poettering <lennart at poettering.net>
+Date: Tue, 6 Mar 2012 02:06:29 +0100
+Subject: [PATCH] nspawn: be less cryptic when clone() fails
+
+Based on a patch suggested by Shawn Landden.
+(cherry picked from commit 52af21063b365f231ee6ae8bac18d690fff85799)
+---
+ src/nspawn.c |    9 +++++++--
+ 1 files changed, 7 insertions(+), 2 deletions(-)
+
+diff --git a/src/nspawn.c b/src/nspawn.c
+index 3ea603f..52b4aa8 100644
+--- a/src/nspawn.c
++++ b/src/nspawn.c
+@@ -705,8 +705,13 @@ int main(int argc, char *argv[]) {
+         sigset_add_many(&mask, SIGCHLD, SIGWINCH, SIGTERM, SIGINT, -1);
+         assert_se(sigprocmask(SIG_BLOCK, &mask, NULL) == 0);
+ 
+-        if ((pid = syscall(__NR_clone, SIGCHLD|CLONE_NEWIPC|CLONE_NEWNS|CLONE_NEWPID|CLONE_NEWUTS|(arg_private_network ? CLONE_NEWNET : 0), NULL)) < 0) {
+-                log_error("clone() failed: %m");
++        pid = syscall(__NR_clone, SIGCHLD|CLONE_NEWIPC|CLONE_NEWNS|CLONE_NEWPID|CLONE_NEWUTS|(arg_private_network ? CLONE_NEWNET : 0), NULL);
++        if (pid < 0) {
++                if (errno == EINVAL)
++                        log_error("clone() failed, do you have namespace support enabled in your kernel? (You need UTS, IPC, PID and NET namespacing built in): %m");
++                else
++                        log_error("clone() failed: %m");
++
+                 goto finish;
+         }
+ 
diff --git a/0159-bash-completion-get-rid-of-awk-sed-and-grep.patch b/0159-bash-completion-get-rid-of-awk-sed-and-grep.patch
new file mode 100644
index 0000000..4290748
--- /dev/null
+++ b/0159-bash-completion-get-rid-of-awk-sed-and-grep.patch
@@ -0,0 +1,113 @@
+From 79453cbee691a52b48a8cb166a62de5a7dc999b9 Mon Sep 17 00:00:00 2001
+From: Harald Hoyer <harald at redhat.com>
+Date: Tue, 21 Feb 2012 15:48:24 +0100
+Subject: [PATCH] bash-completion: get rid of awk, sed and grep
+
+Get rid of "awk", "sed" and "grep" calls.
+This can be done entirely in bash!
+
+With help from Dave Reisner
+(cherry picked from commit e2e9329411a3753421e97c084d0f177003b20970)
+---
+ src/systemd-bash-completion.sh |   53 ++++++++++++++++++++++++++-------------
+ 1 files changed, 35 insertions(+), 18 deletions(-)
+
+diff --git a/src/systemd-bash-completion.sh b/src/systemd-bash-completion.sh
+index 176591f..eab290e 100644
+--- a/src/systemd-bash-completion.sh
++++ b/src/systemd-bash-completion.sh
+@@ -26,9 +26,11 @@ __contains_word () {
+ }
+ 
+ __filter_units_by_property () {
+-        local property=$1 value=$2 ; shift ; shift
+-        local -a units=( $* )
+-        local -a props=( $(__systemctl show --property "$property" -- ${units[*]} | grep -v ^$) )
++        local property=$1 value=$2 ; shift 2
++        local units=("$@")
++        local props
++        IFS=$'\n' read -rd '' -a props < \
++            <(__systemctl show --property "$property" -- "${units[@]}")
+         for ((i=0; $i < ${#units[*]}; i++)); do
+                 if [[ "${props[i]}" = "$property=$value" ]]; then
+                         echo "${units[i]}"
+@@ -36,13 +38,20 @@ __filter_units_by_property () {
+         done
+ }
+ 
+-__get_all_units      () { __systemctl list-units --all | awk '                 {print $1}' ; }
+-__get_active_units   () { __systemctl list-units       | awk '                 {print $1}' ; }
+-__get_inactive_units () { __systemctl list-units --all | awk '$3 == "inactive" {print $1}' ; }
+-__get_failed_units   () { __systemctl list-units       | awk '$3 == "failed"   {print $1}' ; }
+-__get_enabled_units  () { __systemctl list-unit-files  | awk '$2 == "enabled"  {print $1}' ; }
+-__get_disabled_units () { __systemctl list-unit-files  | awk '$2 == "disabled" {print $1}' ; }
+-__get_masked_units   () { __systemctl list-unit-files  | awk '$2 == "masked"   {print $1}' ; }
++__get_all_units      () { __systemctl list-units --all \
++        | { while read a b; do echo "$a"; done; }; }
++__get_active_units   () { __systemctl list-units       \
++        | { while read a b; do echo "$a"; done; }; }
++__get_inactive_units () { __systemctl list-units --all \
++        | { while read a b c d; do [[ $c == "inactive" ]] && echo "$a"; done; }; }
++__get_failed_units   () { __systemctl list-units       \
++        | { while read a b c d; do [[ $c == "failed"   ]] && echo "$a"; done; }; }
++__get_enabled_units  () { __systemctl list-unit-files  \
++        | { while read a b c  ; do [[ $b == "enabled"  ]] && echo "$a"; done; }; }
++__get_disabled_units () { __systemctl list-unit-files  \
++        | { while read a b c  ; do [[ $b == "disabled" ]] && echo "$a"; done; }; }
++__get_masked_units   () { __systemctl list-unit-files  \
++        | { while read a b c  ; do [[ $b == "masked"   ]] && echo "$a"; done; }; }
+ 
+ _systemctl () {
+         local cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]}
+@@ -133,11 +142,17 @@ _systemctl () {
+ 
+         elif __contains_word "$verb" ${VERBS[STARTABLE_UNITS]}; then
+                 comps=$( __filter_units_by_property CanStart yes \
+-                      $( __get_inactive_units | grep -Ev '\.(device|snapshot)$' ))
++                      $( __get_inactive_units \
++		        | while read line; do \
++		                [[ "$line" =~ \.(device|snapshot)$ ]] || echo "$line"; \
++		        done ))
+ 
+         elif __contains_word "$verb" ${VERBS[RESTARTABLE_UNITS]}; then
+                 comps=$( __filter_units_by_property CanStart yes \
+-                      $( __get_all_units | grep -Ev '\.(device|snapshot|socket|timer)$' ))
++                      $( __get_all_units \
++		        | while read line; do \
++		                [[ "$line" =~ \.(device|snapshot|socket|timer)$ ]] || echo "$line"; \
++		        done ))
+ 
+         elif __contains_word "$verb" ${VERBS[STOPPABLE_UNITS]}; then
+                 comps=$( __filter_units_by_property CanStop yes \
+@@ -161,13 +176,15 @@ _systemctl () {
+                 comps=''
+ 
+         elif __contains_word "$verb" ${VERBS[JOBS]}; then
+-                comps=$( __systemctl list-jobs | awk '{print $1}' )
++                comps=$( __systemctl list-jobs | { while read a b; do echo "$a"; done; } )
+ 
+         elif __contains_word "$verb" ${VERBS[SNAPSHOTS]}; then
+-                comps=$( __systemctl list-units --type snapshot --full --all | awk '{print $1}' )
++                comps=$( __systemctl list-units --type snapshot --full --all \
++                        | { while read a b; do echo "$a"; done; } )
+ 
+         elif __contains_word "$verb" ${VERBS[ENVS]}; then
+-                comps=$( __systemctl show-environment | sed 's_\([^=]\+=\).*_\1_' )
++                comps=$( __systemctl show-environment \
++                    | while read line; do echo "${line%%=*}=";done )
+                 compopt -o nospace
+ 
+         elif __contains_word "$verb" ${VERBS[FILE]}; then
+@@ -180,9 +197,9 @@ _systemctl () {
+ }
+ complete -F _systemctl systemctl
+ 
+-__get_all_sessions () { systemd-loginctl list-sessions | awk '{print $1}' ; }
+-__get_all_users    () { systemd-loginctl list-users    | awk '{print $2}' ; }
+-__get_all_seats    () { systemd-loginctl list-seats    | awk '{print $1}' ; }
++__get_all_sessions () { systemd-loginctl list-sessions | { while read a b; do echo "$a"; done; } ; }
++__get_all_users    () { systemd-loginctl list-users    | { while read a b; do echo "$b"; done; } ; }
++__get_all_seats    () { systemd-loginctl list-seats    | { while read a b; do echo "$a"; done; } ; }
+ 
+ _systemd_loginctl () {
+         local cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]}
diff --git a/0160-mount-properly-check-return-for-mount_add_.patch b/0160-mount-properly-check-return-for-mount_add_.patch
new file mode 100644
index 0000000..ec3093e
--- /dev/null
+++ b/0160-mount-properly-check-return-for-mount_add_.patch
@@ -0,0 +1,25 @@
+From 70cb1063f8588e659c6e0eb6ad544823a5d2cd98 Mon Sep 17 00:00:00 2001
+From: Dave Reisner <d at falconindy.com>
+Date: Fri, 17 Feb 2012 12:17:49 -0500
+Subject: [PATCH] mount: properly check return for mount_add_*
+
+Previously, mount_load_etc_fstab() could never fail for reasons other
+than a setmntent() or allocation failure.
+(cherry picked from commit 85eda5721f8d2a20482ef228d341fbbd134c6799)
+---
+ src/mount.c |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+diff --git a/src/mount.c b/src/mount.c
+index 8281082..ccf1e9c 100644
+--- a/src/mount.c
++++ b/src/mount.c
+@@ -1549,7 +1549,7 @@ static int mount_load_etc_fstab(Manager *m) {
+                 free(what);
+                 free(where);
+ 
+-                if (r < 0)
++                if (k < 0)
+                         r = k;
+         }
+ 
diff --git a/systemd.spec b/systemd.spec
index 0ad488d..d359b3e 100644
--- a/systemd.spec
+++ b/systemd.spec
@@ -2,7 +2,7 @@ Name:           systemd
 Url:            http://www.freedesktop.org/wiki/Software/systemd
 BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
 Version:        37
-Release:        15%{?dist}
+Release:        16%{?dist}
 License:        GPLv2+
 Group:          System Environment/Base
 Summary:        A System and Service Manager
@@ -206,6 +206,13 @@ Patch0151:      0151-Fix-broken-Git-repository-URLs.patch
 Patch0152:      0152-timedate-don-t-fail-if-NTP-is-not-installed.patch
 Patch0153:      0153-namespace-temporaily-reset-umask-when-creating-priva.patch
 Patch0154:      0154-logind-move-X11-socket.patch
+# from v44:
+Patch0155:      0155-fix-sparse-warnings.patch
+Patch0156:      0156-socket-fail-the-socket-if-the-service-keeps-dying-on.patch
+Patch0157:      0157-socket-rename-broken-failure-result-to-failed-perman.patch
+Patch0158:      0158-nspawn-be-less-cryptic-when-clone-fails.patch
+Patch0159:      0159-bash-completion-get-rid-of-awk-sed-and-grep.patch
+Patch0160:      0160-mount-properly-check-return-for-mount_add_.patch
 
 # For sysvinit tools
 Obsoletes:      SysVinit < 2.86-24, sysvinit < 2.86-24
@@ -527,6 +534,12 @@ fi
 %{_bindir}/systemd-sysv-convert
 
 %changelog
+* Tue Mar 06 2012 Michal Schmidt <mschmidt at redhat.com> - 37-16
+- From upstream:
+  - avoid socket tarpits when the service keeps failing
+  - get rid of awk, sed, grep in bash completion
+  - and minor fixes
+
 * Thu Mar 01 2012 Michal Schmidt <mschmidt at redhat.com> - 37-15
 - logind: move X11 socket
 


More information about the scm-commits mailing list