Package init
This commit is contained in:
parent
1cca812e1e
commit
61b9625884
175
6038-lvmetad-fix-sync-cache-to-lvmetad.patch
Normal file
175
6038-lvmetad-fix-sync-cache-to-lvmetad.patch
Normal file
@ -0,0 +1,175 @@
|
|||||||
|
From 5d6bf1efb225b964bfff398277e68345acdac1d0 Mon Sep 17 00:00:00 2001
|
||||||
|
From: David Teigland <teigland@redhat.com>
|
||||||
|
Date: Wed, 25 Sep 2019 14:23:14 -0500
|
||||||
|
Subject: [PATCH 126/180] lvmetad: fix sync cache to lvmetad
|
||||||
|
|
||||||
|
error could be reproduced follow those steps:
|
||||||
|
#!/bin/bash
|
||||||
|
vgcreate vgtest /dev/sdb
|
||||||
|
lvcreate -L 100M -n lv1 vgtest
|
||||||
|
while :
|
||||||
|
do
|
||||||
|
service lvm2-lvmetad restart
|
||||||
|
vgs &
|
||||||
|
pvscan &
|
||||||
|
lvcreate -L 100M -n lv2 vgtest &
|
||||||
|
lvchange /dev/vgtest/lv1 --addtag xxxxx &
|
||||||
|
wait
|
||||||
|
if ! lvs|grep lv2;then
|
||||||
|
echo "err create"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
sleep 1
|
||||||
|
lvremove -y /dev/vgtest/lv2
|
||||||
|
lvchange /dev/vgtest/lv1 --deltag xxxxx
|
||||||
|
done
|
||||||
|
|
||||||
|
and then fail to create vgtest/lv2, actually lv2 was created, while
|
||||||
|
the metadata written on disk is replaced by lvchange. It could look
|
||||||
|
up lv2 by calling dmsetup table, while lvs could not.
|
||||||
|
|
||||||
|
This is because, when lvmetad restarted, several lvm commands update
|
||||||
|
token concurrently, when lvcreate recieve "token_mismatch", it cancle
|
||||||
|
communicating with lvmetad, which leads to that lvmetad cache is not
|
||||||
|
sync with the metadata on disk, then lv2 is not committed to lvmetad
|
||||||
|
cache. The metadata of vgtest which lvchange query from lvmetad is
|
||||||
|
out of date. After lvchange, it use the old metadata cover the new one.
|
||||||
|
|
||||||
|
This patch let lvm process update token synchronously, only one command
|
||||||
|
update lvmetad token at a time.
|
||||||
|
|
||||||
|
lvmetad_pvscan_single send the metadata on a pv by sending "pv_found"
|
||||||
|
to lvmetad, while the metadata maybe out of date after waiting for the
|
||||||
|
chance to update lvmetad token. Call label_read to read metadata again.
|
||||||
|
|
||||||
|
Token mismatch may lead to problems, increase log level.
|
||||||
|
|
||||||
|
Signed-off-by: wangjufeng<wangjufeng@huawei.com>
|
||||||
|
---
|
||||||
|
daemons/lvmetad/lvmetad-core.c | 19 +++++++++++++++----
|
||||||
|
lib/cache/lvmetad.c | 31 +++++++++++++++++++++++++++++--
|
||||||
|
2 files changed, 44 insertions(+), 6 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/daemons/lvmetad/lvmetad-core.c b/daemons/lvmetad/lvmetad-core.c
|
||||||
|
index 72473d7..c274880 100644
|
||||||
|
--- a/daemons/lvmetad/lvmetad-core.c
|
||||||
|
+++ b/daemons/lvmetad/lvmetad-core.c
|
||||||
|
@@ -2669,6 +2669,7 @@ static response handler(daemon_state s, client_handle h, request r)
|
||||||
|
int pid;
|
||||||
|
int cache_lock = 0;
|
||||||
|
int info_lock = 0;
|
||||||
|
+ uint64_t timegap = 0;
|
||||||
|
|
||||||
|
rq = daemon_request_str(r, "request", "NONE");
|
||||||
|
token = daemon_request_str(r, "token", "NONE");
|
||||||
|
@@ -2711,9 +2712,19 @@ static response handler(daemon_state s, client_handle h, request r)
|
||||||
|
state->update_cmd);
|
||||||
|
|
||||||
|
} else if (prev_in_progress && this_in_progress) {
|
||||||
|
+ timegap = _monotonic_seconds() - state->update_begin;
|
||||||
|
+ if (timegap < state->update_timeout) {
|
||||||
|
+ pthread_mutex_unlock(&state->token_lock);
|
||||||
|
+ return daemon_reply_simple("token_updating",
|
||||||
|
+ "expected = %s", state->token,
|
||||||
|
+ "update_pid = " FMTd64, (int64_t)state->update_pid,
|
||||||
|
+ "reason = %s", "another command has populated the cache",
|
||||||
|
+ NULL);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
/* Current update is cancelled and replaced by a new update */
|
||||||
|
|
||||||
|
- DEBUGLOG(state, "token_update replacing pid %d begin %llu len %d cmd %s",
|
||||||
|
+ WARN(state, "token_update replacing pid %d begin %llu len %d cmd %s",
|
||||||
|
state->update_pid,
|
||||||
|
(unsigned long long)state->update_begin,
|
||||||
|
(int)(_monotonic_seconds() - state->update_begin),
|
||||||
|
@@ -2726,7 +2737,7 @@ static response handler(daemon_state s, client_handle h, request r)
|
||||||
|
state->update_pid = pid;
|
||||||
|
strncpy(state->update_cmd, cmd, CMD_NAME_SIZE - 1);
|
||||||
|
|
||||||
|
- DEBUGLOG(state, "token_update begin %llu timeout %d pid %d cmd %s",
|
||||||
|
+ WARN(state, "token_update begin %llu timeout %d pid %d cmd %s",
|
||||||
|
(unsigned long long)state->update_begin,
|
||||||
|
state->update_timeout,
|
||||||
|
state->update_pid,
|
||||||
|
@@ -2737,7 +2748,7 @@ static response handler(daemon_state s, client_handle h, request r)
|
||||||
|
|
||||||
|
if (state->update_pid != pid) {
|
||||||
|
/* If a pid doing update was cancelled, ignore its token update at the end. */
|
||||||
|
- DEBUGLOG(state, "token_update ignored from cancelled update pid %d", pid);
|
||||||
|
+ WARN(state, "token_update ignored from cancelled update pid %d", pid);
|
||||||
|
pthread_mutex_unlock(&state->token_lock);
|
||||||
|
|
||||||
|
return daemon_reply_simple("token_mismatch",
|
||||||
|
@@ -2748,7 +2759,7 @@ static response handler(daemon_state s, client_handle h, request r)
|
||||||
|
NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
- DEBUGLOG(state, "token_update end len %d pid %d new token %s",
|
||||||
|
+ WARN(state, "token_update end len %d pid %d new token %s",
|
||||||
|
(int)(_monotonic_seconds() - state->update_begin),
|
||||||
|
state->update_pid, token);
|
||||||
|
|
||||||
|
diff --git a/lib/cache/lvmetad.c b/lib/cache/lvmetad.c
|
||||||
|
index 291a2b2..8dc12a6 100644
|
||||||
|
--- a/lib/cache/lvmetad.c
|
||||||
|
+++ b/lib/cache/lvmetad.c
|
||||||
|
@@ -552,7 +552,12 @@ static int _token_update(int *replaced_update)
|
||||||
|
const char *reply_str;
|
||||||
|
int update_pid;
|
||||||
|
int ending_our_update;
|
||||||
|
+ unsigned int wait_sec = 0;
|
||||||
|
+ uint64_t now = 0, wait_start = 0;
|
||||||
|
+ wait_sec = (unsigned int)_lvmetad_update_timeout;
|
||||||
|
+ unsigned int delay_usec = 0;
|
||||||
|
|
||||||
|
+retry:
|
||||||
|
log_debug_lvmetad("Sending lvmetad token_update %s", _lvmetad_token);
|
||||||
|
reply = _lvmetad_send(NULL, "token_update", NULL);
|
||||||
|
|
||||||
|
@@ -568,6 +573,28 @@ static int _token_update(int *replaced_update)
|
||||||
|
update_pid = (int)daemon_reply_int(reply, "update_pid", 0);
|
||||||
|
reply_str = daemon_reply_str(reply, "response", "");
|
||||||
|
|
||||||
|
+ if (!strcmp(reply_str, "token_updating")) {
|
||||||
|
+ daemon_reply_destroy(reply);
|
||||||
|
+ if (!(now = _monotonic_seconds())) {
|
||||||
|
+ log_print_unless_silent("_monotonic_seconds error");
|
||||||
|
+ return 0;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (!wait_start)
|
||||||
|
+ wait_start = now;
|
||||||
|
+
|
||||||
|
+ if (now - wait_start <= wait_sec) {
|
||||||
|
+ log_warn("lvmetad is being updated, retry for %u more seconds.",
|
||||||
|
+ wait_sec - (unsigned int)(now - wait_start));
|
||||||
|
+ delay_usec = 1000000 + lvm_even_rand(&_lvmetad_cmd->rand_seed, 1000000);
|
||||||
|
+ usleep(delay_usec);
|
||||||
|
+ goto retry;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ log_print_unless_silent("Not using lvmetad after %u sec lvmetad_update_wait_time, no more try.", wait_sec);
|
||||||
|
+ return 0;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* A mismatch can only happen when this command attempts to set the
|
||||||
|
* token to filter:<hash> at the end of its update, but the update has
|
||||||
|
@@ -578,11 +605,11 @@ static int _token_update(int *replaced_update)
|
||||||
|
|
||||||
|
ending_our_update = strcmp(_lvmetad_token, LVMETAD_TOKEN_UPDATE_IN_PROGRESS);
|
||||||
|
|
||||||
|
- log_debug_lvmetad("Received token update mismatch expected \"%s\" our token \"%s\" update_pid %d our pid %d",
|
||||||
|
+ log_print_unless_silent("Received token update mismatch expected \"%s\" our token \"%s\" update_pid %d our pid %d",
|
||||||
|
token_expected, _lvmetad_token, update_pid, getpid());
|
||||||
|
|
||||||
|
if (ending_our_update && (update_pid != getpid())) {
|
||||||
|
- log_warn("WARNING: lvmetad was updated by another command (pid %d).", update_pid);
|
||||||
|
+ log_print_unless_silent("WARNING: lvmetad was updated by another command (pid %d).", update_pid);
|
||||||
|
} else {
|
||||||
|
/*
|
||||||
|
* Shouldn't happen.
|
||||||
|
--
|
||||||
|
2.19.1
|
||||||
|
|
||||||
148
6039-libdaemon-use-pselect-to-avoid-condition-checking-ra.patch
Normal file
148
6039-libdaemon-use-pselect-to-avoid-condition-checking-ra.patch
Normal file
@ -0,0 +1,148 @@
|
|||||||
|
From 6d4f36c2c7f782af31eca7eca63310791a4f8e93 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Zdenek Kabelac <zkabelac@redhat.com>
|
||||||
|
Date: Wed, 10 Apr 2019 12:50:53 +0200
|
||||||
|
Subject: [PATCH] libdaemon: use pselect to avoid condition checking race
|
||||||
|
|
||||||
|
To avoid tiny race on checking arrival of signal and entering select
|
||||||
|
(that can latter remain stuck as signal was already delivered) switch
|
||||||
|
to use pselect().
|
||||||
|
|
||||||
|
If it would needed, we can eventually add extra code for older systems
|
||||||
|
without pselect(), but there are probably no such ancient systems in
|
||||||
|
use.
|
||||||
|
---
|
||||||
|
daemons/lvmetad/lvmetad-core.c | 2 +-
|
||||||
|
daemons/lvmpolld/lvmpolld-core.c | 2 +-
|
||||||
|
libdaemon/server/daemon-server.c | 38 +++++++++++++++++++++++---------
|
||||||
|
libdaemon/server/daemon-server.h | 2 +-
|
||||||
|
4 files changed, 31 insertions(+), 13 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/daemons/lvmetad/lvmetad-core.c b/daemons/lvmetad/lvmetad-core.c
|
||||||
|
index c274880..fddec2e 100644
|
||||||
|
--- a/daemons/lvmetad/lvmetad-core.c
|
||||||
|
+++ b/daemons/lvmetad/lvmetad-core.c
|
||||||
|
@@ -2964,7 +2964,7 @@ static void usage(const char *prog, FILE *file)
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
signed char opt;
|
||||||
|
- struct timeval timeout;
|
||||||
|
+ struct timespec timeout;
|
||||||
|
daemon_idle di = { .ptimeout = &timeout };
|
||||||
|
lvmetad_state ls = { .log_config = "" };
|
||||||
|
daemon_state s = {
|
||||||
|
diff --git a/daemons/lvmpolld/lvmpolld-core.c b/daemons/lvmpolld/lvmpolld-core.c
|
||||||
|
index fd73272..f1056c3 100644
|
||||||
|
--- a/daemons/lvmpolld/lvmpolld-core.c
|
||||||
|
+++ b/daemons/lvmpolld/lvmpolld-core.c
|
||||||
|
@@ -915,7 +915,7 @@ int main(int argc, char *argv[])
|
||||||
|
int option_index = 0;
|
||||||
|
int client = 0, server = 0;
|
||||||
|
unsigned action = ACTION_MAX;
|
||||||
|
- struct timeval timeout;
|
||||||
|
+ struct timespec timeout;
|
||||||
|
daemon_idle di = { .ptimeout = &timeout };
|
||||||
|
struct lvmpolld_state ls = { .log_config = "" };
|
||||||
|
daemon_state s = {
|
||||||
|
diff --git a/libdaemon/server/daemon-server.c b/libdaemon/server/daemon-server.c
|
||||||
|
index 83f56db..53bee39 100644
|
||||||
|
--- a/libdaemon/server/daemon-server.c
|
||||||
|
+++ b/libdaemon/server/daemon-server.c
|
||||||
|
@@ -87,7 +87,7 @@ static int _is_idle(daemon_state s)
|
||||||
|
return s.idle && s.idle->is_idle && !s.threads->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static struct timeval *_get_timeout(daemon_state s)
|
||||||
|
+static struct timespec *_get_timeout(daemon_state s)
|
||||||
|
{
|
||||||
|
return s.idle ? s.idle->ptimeout : NULL;
|
||||||
|
}
|
||||||
|
@@ -96,7 +96,7 @@ static void _reset_timeout(daemon_state s)
|
||||||
|
{
|
||||||
|
if (s.idle) {
|
||||||
|
s.idle->ptimeout->tv_sec = 1;
|
||||||
|
- s.idle->ptimeout->tv_usec = 0;
|
||||||
|
+ s.idle->ptimeout->tv_nsec = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -561,6 +561,8 @@ void daemon_start(daemon_state s)
|
||||||
|
thread_state _threads = { .next = NULL };
|
||||||
|
unsigned timeout_count = 0;
|
||||||
|
fd_set in;
|
||||||
|
+ sigset_t new_set, old_set;
|
||||||
|
+ int ret;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Switch to C locale to avoid reading large locale-archive file used by
|
||||||
|
@@ -628,8 +630,7 @@ void daemon_start(daemon_state s)
|
||||||
|
if (!s.foreground)
|
||||||
|
kill(getppid(), SIGTERM);
|
||||||
|
|
||||||
|
- /*
|
||||||
|
- * Use daemon_main for daemon-specific init and polling, or
|
||||||
|
+ /* Use daemon_main for daemon-specific init and polling, or
|
||||||
|
* use daemon_init for daemon-specific init and generic lib polling.
|
||||||
|
*/
|
||||||
|
|
||||||
|
@@ -643,22 +644,39 @@ void daemon_start(daemon_state s)
|
||||||
|
if (!s.daemon_init(&s))
|
||||||
|
failed = 1;
|
||||||
|
|
||||||
|
+ if (s.socket_fd >= FD_SETSIZE)
|
||||||
|
+ failed = 1; /* FD out of available selectable set */
|
||||||
|
+
|
||||||
|
+ sigfillset(&new_set);
|
||||||
|
+ sigprocmask(SIG_SETMASK, NULL, &old_set);
|
||||||
|
+
|
||||||
|
while (!failed) {
|
||||||
|
_reset_timeout(s);
|
||||||
|
FD_ZERO(&in);
|
||||||
|
FD_SET(s.socket_fd, &in);
|
||||||
|
- if (select(FD_SETSIZE, &in, NULL, NULL, _get_timeout(s)) < 0 && errno != EINTR)
|
||||||
|
- perror("select error");
|
||||||
|
+
|
||||||
|
+ sigprocmask(SIG_SETMASK, &new_set, NULL);
|
||||||
|
+ if (_shutdown_requested && !s.threads->next) {
|
||||||
|
+ sigprocmask(SIG_SETMASK, &old_set, NULL);
|
||||||
|
+ INFO(&s, "%s shutdown requested", s.name);
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+ ret = pselect(s.socket_fd + 1, &in, NULL, NULL, _get_timeout(s), &old_set);
|
||||||
|
+ sigprocmask(SIG_SETMASK, &old_set, NULL);
|
||||||
|
+
|
||||||
|
+ if (ret < 0) {
|
||||||
|
+ if (errno != EINTR && errno != EAGAIN &&
|
||||||
|
+ (EWOULDBLOCK == EAGAIN || errno != EWOULDBLOCK))
|
||||||
|
+ perror("select error");
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (FD_ISSET(s.socket_fd, &in)) {
|
||||||
|
timeout_count = 0;
|
||||||
|
_handle_connect(s);
|
||||||
|
}
|
||||||
|
-
|
||||||
|
_reap(s, 0);
|
||||||
|
|
||||||
|
- if (_shutdown_requested && !s.threads->next)
|
||||||
|
- break;
|
||||||
|
-
|
||||||
|
/* s.idle == NULL equals no shutdown on timeout */
|
||||||
|
if (_is_idle(s)) {
|
||||||
|
DEBUGLOG(&s, "timeout occured");
|
||||||
|
diff --git a/libdaemon/server/daemon-server.h b/libdaemon/server/daemon-server.h
|
||||||
|
index 2b9ceac..e77ac20 100644
|
||||||
|
--- a/libdaemon/server/daemon-server.h
|
||||||
|
+++ b/libdaemon/server/daemon-server.h
|
||||||
|
@@ -47,7 +47,7 @@ struct timeval;
|
||||||
|
typedef struct {
|
||||||
|
volatile unsigned is_idle;
|
||||||
|
unsigned max_timeouts;
|
||||||
|
- struct timeval *ptimeout;
|
||||||
|
+ struct timespec *ptimeout;
|
||||||
|
} daemon_idle;
|
||||||
|
|
||||||
|
struct daemon_state;
|
||||||
|
--
|
||||||
|
2.19.1
|
||||||
|
|
||||||
@ -0,0 +1,35 @@
|
|||||||
|
From b41b112a4bf5f674acd45f12ff4efe7fa0d1d8be Mon Sep 17 00:00:00 2001
|
||||||
|
From: Zdenek Kabelac <zkabelac@redhat.com>
|
||||||
|
Date: Mon, 29 Apr 2019 13:43:36 +0200
|
||||||
|
Subject: [PATCH] libdaemon: ensure threads are reaped before checking shutdown
|
||||||
|
|
||||||
|
Since we are checking _shutdown_requested - we expect all threads
|
||||||
|
are finished - that is currently checked only by checking ->next ptr
|
||||||
|
being NULL - so this can be NULL only when _reap() function clears
|
||||||
|
out all already finished threads.
|
||||||
|
|
||||||
|
I'm finding this design quite problematic in its core - but as a
|
||||||
|
'trivial hotfix' - lets _reap() linked list before check for signal.
|
||||||
|
|
||||||
|
There is likely a large potentical for few races - but the windows is
|
||||||
|
very very small - since lvmetad has been already purged from upstream,
|
||||||
|
lets go with this hotfix.
|
||||||
|
---
|
||||||
|
libdaemon/server/daemon-server.c | 1 +
|
||||||
|
1 file changed, 1 insertion(+)
|
||||||
|
|
||||||
|
diff --git a/libdaemon/server/daemon-server.c b/libdaemon/server/daemon-server.c
|
||||||
|
index 8534b79..79b54d0 100644
|
||||||
|
--- a/libdaemon/server/daemon-server.c
|
||||||
|
+++ b/libdaemon/server/daemon-server.c
|
||||||
|
@@ -655,6 +655,7 @@ void daemon_start(daemon_state s)
|
||||||
|
FD_ZERO(&in);
|
||||||
|
FD_SET(s.socket_fd, &in);
|
||||||
|
|
||||||
|
+ _reap(s, 0);
|
||||||
|
sigprocmask(SIG_SETMASK, &new_set, NULL);
|
||||||
|
if (_shutdown_requested && !s.threads->next) {
|
||||||
|
sigprocmask(SIG_SETMASK, &old_set, NULL);
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
||||||
63
6041-lvmetad-fix-timeout-on-shutdown.patch
Normal file
63
6041-lvmetad-fix-timeout-on-shutdown.patch
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
From 61358d92cbf202dbb483d63a63d5adf0463bb934 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Zdenek Kabelac <zkabelac@redhat.com>
|
||||||
|
Date: Wed, 25 Sep 2019 17:22:49 +0200
|
||||||
|
Subject: [PATCH 127/180] lvmetad: fix timeout on shutdown
|
||||||
|
|
||||||
|
When lvmetad is going to be shutdown - there were 2 issue:
|
||||||
|
If there was endless stream of command contacting lvmetad - the process
|
||||||
|
would never finish - so now when we recieved SIGTERM - we are no longer
|
||||||
|
accepting new connections and we just wait till the existing ones are
|
||||||
|
finished.
|
||||||
|
|
||||||
|
2nd. issue is that actually when we are waiting for finish of all client
|
||||||
|
threads - we basically want an usleep() and check if all threads
|
||||||
|
are already finished - proper solution would be to singal from a thread
|
||||||
|
there is some work to do for master thread - but that would be a bigger
|
||||||
|
change and since lvmetad is no longer developed - keep the change
|
||||||
|
minimal and just use pselect() as our '1sec.' sleeping call once
|
||||||
|
we are in 'shutdown' mode.
|
||||||
|
|
||||||
|
Reported-by: wangjufeng@huawei.com
|
||||||
|
---
|
||||||
|
libdaemon/server/daemon-server.c | 11 +++++++++--
|
||||||
|
1 file changed, 9 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/libdaemon/server/daemon-server.c b/libdaemon/server/daemon-server.c
|
||||||
|
index 71f7fae..90bf055 100644
|
||||||
|
--- a/libdaemon/server/daemon-server.c
|
||||||
|
+++ b/libdaemon/server/daemon-server.c
|
||||||
|
@@ -89,6 +89,13 @@ static int _is_idle(daemon_state s)
|
||||||
|
|
||||||
|
static struct timespec *_get_timeout(daemon_state s)
|
||||||
|
{
|
||||||
|
+ static struct timespec _tm = { 0 };
|
||||||
|
+
|
||||||
|
+ if (_shutdown_requested) {
|
||||||
|
+ _tm.tv_sec = 1;
|
||||||
|
+ return &_tm;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
return s.idle ? s.idle->ptimeout : NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -506,7 +513,7 @@ static int _handle_connect(daemon_state s)
|
||||||
|
socklen_t sl = sizeof(sockaddr);
|
||||||
|
|
||||||
|
client.socket_fd = accept(s.socket_fd, (struct sockaddr *) &sockaddr, &sl);
|
||||||
|
- if (client.socket_fd < 0) {
|
||||||
|
+ if (client.socket_fd < 0 || _shutdown_requested) {
|
||||||
|
if (errno != EAGAIN || !_shutdown_requested)
|
||||||
|
ERROR(&s, "Failed to accept connection: %s.", strerror(errno));
|
||||||
|
return 0;
|
||||||
|
@@ -671,7 +678,7 @@ void daemon_start(daemon_state s)
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (FD_ISSET(s.socket_fd, &in)) {
|
||||||
|
+ if (!_shutdown_requested && FD_ISSET(s.socket_fd, &in)) {
|
||||||
|
timeout_count = 0;
|
||||||
|
_handle_connect(s);
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.19.1
|
||||||
|
|
||||||
31
6042-devs-check-for-no-dev-when-dropping-aliases.patch
Normal file
31
6042-devs-check-for-no-dev-when-dropping-aliases.patch
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
From f50af80199f723f7b1970ee33ddf959ea79fcbef Mon Sep 17 00:00:00 2001
|
||||||
|
From: David Teigland <teigland@redhat.com>
|
||||||
|
Date: Wed, 16 Oct 2019 13:32:28 -0500
|
||||||
|
Subject: [PATCH 134/180] devs: check for no dev when dropping aliases
|
||||||
|
|
||||||
|
When scanning fails to find a device path and
|
||||||
|
looks for device aliases, check if the device
|
||||||
|
itself still exists to avoid a potential segfault.
|
||||||
|
---
|
||||||
|
lib/label/label.c | 5 +++++
|
||||||
|
1 file changed, 5 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/lib/label/label.c b/lib/label/label.c
|
||||||
|
index 8107e33..e4a1068 100644
|
||||||
|
--- a/lib/label/label.c
|
||||||
|
+++ b/lib/label/label.c
|
||||||
|
@@ -734,6 +734,11 @@ static int _scan_list(struct cmd_context *cmd, struct dev_filter *f,
|
||||||
|
retried_open = 1;
|
||||||
|
|
||||||
|
dm_list_iterate_items_safe(devl, devl2, &reopen_devs) {
|
||||||
|
+ if (!devl->dev) {
|
||||||
|
+ dm_list_del(&devl->list);
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
_drop_bad_aliases(devl->dev);
|
||||||
|
|
||||||
|
if (dm_list_empty(&devl->dev->aliases)) {
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
||||||
84
6043-cov-missing-checks-of-syscalls.patch
Normal file
84
6043-cov-missing-checks-of-syscalls.patch
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
From 67bdae069751e4779e738283e3d8a5873622bfc0 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Zdenek Kabelac <zkabelac@redhat.com>
|
||||||
|
Date: Fri, 1 Nov 2019 20:25:39 +0100
|
||||||
|
Subject: [PATCH 169/180] cov: missing checks of syscalls
|
||||||
|
|
||||||
|
Check for sigaction,sigprocmask,pthread_sigmask errors
|
||||||
|
---
|
||||||
|
daemons/clvmd/clvmd.c | 10 ++++++----
|
||||||
|
libdaemon/server/daemon-server.c | 9 ++++++---
|
||||||
|
tools/toollib.c | 3 ++-
|
||||||
|
3 files changed, 14 insertions(+), 8 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/daemons/clvmd/clvmd.c b/daemons/clvmd/clvmd.c
|
||||||
|
index 829c5e5..e1d8a79 100644
|
||||||
|
--- a/daemons/clvmd/clvmd.c
|
||||||
|
+++ b/daemons/clvmd/clvmd.c
|
||||||
|
@@ -887,7 +887,8 @@ static void main_loop(int cmd_timeout)
|
||||||
|
sigemptyset(&ss);
|
||||||
|
sigaddset(&ss, SIGINT);
|
||||||
|
sigaddset(&ss, SIGTERM);
|
||||||
|
- pthread_sigmask(SIG_UNBLOCK, &ss, NULL);
|
||||||
|
+ if (pthread_sigmask(SIG_UNBLOCK, &ss, NULL))
|
||||||
|
+ log_warn("WARNING: Failed to unblock SIGCHLD.");
|
||||||
|
/* Main loop */
|
||||||
|
while (!quit) {
|
||||||
|
fd_set in;
|
||||||
|
@@ -1731,11 +1732,12 @@ static __attribute__ ((noreturn)) void *pre_and_post_thread(void *arg)
|
||||||
|
SIGUSR2 (kills subthreads) */
|
||||||
|
sigemptyset(&ss);
|
||||||
|
sigaddset(&ss, SIGUSR1);
|
||||||
|
- pthread_sigmask(SIG_BLOCK, &ss, NULL);
|
||||||
|
-
|
||||||
|
+ if (pthread_sigmask(SIG_BLOCK, &ss, NULL))
|
||||||
|
+ log_warn("WARNING: Failed to block SIGUSR1.");
|
||||||
|
sigdelset(&ss, SIGUSR1);
|
||||||
|
sigaddset(&ss, SIGUSR2);
|
||||||
|
- pthread_sigmask(SIG_UNBLOCK, &ss, NULL);
|
||||||
|
+ if (pthread_sigmask(SIG_UNBLOCK, &ss, NULL))
|
||||||
|
+ log_warn("WARNING: Failed to unblock SIGUSR2.");
|
||||||
|
|
||||||
|
/* Loop around doing PRE and POST functions until the client goes away */
|
||||||
|
while (!client->bits.localsock.finished) {
|
||||||
|
diff --git a/libdaemon/server/daemon-server.c b/libdaemon/server/daemon-server.c
|
||||||
|
index 62f403a..51e5866 100644
|
||||||
|
--- a/libdaemon/server/daemon-server.c
|
||||||
|
+++ b/libdaemon/server/daemon-server.c
|
||||||
|
@@ -663,14 +663,17 @@ void daemon_start(daemon_state s)
|
||||||
|
FD_SET(s.socket_fd, &in);
|
||||||
|
|
||||||
|
_reap(s, 0);
|
||||||
|
- sigprocmask(SIG_SETMASK, &new_set, NULL);
|
||||||
|
+ if (sigprocmask(SIG_SETMASK, &new_set, NULL))
|
||||||
|
+ perror("sigprocmask error");
|
||||||
|
if (_shutdown_requested && !s.threads->next) {
|
||||||
|
- sigprocmask(SIG_SETMASK, &old_set, NULL);
|
||||||
|
+ if (sigprocmask(SIG_SETMASK, &old_set, NULL))
|
||||||
|
+ perror("sigprocmask error");
|
||||||
|
INFO(&s, "%s shutdown requested", s.name);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
ret = pselect(s.socket_fd + 1, &in, NULL, NULL, _get_timeout(s), &old_set);
|
||||||
|
- sigprocmask(SIG_SETMASK, &old_set, NULL);
|
||||||
|
+ if (sigprocmask(SIG_SETMASK, &old_set, NULL))
|
||||||
|
+ perror("sigprocmask error");
|
||||||
|
|
||||||
|
if (ret < 0) {
|
||||||
|
if (errno != EINTR && errno != EAGAIN &&
|
||||||
|
diff --git a/tools/toollib.c b/tools/toollib.c
|
||||||
|
index 42179d9..0c1c095 100644
|
||||||
|
--- a/tools/toollib.c
|
||||||
|
+++ b/tools/toollib.c
|
||||||
|
@@ -59,7 +59,8 @@ int become_daemon(struct cmd_context *cmd, int skip_lvm)
|
||||||
|
|
||||||
|
log_verbose("Forking background process from command: %s", cmd->cmd_line);
|
||||||
|
|
||||||
|
- sigaction(SIGCHLD, &act, NULL);
|
||||||
|
+ if (sigaction(SIGCHLD, &act, NULL))
|
||||||
|
+ log_warn("WARNING: Failed to set SIGCHLD action.");
|
||||||
|
|
||||||
|
if (!skip_lvm)
|
||||||
|
if (!sync_local_dev_names(cmd)) { /* Flush ops and reset dm cookie */
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
||||||
26
6044-cov-ensure-read_ahead-is-available.patch
Normal file
26
6044-cov-ensure-read_ahead-is-available.patch
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
From f90c3d69cedf94fa094bc71cc98376d58d970223 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Zdenek Kabelac <zkabelac@redhat.com>
|
||||||
|
Date: Fri, 1 Nov 2019 21:01:51 +0100
|
||||||
|
Subject: [PATCH 170/180] cov: ensure read_ahead is available
|
||||||
|
|
||||||
|
Make sure read_ahead pointer is not NULL when quering for RA.
|
||||||
|
---
|
||||||
|
lib/activate/dev_manager.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/lib/activate/dev_manager.c b/lib/activate/dev_manager.c
|
||||||
|
index d281b60..4e7a631 100644
|
||||||
|
--- a/lib/activate/dev_manager.c
|
||||||
|
+++ b/lib/activate/dev_manager.c
|
||||||
|
@@ -258,7 +258,7 @@ static int _info_run(const char *dlid, struct dm_info *dminfo,
|
||||||
|
with_open_count, with_flush, 0)))
|
||||||
|
return_0;
|
||||||
|
|
||||||
|
- if (with_read_ahead && dminfo->exists) {
|
||||||
|
+ if (with_read_ahead && read_ahead && dminfo->exists) {
|
||||||
|
if (!dm_task_get_read_ahead(dmt, read_ahead))
|
||||||
|
goto_out;
|
||||||
|
} else if (read_ahead)
|
||||||
|
--
|
||||||
|
2.19.1
|
||||||
|
|
||||||
33
6045-lvmcache-free-resource-on-error-path.patch
Normal file
33
6045-lvmcache-free-resource-on-error-path.patch
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
From 34bde8b6c7e517239a05334683a09f2b5075fdcc Mon Sep 17 00:00:00 2001
|
||||||
|
From: Zdenek Kabelac <zkabelac@redhat.com>
|
||||||
|
Date: Fri, 8 Nov 2019 12:51:48 +0100
|
||||||
|
Subject: [PATCH 171/180] lvmcache: free resource on error path
|
||||||
|
|
||||||
|
Free allocated svg on error path.
|
||||||
|
Also explicitely ignore dm_strncpy() result.
|
||||||
|
(We know it will end with failure here.)
|
||||||
|
---
|
||||||
|
lib/cache/lvmcache.c | 4 +++-
|
||||||
|
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/lib/cache/lvmcache.c b/lib/cache/lvmcache.c
|
||||||
|
index 9890325..c12ec2b 100644
|
||||||
|
--- a/lib/cache/lvmcache.c
|
||||||
|
+++ b/lib/cache/lvmcache.c
|
||||||
|
@@ -325,10 +325,12 @@ void lvmcache_save_vg(struct volume_group *vg, int precommitted)
|
||||||
|
|
||||||
|
dm_list_init(&svg->saved_vg_to_free);
|
||||||
|
|
||||||
|
- dm_strncpy(svg->vgid, (const char *)vg->id.uuid, sizeof(svg->vgid));
|
||||||
|
+ /* Ignore result code, size we intentionally short-cut & pad with 0 */
|
||||||
|
+ (void) dm_strncpy(svg->vgid, (const char *)vg->id.uuid, sizeof(svg->vgid));
|
||||||
|
|
||||||
|
if (!dm_hash_insert(_saved_vg_hash, svg->vgid, svg)) {
|
||||||
|
log_error("lvmcache: failed to insert saved_vg %s", svg->vgid);
|
||||||
|
+ dm_free(svg);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
||||||
27
6046-daemons-check-for-non-zero-thread_id.patch
Normal file
27
6046-daemons-check-for-non-zero-thread_id.patch
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
From bbdcdc12b2240e00f6ab8ff105e954629412b234 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Zdenek Kabelac <zkabelac@redhat.com>
|
||||||
|
Date: Fri, 8 Nov 2019 13:10:49 +0100
|
||||||
|
Subject: [PATCH 173/180] daemons: check for non-zero thread_id
|
||||||
|
|
||||||
|
Do not call pthread_join if thread_id would be 0.
|
||||||
|
---
|
||||||
|
libdaemon/server/daemon-server.c | 3 ++-
|
||||||
|
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/libdaemon/server/daemon-server.c b/libdaemon/server/daemon-server.c
|
||||||
|
index aa9ff2a..9408440 100644
|
||||||
|
--- a/libdaemon/server/daemon-server.c
|
||||||
|
+++ b/libdaemon/server/daemon-server.c
|
||||||
|
@@ -560,7 +560,8 @@ static void _reap(daemon_state s, int waiting)
|
||||||
|
|
||||||
|
while (ts) {
|
||||||
|
if (waiting || !ts->active) {
|
||||||
|
- if ((errno = pthread_join(ts->client.thread_id, &rv)))
|
||||||
|
+ if (ts->client.thread_id &&
|
||||||
|
+ (errno = pthread_join(ts->client.thread_id, &rv)))
|
||||||
|
ERROR(&s, "pthread_join failed: %s", strerror(errno));
|
||||||
|
last->next = ts->next;
|
||||||
|
dm_free(ts);
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
||||||
@ -0,0 +1,28 @@
|
|||||||
|
From 7517074585ca042c0bd06481a359d617fabdc032 Mon Sep 17 00:00:00 2001
|
||||||
|
From: wangjufeng <wangjufeng@huawei.com>
|
||||||
|
Date: Wed, 20 Nov 2019 17:37:03 +0800
|
||||||
|
Subject: [PATCH] revert "label_scan: remove extra label scan and read for
|
||||||
|
orphan PVs"
|
||||||
|
|
||||||
|
In commit 79c4971210a6337563ffa2fca08fb636423d93d4, it removed the
|
||||||
|
modification of *consistent in vg_read_orphans(), it will lead to pvs
|
||||||
|
--readonly return failure.
|
||||||
|
---
|
||||||
|
lib/metadata/metadata.c | 1 +
|
||||||
|
1 file changed, 1 insertion(+)
|
||||||
|
|
||||||
|
diff --git a/lib/metadata/metadata.c b/lib/metadata/metadata.c
|
||||||
|
index 237e57b..35f35bd 100644
|
||||||
|
--- a/lib/metadata/metadata.c
|
||||||
|
+++ b/lib/metadata/metadata.c
|
||||||
|
@@ -3426,6 +3426,7 @@ struct volume_group *vg_read_orphans(struct cmd_context *cmd,
|
||||||
|
if (!lvmcache_foreach_pv(vginfo, _vg_read_orphan_pv, &baton))
|
||||||
|
return_NULL;
|
||||||
|
|
||||||
|
+ *consistent = 1;
|
||||||
|
return vg;
|
||||||
|
}
|
||||||
|
|
||||||
|
--
|
||||||
|
2.19.1
|
||||||
|
|
||||||
@ -3,8 +3,6 @@ From: geruijun <geruijun@huawei.com>
|
|||||||
Date: Thu, 14 Feb 2019 04:55:01 -0500
|
Date: Thu, 14 Feb 2019 04:55:01 -0500
|
||||||
Subject: [PATCH] lvm2: add 0002-bugfix-lvm2-add-SSD.patch
|
Subject: [PATCH] lvm2: add 0002-bugfix-lvm2-add-SSD.patch
|
||||||
|
|
||||||
DTS/AR:
|
|
||||||
reason:
|
|
||||||
---
|
---
|
||||||
conf/example.conf.in | 1 +
|
conf/example.conf.in | 1 +
|
||||||
1 file changed, 1 insertion(+)
|
1 file changed, 1 insertion(+)
|
||||||
|
|||||||
22
lvm2.spec
22
lvm2.spec
@ -43,7 +43,7 @@
|
|||||||
|
|
||||||
Name: lvm2
|
Name: lvm2
|
||||||
Version: 2.02.181
|
Version: 2.02.181
|
||||||
Release: 3
|
Release: 4
|
||||||
Epoch: 8
|
Epoch: 8
|
||||||
Summary: Tools for logical volume management
|
Summary: Tools for logical volume management
|
||||||
License: GPLv2 and LGPLv2
|
License: GPLv2 and LGPLv2
|
||||||
@ -90,6 +90,16 @@ Patch6034: 6034-mangenerator-check-strdup-was-successfull.patch
|
|||||||
Patch6035: 6035-cov-ensure-lock_type-is-not-NULL.patch
|
Patch6035: 6035-cov-ensure-lock_type-is-not-NULL.patch
|
||||||
Patch6036: 6036-Remove-checking-for-locked-VGs.patch
|
Patch6036: 6036-Remove-checking-for-locked-VGs.patch
|
||||||
Patch6037: 6037-lvm2-default-allow-changes-with-duplicate-pvs.patch
|
Patch6037: 6037-lvm2-default-allow-changes-with-duplicate-pvs.patch
|
||||||
|
Patch6038: 6038-lvmetad-fix-sync-cache-to-lvmetad.patch
|
||||||
|
Patch6039: 6039-libdaemon-use-pselect-to-avoid-condition-checking-ra.patch
|
||||||
|
Patch6040: 6040-libdaemon-ensure-threads-are-reaped-before-checking-.patch
|
||||||
|
Patch6041: 6041-lvmetad-fix-timeout-on-shutdown.patch
|
||||||
|
Patch6042: 6042-devs-check-for-no-dev-when-dropping-aliases.patch
|
||||||
|
Patch6043: 6043-cov-missing-checks-of-syscalls.patch
|
||||||
|
Patch6044: 6044-cov-ensure-read_ahead-is-available.patch
|
||||||
|
Patch6045: 6045-lvmcache-free-resource-on-error-path.patch
|
||||||
|
Patch6046: 6046-daemons-check-for-non-zero-thread_id.patch
|
||||||
|
Patch6047: 6047-revert-label_scan-remove-extra-label-scan-and-read-f.patch
|
||||||
|
|
||||||
Patch9000: 9000-bugfix-lvm2-add-SSD.patch
|
Patch9000: 9000-bugfix-lvm2-add-SSD.patch
|
||||||
Patch9001: 9001-bugfix-add-timeout-when-fail-to-wait-udev.patch
|
Patch9001: 9001-bugfix-add-timeout-when-fail-to-wait-udev.patch
|
||||||
@ -534,11 +544,17 @@ fi
|
|||||||
|
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
* Sat Nov 30 2019 zoujing<zoujing13@huawei.com> - 2.02.181-3
|
* Mon Dec 23 2019 openEuler Buildteam <buildteam@openeuler.org> - 8:2.02.181-4
|
||||||
|
- Type:bugfix
|
||||||
|
- ID:NA
|
||||||
|
- SUG:NA
|
||||||
|
- DESC:sync bugfix from community
|
||||||
|
|
||||||
|
* Sat Nov 30 2019 openEuler Buildteam <buildteam@openeuler.org> - 8:2.02.181-3
|
||||||
- Type:NA
|
- Type:NA
|
||||||
- ID:NA
|
- ID:NA
|
||||||
- SUG:NA
|
- SUG:NA
|
||||||
- DESC:remove some buildrequires in spec
|
- DESC:remove some buildrequires in spec
|
||||||
|
|
||||||
* Fri Sep 06 2019 wangjufeng <wangjufeng@huawei.com> - 2.02.181-2
|
* Fri Sep 06 2019 openEuler Buildteam <buildteam@openeuler.org> - 8:2.02.181-2
|
||||||
- Package init
|
- Package init
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user