device-mapper-multipath/0077-libmultipath-move-logq_lock-handling-to-log.c.patch
DistroBaker 28d3ae407e Merged update from upstream sources
This is an automated DistroBaker update from upstream sources.
If you do not know what this is about or would like to opt out,
contact the OSCI team.

Source: https://src.fedoraproject.org/rpms/device-mapper-multipath.git#26a2cd7a3e189bf91263d17bc8a8c449cc043fb0
2021-01-21 16:56:27 +00:00

142 lines
3.6 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Martin Wilck <mwilck@suse.com>
Date: Mon, 26 Oct 2020 22:01:18 +0100
Subject: [PATCH] libmultipath: move logq_lock handling to log.c
logq_lock protects internal data structures of log.c, and should
be handled there. This patch doesn't change functionality, except
improving cancel-safety somewhat.
Reviewed-by: Benjamin Marzinski <bmarzins@redhat.com>
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
---
libmultipath/log.c | 34 ++++++++++++++++++++++++++++++++--
libmultipath/log_pthread.c | 9 ---------
2 files changed, 32 insertions(+), 11 deletions(-)
diff --git a/libmultipath/log.c b/libmultipath/log.c
index debd36de..7f337879 100644
--- a/libmultipath/log.c
+++ b/libmultipath/log.c
@@ -9,13 +9,16 @@
#include <string.h>
#include <syslog.h>
#include <time.h>
+#include <pthread.h>
#include "memory.h"
#include "log.h"
+#include "util.h"
#define ALIGN(len, s) (((len)+(s)-1)/(s)*(s))
struct logarea* la;
+static pthread_mutex_t logq_lock = PTHREAD_MUTEX_INITIALIZER;
#if LOGDBG
static void dump_logarea (void)
@@ -101,12 +104,17 @@ void log_close (void)
void log_reset (char *program_name)
{
+ pthread_mutex_lock(&logq_lock);
+ pthread_cleanup_push(cleanup_mutex, &logq_lock);
+
closelog();
tzset();
openlog(program_name, 0, LOG_DAEMON);
+
+ pthread_cleanup_pop(1);
}
-int log_enqueue (int prio, const char * fmt, va_list ap)
+static int _log_enqueue(int prio, const char * fmt, va_list ap)
{
int len, fwd;
char buff[MAX_MSG_SIZE];
@@ -165,7 +173,18 @@ int log_enqueue (int prio, const char * fmt, va_list ap)
return 0;
}
-int log_dequeue (void * buff)
+int log_enqueue(int prio, const char *fmt, va_list ap)
+{
+ int ret;
+
+ pthread_mutex_lock(&logq_lock);
+ pthread_cleanup_push(cleanup_mutex, &logq_lock);
+ ret = _log_enqueue(prio, fmt, ap);
+ pthread_cleanup_pop(1);
+ return ret;
+}
+
+static int _log_dequeue(void *buff)
{
struct logmsg * src = (struct logmsg *)la->head;
struct logmsg * dst = (struct logmsg *)buff;
@@ -194,6 +213,17 @@ int log_dequeue (void * buff)
return 0;
}
+int log_dequeue(void *buff)
+{
+ int ret;
+
+ pthread_mutex_lock(&logq_lock);
+ pthread_cleanup_push(cleanup_mutex, &logq_lock);
+ ret = _log_dequeue(buff);
+ pthread_cleanup_pop(1);
+ return ret;
+}
+
/*
* this one can block under memory pressure
*/
diff --git a/libmultipath/log_pthread.c b/libmultipath/log_pthread.c
index 0d48c52c..65992101 100644
--- a/libmultipath/log_pthread.c
+++ b/libmultipath/log_pthread.c
@@ -18,7 +18,6 @@
static pthread_t log_thr;
/* logev_lock must not be taken with logq_lock held */
-static pthread_mutex_t logq_lock = PTHREAD_MUTEX_INITIALIZER;
static pthread_mutex_t logev_lock = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t logev_cond = PTHREAD_COND_INITIALIZER;
@@ -41,10 +40,7 @@ void log_safe (int prio, const char * fmt, va_list ap)
running = logq_running;
if (running) {
- pthread_mutex_lock(&logq_lock);
- pthread_cleanup_push(cleanup_mutex, &logq_lock);
log_enqueue(prio, fmt, ap);
- pthread_cleanup_pop(1);
log_messages_pending = 1;
pthread_cond_signal(&logev_cond);
@@ -60,9 +56,7 @@ static void flush_logqueue (void)
int empty;
do {
- pthread_mutex_lock(&logq_lock);
empty = log_dequeue(la->buff);
- pthread_mutex_unlock(&logq_lock);
if (!empty)
log_syslog(la->buff);
} while (empty == 0);
@@ -138,10 +132,7 @@ void log_thread_start (pthread_attr_t *attr)
void log_thread_reset (void)
{
logdbg(stderr,"resetting log\n");
-
- pthread_mutex_lock(&logq_lock);
log_reset("multipathd");
- pthread_mutex_unlock(&logq_lock);
}
void log_thread_stop (void)
--
2.17.2