Compare commits
No commits in common. "c8" and "c9-beta" have entirely different histories.
@ -1 +1 @@
|
|||||||
821112426f474123d090c570153d67468c4e0c11 SOURCES/dlm-4.1.0.tar.gz
|
cfcf0a3ad4ed838703e5b4d9117fa1bf6450646b SOURCES/dlm-4.3.0.tar.gz
|
||||||
|
|||||||
2
.gitignore
vendored
2
.gitignore
vendored
@ -1 +1 @@
|
|||||||
SOURCES/dlm-4.1.0.tar.gz
|
SOURCES/dlm-4.3.0.tar.gz
|
||||||
|
|||||||
@ -1,232 +0,0 @@
|
|||||||
From 7b6c22b254181a2b1921a4c31228fc8920b5547e Mon Sep 17 00:00:00 2001
|
|
||||||
From: Alexander Aring <aahringo@redhat.com>
|
|
||||||
Date: Fri, 13 Jan 2023 17:33:31 -0500
|
|
||||||
Subject: [PATCH 1/3] dlm_controld: better uevent filtering
|
|
||||||
|
|
||||||
When I did test with dlm_locktorture module I got several log messages
|
|
||||||
about:
|
|
||||||
|
|
||||||
uevent message has 3 args: add@/module/dlm_locktorture
|
|
||||||
uevent message has 3 args: remove@/module/dlm_locktorture
|
|
||||||
|
|
||||||
which are not expected and not able to parse by dlm_controld
|
|
||||||
process_uevent() function, because mismatch of argument counts.
|
|
||||||
Debugging it more, I figured out that those uevents are for
|
|
||||||
loading/unloading the dlm_locktorture module and there are uevents for
|
|
||||||
loading and unloading modules which have nothing todo with dlm lockspace
|
|
||||||
uevent handling.
|
|
||||||
|
|
||||||
The current filter works as:
|
|
||||||
|
|
||||||
if (!strstr(buf, "dlm"))
|
|
||||||
|
|
||||||
for matching the dlm joining/leaving uevent string which looks like:
|
|
||||||
|
|
||||||
offline@/kernel/dlm/locktorture
|
|
||||||
|
|
||||||
to avoid matching with other uevent which has somehow the string "dlm"
|
|
||||||
in it, we switch to the match the uevent env variables for action,
|
|
||||||
devpath (just to check if it's set) and subsystem. Additional the dlm
|
|
||||||
subsystem sets the LOCKSPACE variable which can be used to get the
|
|
||||||
lockspace name instead of extracting it previously from the devpath.
|
|
||||||
|
|
||||||
The code to decode the uevent envs were taken from the gfs2_controld
|
|
||||||
utility [0].
|
|
||||||
|
|
||||||
[0] https://github.com/andyprice/gfs2-utils/blob/91c3e9a69ed70d3d522f5b47015da5e5868722ec/group/gfs_controld/main.c
|
|
||||||
---
|
|
||||||
dlm_controld/main.c | 126 +++++++++++++++++++++++++-------------------
|
|
||||||
1 file changed, 71 insertions(+), 55 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/dlm_controld/main.c b/dlm_controld/main.c
|
|
||||||
index c35756d4..74a5e61b 100644
|
|
||||||
--- a/dlm_controld/main.c
|
|
||||||
+++ b/dlm_controld/main.c
|
|
||||||
@@ -46,6 +46,50 @@ struct client {
|
|
||||||
struct lockspace *ls;
|
|
||||||
};
|
|
||||||
|
|
||||||
+enum {
|
|
||||||
+ Env_ACTION = 0,
|
|
||||||
+ Env_DEVPATH,
|
|
||||||
+ Env_SUBSYSTEM,
|
|
||||||
+ Env_LOCKSPACE,
|
|
||||||
+ Env_Last, /* Flag for end of vars */
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+static const char *uevent_vars[] = {
|
|
||||||
+ [Env_ACTION] = "ACTION=",
|
|
||||||
+ [Env_DEVPATH] = "DEVPATH=",
|
|
||||||
+ [Env_SUBSYSTEM] = "SUBSYSTEM=",
|
|
||||||
+ [Env_LOCKSPACE] = "LOCKSPACE=",
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+static void decode_uevent(const char *buf, unsigned len, const char *vars[],
|
|
||||||
+ unsigned nvars, const char *vals[])
|
|
||||||
+{
|
|
||||||
+ const char *ptr;
|
|
||||||
+ unsigned int i;
|
|
||||||
+ int slen, vlen;
|
|
||||||
+
|
|
||||||
+ memset(vals, 0, sizeof(const char *) * nvars);
|
|
||||||
+
|
|
||||||
+ while (len > 0) {
|
|
||||||
+ ptr = buf;
|
|
||||||
+ slen = strlen(ptr);
|
|
||||||
+ buf += slen;
|
|
||||||
+ len -= slen;
|
|
||||||
+ buf++;
|
|
||||||
+ len--;
|
|
||||||
+
|
|
||||||
+ for (i = 0; i < nvars; i++) {
|
|
||||||
+ vlen = strlen(vars[i]);
|
|
||||||
+ if (vlen > slen)
|
|
||||||
+ continue;
|
|
||||||
+ if (memcmp(vars[i], ptr, vlen) != 0)
|
|
||||||
+ continue;
|
|
||||||
+ vals[i] = ptr + vlen;
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
int do_read(int fd, void *buf, size_t count)
|
|
||||||
{
|
|
||||||
int rv, off = 0;
|
|
||||||
@@ -627,38 +671,6 @@ static void fs_register_del(char *name)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
-#define MAXARGS 8
|
|
||||||
-
|
|
||||||
-static char *get_args(char *buf, int *argc, char **argv, char sep, int want)
|
|
||||||
-{
|
|
||||||
- char *p = buf, *rp = NULL;
|
|
||||||
- int i;
|
|
||||||
-
|
|
||||||
- argv[0] = p;
|
|
||||||
-
|
|
||||||
- for (i = 1; i < MAXARGS; i++) {
|
|
||||||
- p = strchr(buf, sep);
|
|
||||||
- if (!p)
|
|
||||||
- break;
|
|
||||||
- *p = '\0';
|
|
||||||
-
|
|
||||||
- if (want == i) {
|
|
||||||
- rp = p + 1;
|
|
||||||
- break;
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
- argv[i] = p + 1;
|
|
||||||
- buf = p + 1;
|
|
||||||
- }
|
|
||||||
- *argc = i;
|
|
||||||
-
|
|
||||||
- /* we ended by hitting \0, return the point following that */
|
|
||||||
- if (!rp)
|
|
||||||
- rp = strchr(buf, '\0') + 1;
|
|
||||||
-
|
|
||||||
- return rp;
|
|
||||||
-}
|
|
||||||
-
|
|
||||||
const char *dlm_mode_str(int mode)
|
|
||||||
{
|
|
||||||
switch (mode) {
|
|
||||||
@@ -686,13 +698,12 @@ const char *dlm_mode_str(int mode)
|
|
||||||
|
|
||||||
static void process_uevent(int ci)
|
|
||||||
{
|
|
||||||
+ const char *uevent_vals[Env_Last];
|
|
||||||
struct lockspace *ls;
|
|
||||||
char buf[MAX_LINE_UEVENT];
|
|
||||||
- char *argv[MAXARGS], *act, *sys;
|
|
||||||
- int rv, argc = 0;
|
|
||||||
+ int rv;
|
|
||||||
|
|
||||||
memset(buf, 0, sizeof(buf));
|
|
||||||
- memset(argv, 0, sizeof(char *) * MAXARGS);
|
|
||||||
|
|
||||||
retry_recv:
|
|
||||||
rv = recv(client[ci].fd, &buf, sizeof(buf), 0);
|
|
||||||
@@ -704,35 +715,38 @@ static void process_uevent(int ci)
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
- if (!strstr(buf, "dlm"))
|
|
||||||
- return;
|
|
||||||
+ decode_uevent(buf, rv, uevent_vars, Env_Last, uevent_vals);
|
|
||||||
|
|
||||||
- log_debug("uevent: %s", buf);
|
|
||||||
-
|
|
||||||
- get_args(buf, &argc, argv, '/', 4);
|
|
||||||
- if (argc != 4)
|
|
||||||
- log_error("uevent message has %d args", argc);
|
|
||||||
- act = argv[0];
|
|
||||||
- sys = argv[2];
|
|
||||||
-
|
|
||||||
- if (!act || !sys || !argv[3])
|
|
||||||
+ if (!uevent_vals[Env_ACTION] ||
|
|
||||||
+ !uevent_vals[Env_DEVPATH] ||
|
|
||||||
+ !uevent_vals[Env_SUBSYSTEM] ||
|
|
||||||
+ !uevent_vals[Env_LOCKSPACE]) {
|
|
||||||
+ log_debug("failed to validate uevent, action: %p, devpath: %p, subsystem: %p, lockspace: %p",
|
|
||||||
+ uevent_vals[Env_ACTION], uevent_vals[Env_DEVPATH],
|
|
||||||
+ uevent_vals[Env_SUBSYSTEM],
|
|
||||||
+ uevent_vals[Env_LOCKSPACE]);
|
|
||||||
return;
|
|
||||||
+ }
|
|
||||||
|
|
||||||
- if (strncmp(sys, "dlm", 3))
|
|
||||||
+ if (strcmp(uevent_vals[Env_SUBSYSTEM], "dlm")) {
|
|
||||||
+ log_debug("uevent looks like dlm but came not from dlm subsystem");
|
|
||||||
return;
|
|
||||||
+ }
|
|
||||||
|
|
||||||
- log_debug("kernel: %s %s", act, argv[3]);
|
|
||||||
+ log_debug("uevent action: %s, devpath: %s, devpath: %s, lockspace: %s",
|
|
||||||
+ uevent_vals[Env_ACTION], uevent_vals[Env_SUBSYSTEM],
|
|
||||||
+ uevent_vals[Env_DEVPATH], uevent_vals[Env_LOCKSPACE]);
|
|
||||||
|
|
||||||
rv = 0;
|
|
||||||
|
|
||||||
- if (!strcmp(act, "online@")) {
|
|
||||||
- ls = find_ls(argv[3]);
|
|
||||||
+ if (!strcmp(uevent_vals[Env_ACTION], "online")) {
|
|
||||||
+ ls = find_ls(uevent_vals[Env_LOCKSPACE]);
|
|
||||||
if (ls) {
|
|
||||||
rv = -EEXIST;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
- ls = create_ls(argv[3]);
|
|
||||||
+ ls = create_ls(uevent_vals[Env_LOCKSPACE]);
|
|
||||||
if (!ls) {
|
|
||||||
rv = -ENOMEM;
|
|
||||||
goto out;
|
|
||||||
@@ -747,8 +761,8 @@ static void process_uevent(int ci)
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
- } else if (!strcmp(act, "offline@")) {
|
|
||||||
- ls = find_ls(argv[3]);
|
|
||||||
+ } else if (!strcmp(uevent_vals[Env_ACTION], "offline")) {
|
|
||||||
+ ls = find_ls(uevent_vals[Env_LOCKSPACE]);
|
|
||||||
if (!ls) {
|
|
||||||
rv = -ENOENT;
|
|
||||||
goto out;
|
|
||||||
@@ -758,8 +772,10 @@ static void process_uevent(int ci)
|
|
||||||
}
|
|
||||||
out:
|
|
||||||
if (rv < 0)
|
|
||||||
- log_error("process_uevent %s error %d errno %d",
|
|
||||||
- act, rv, errno);
|
|
||||||
+ log_error("%s action: %s, devpath: %s, devpath: %s, lockspace: %s - error %d errno %d",
|
|
||||||
+ __func__, uevent_vals[Env_ACTION],
|
|
||||||
+ uevent_vals[Env_SUBSYSTEM], uevent_vals[Env_DEVPATH],
|
|
||||||
+ uevent_vals[Env_LOCKSPACE], rv, errno);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int setup_uevent(void)
|
|
||||||
--
|
|
||||||
2.43.0
|
|
||||||
|
|
||||||
@ -1,75 +0,0 @@
|
|||||||
From b6f52406411d2421d0614244080cf7bc668c336b Mon Sep 17 00:00:00 2001
|
|
||||||
From: David Teigland <teigland@redhat.com>
|
|
||||||
Date: Tue, 13 Jan 2026 16:59:25 -0600
|
|
||||||
Subject: [PATCH dlm/tool] dlm_controld: send plock operations without resource
|
|
||||||
lookup
|
|
||||||
|
|
||||||
When plock_ownership mode is disabled, a plock operation read from
|
|
||||||
the kernel can be sent to all nodes immediately, without looking up
|
|
||||||
the local resource struct. This is faster, and it avoids a bug in
|
|
||||||
cases where multiple threads in a process submit concurrent fcntl
|
|
||||||
lock ops on a file.
|
|
||||||
|
|
||||||
This bug occurs because create/free of the resource struct should
|
|
||||||
only be done in the context of ordered receive_plock cpg messages.
|
|
||||||
plock unlock results were being incorrectly returned based on the
|
|
||||||
non-existence of a struct resource checked in process_plocks (outside
|
|
||||||
of the ordered message context.) In this case, the existence of the
|
|
||||||
resource struct was used to imply a lock state ("no locks"), which is
|
|
||||||
invalid to conclude outside of the message context. The bug would
|
|
||||||
only appear in the unusual scenario where multiple threads in a
|
|
||||||
process are running concurrent fcntl lock operations on a file.
|
|
||||||
|
|
||||||
This fix does not address the problem when plock_ownership is enabled,
|
|
||||||
so warnings are added for the plock_ownership setting.
|
|
||||||
---
|
|
||||||
dlm_controld/dlm_controld.8 | 2 ++
|
|
||||||
dlm_controld/main.c | 2 +-
|
|
||||||
dlm_controld/plock.c | 5 +++++
|
|
||||||
3 files changed, 8 insertions(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/dlm_controld/dlm_controld.8 b/dlm_controld/dlm_controld.8
|
|
||||||
index 3aab3885..3858be87 100644
|
|
||||||
--- a/dlm_controld/dlm_controld.8
|
|
||||||
+++ b/dlm_controld/dlm_controld.8
|
|
||||||
@@ -50,6 +50,8 @@ For default settings, see dlm_controld -h.
|
|
||||||
.B --plock_ownership | -o
|
|
||||||
0|1
|
|
||||||
enable/disable plock ownership
|
|
||||||
+.br
|
|
||||||
+ (WARNING: do not enable if threads perform fcntl locking.)
|
|
||||||
|
|
||||||
.B --drop_resources_time | -t
|
|
||||||
.I int
|
|
||||||
diff --git a/dlm_controld/main.c b/dlm_controld/main.c
|
|
||||||
index 2dc6b91b..728b7464 100644
|
|
||||||
--- a/dlm_controld/main.c
|
|
||||||
+++ b/dlm_controld/main.c
|
|
||||||
@@ -1841,7 +1841,7 @@ static void set_opt_defaults(void)
|
|
||||||
set_opt_default(plock_ownership_ind,
|
|
||||||
"plock_ownership", 'o', req_arg_bool,
|
|
||||||
0, NULL, 0,
|
|
||||||
- "enable/disable plock ownership");
|
|
||||||
+ "enable/disable plock ownership (do not enable if threads do fcntl locking)");
|
|
||||||
|
|
||||||
set_opt_default(drop_resources_time_ind,
|
|
||||||
"drop_resources_time", 't', req_arg_int,
|
|
||||||
diff --git a/dlm_controld/plock.c b/dlm_controld/plock.c
|
|
||||||
index 992fb16f..56ea9765 100644
|
|
||||||
--- a/dlm_controld/plock.c
|
|
||||||
+++ b/dlm_controld/plock.c
|
|
||||||
@@ -1569,6 +1569,11 @@ void process_plocks(int ci)
|
|
||||||
plock_rate_delays = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
+ if (!opt(plock_ownership_ind)) {
|
|
||||||
+ send_plock(ls, NULL, &info);
|
|
||||||
+ return;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
create = (info.optype == DLM_PLOCK_OP_UNLOCK) ? 0 : 1;
|
|
||||||
|
|
||||||
rv = find_resource(ls, info.number, create, &r);
|
|
||||||
--
|
|
||||||
2.43.0
|
|
||||||
|
|
||||||
@ -1,26 +0,0 @@
|
|||||||
From 615e7936d39248de09dc9c5e7570463387f7d139 Mon Sep 17 00:00:00 2001
|
|
||||||
From: David Teigland <teigland@redhat.com>
|
|
||||||
Date: Thu, 15 Aug 2024 11:05:54 -0500
|
|
||||||
Subject: [PATCH 2/3] dlm_controld: terminate uevent buffer
|
|
||||||
|
|
||||||
for checker
|
|
||||||
---
|
|
||||||
dlm_controld/main.c | 2 ++
|
|
||||||
1 file changed, 2 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/dlm_controld/main.c b/dlm_controld/main.c
|
|
||||||
index 74a5e61b..1828428c 100644
|
|
||||||
--- a/dlm_controld/main.c
|
|
||||||
+++ b/dlm_controld/main.c
|
|
||||||
@@ -715,6 +715,8 @@ static void process_uevent(int ci)
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
+ buf[MAX_LINE_UEVENT-1] = '\0';
|
|
||||||
+
|
|
||||||
decode_uevent(buf, rv, uevent_vars, Env_Last, uevent_vals);
|
|
||||||
|
|
||||||
if (!uevent_vals[Env_ACTION] ||
|
|
||||||
--
|
|
||||||
2.43.0
|
|
||||||
|
|
||||||
@ -1,232 +0,0 @@
|
|||||||
From d317347643ec2610bbbd390493cf5e920f4ddd79 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Alexander Aring <aahringo@redhat.com>
|
|
||||||
Date: Fri, 22 Nov 2024 12:45:36 -0500
|
|
||||||
Subject: [PATCH 3/3] dlm_controld: handle RELEASE_RECOVER event env
|
|
||||||
|
|
||||||
Newer kernels might sending an additional attribute for the leaving lockspace
|
|
||||||
event "RELEASE_RECOVER" to tell other nodes from the release lockspace
|
|
||||||
initator to call the recover_slot() callback in their recovery handling
|
|
||||||
as a membership update triggers in-kernel recovery.
|
|
||||||
---
|
|
||||||
dlm_controld/action.c | 33 ++++++++++++++++++
|
|
||||||
dlm_controld/cpg.c | 72 ++++++++++++++++++++++++++++++++++++++-
|
|
||||||
dlm_controld/dlm_daemon.h | 6 +++-
|
|
||||||
dlm_controld/main.c | 4 ++-
|
|
||||||
4 files changed, 112 insertions(+), 3 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/dlm_controld/action.c b/dlm_controld/action.c
|
|
||||||
index 0eff2799..6d23a330 100644
|
|
||||||
--- a/dlm_controld/action.c
|
|
||||||
+++ b/dlm_controld/action.c
|
|
||||||
@@ -240,6 +240,39 @@ int path_exists(const char *path)
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
+int set_configfs_member_release_recover(struct lockspace *ls, int id,
|
|
||||||
+ uint32_t release_recover)
|
|
||||||
+{
|
|
||||||
+ char path[PATH_MAX];
|
|
||||||
+ char buf[32];
|
|
||||||
+ int fd, rv;
|
|
||||||
+
|
|
||||||
+ memset(path, 0, PATH_MAX);
|
|
||||||
+ snprintf(path, PATH_MAX, "%s/%s/nodes/%d/release_recover",
|
|
||||||
+ SPACES_DIR, ls->name, id);
|
|
||||||
+
|
|
||||||
+ rv = fd = open(path, O_WRONLY);
|
|
||||||
+ if (rv < 0) {
|
|
||||||
+ log_error("%s: open failed: %d", path, errno);
|
|
||||||
+ goto out;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ memset(buf, 0, 32);
|
|
||||||
+ snprintf(buf, 32, "%u", release_recover);
|
|
||||||
+
|
|
||||||
+ rv = do_write(fd, buf, strlen(buf));
|
|
||||||
+ if (rv < 0) {
|
|
||||||
+ log_error("%s: write failed: %d, %s", path, errno, buf);
|
|
||||||
+ close(fd);
|
|
||||||
+ goto out;
|
|
||||||
+ }
|
|
||||||
+ close(fd);
|
|
||||||
+ rv = 0;
|
|
||||||
+
|
|
||||||
+out:
|
|
||||||
+ return rv;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
/* The "renew" nodes are those that have left and rejoined since the last
|
|
||||||
call to set_members(). We rmdir/mkdir for these nodes so dlm-kernel
|
|
||||||
can notice they've left and rejoined. */
|
|
||||||
diff --git a/dlm_controld/cpg.c b/dlm_controld/cpg.c
|
|
||||||
index f3365ee4..10139664 100644
|
|
||||||
--- a/dlm_controld/cpg.c
|
|
||||||
+++ b/dlm_controld/cpg.c
|
|
||||||
@@ -1057,6 +1057,23 @@ static void receive_start(struct lockspace *ls, struct dlm_header *hd, int len)
|
|
||||||
memb->start = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
+static void receive_release_recover(struct lockspace *ls,
|
|
||||||
+ struct dlm_header *hd, int len)
|
|
||||||
+{
|
|
||||||
+ uint32_t release_recover = hd->msgdata;
|
|
||||||
+
|
|
||||||
+ log_dlock(ls, "%s %d: len %d release_recover %u", __func__,
|
|
||||||
+ hd->nodeid, len, release_recover);
|
|
||||||
+
|
|
||||||
+ if (hd->nodeid == our_nodeid)
|
|
||||||
+ return;
|
|
||||||
+
|
|
||||||
+ /* try to set members release recover setting before removing to
|
|
||||||
+ * tell other nodes the release recover option from the initiator.
|
|
||||||
+ */
|
|
||||||
+ set_configfs_member_release_recover(ls, hd->nodeid, release_recover);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
static void receive_plocks_done(struct lockspace *ls, struct dlm_header *hd,
|
|
||||||
int len)
|
|
||||||
{
|
|
||||||
@@ -1170,6 +1187,43 @@ static void send_info(struct lockspace *ls, struct change *cg, int type,
|
|
||||||
free(buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
+static void send_release_recover_msg(struct lockspace *ls, int type,
|
|
||||||
+ unsigned long release_recover)
|
|
||||||
+{
|
|
||||||
+ struct dlm_header *hd;
|
|
||||||
+ char *buf;
|
|
||||||
+ int len;
|
|
||||||
+
|
|
||||||
+ len = sizeof(struct dlm_header);
|
|
||||||
+
|
|
||||||
+ buf = malloc(len);
|
|
||||||
+ if (!buf) {
|
|
||||||
+ log_error("send_info len %d no mem", len);
|
|
||||||
+ return;
|
|
||||||
+ }
|
|
||||||
+ memset(buf, 0, len);
|
|
||||||
+
|
|
||||||
+ hd = (struct dlm_header *)buf;
|
|
||||||
+
|
|
||||||
+ /* fill in header (dlm_send_message handles part of header) */
|
|
||||||
+
|
|
||||||
+ hd->type = type;
|
|
||||||
+ hd->msgdata = release_recover;
|
|
||||||
+
|
|
||||||
+ dlm_send_message(ls, buf, len);
|
|
||||||
+
|
|
||||||
+ free(buf);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static void send_release_recover(struct lockspace *ls,
|
|
||||||
+ unsigned long release_recover)
|
|
||||||
+{
|
|
||||||
+ log_group(ls, "%s %d: counts %u release_recover: %ld", __func__,
|
|
||||||
+ our_nodeid, ls->started_count, release_recover);
|
|
||||||
+
|
|
||||||
+ send_release_recover_msg(ls, DLM_MSG_RELEASE_RECOVER, release_recover);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
/* fenced used the DUPLICATE_CG flag instead of sending nacks like we
|
|
||||||
do here. I think the nacks didn't work for fenced for some reason,
|
|
||||||
but I don't remember why (possibly because the node blocked doing
|
|
||||||
@@ -1642,6 +1696,10 @@ static void deliver_cb(cpg_handle_t handle,
|
|
||||||
hd->type, nodeid, enable_plock);
|
|
||||||
break;
|
|
||||||
|
|
||||||
+ case DLM_MSG_RELEASE_RECOVER:
|
|
||||||
+ receive_release_recover(ls, hd, len);
|
|
||||||
+ break;
|
|
||||||
+
|
|
||||||
#if 0
|
|
||||||
case DLM_MSG_DEADLK_CYCLE_START:
|
|
||||||
if (opt(enable_deadlk))
|
|
||||||
@@ -1809,12 +1867,24 @@ int dlm_join_lockspace(struct lockspace *ls)
|
|
||||||
|
|
||||||
/* received an "offline" uevent from dlm-kernel */
|
|
||||||
|
|
||||||
-int dlm_leave_lockspace(struct lockspace *ls)
|
|
||||||
+int dlm_leave_lockspace(struct lockspace *ls, const char *release_recover_str)
|
|
||||||
{
|
|
||||||
cs_error_t error;
|
|
||||||
struct cpg_name name;
|
|
||||||
+ unsigned long release_recover;
|
|
||||||
int i = 0;
|
|
||||||
|
|
||||||
+ if (release_recover_str) {
|
|
||||||
+ release_recover = strtoul(release_recover_str, NULL, 0);
|
|
||||||
+ if (release_recover == ULONG_MAX) {
|
|
||||||
+ log_error("failed to parse release recover: %s",
|
|
||||||
+ release_recover_str);
|
|
||||||
+ return errno;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ send_release_recover(ls, release_recover);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
ls->leaving = 1;
|
|
||||||
|
|
||||||
memset(&name, 0, sizeof(name));
|
|
||||||
diff --git a/dlm_controld/dlm_daemon.h b/dlm_controld/dlm_daemon.h
|
|
||||||
index 45b295ea..119eb543 100644
|
|
||||||
--- a/dlm_controld/dlm_daemon.h
|
|
||||||
+++ b/dlm_controld/dlm_daemon.h
|
|
||||||
@@ -236,6 +236,7 @@ enum {
|
|
||||||
DLM_MSG_RUN_REQUEST,
|
|
||||||
DLM_MSG_RUN_REPLY,
|
|
||||||
DLM_MSG_RUN_CANCEL,
|
|
||||||
+ DLM_MSG_RELEASE_RECOVER,
|
|
||||||
};
|
|
||||||
|
|
||||||
/* dlm_header flags */
|
|
||||||
@@ -367,6 +368,8 @@ int set_sysfs_control(char *name, int val);
|
|
||||||
int set_sysfs_event_done(char *name, int val);
|
|
||||||
int set_sysfs_id(char *name, uint32_t id);
|
|
||||||
int set_sysfs_nodir(char *name, int val);
|
|
||||||
+int set_configfs_member_release_recover(struct lockspace *ls, int id,
|
|
||||||
+ uint32_t release_recover);
|
|
||||||
int set_configfs_members(struct lockspace *ls, char *name,
|
|
||||||
int new_count, int *new_members,
|
|
||||||
int renew_count, int *renew_members);
|
|
||||||
@@ -389,7 +392,8 @@ void setup_lockspace_config(struct lockspace *ls);
|
|
||||||
void process_lockspace_changes(void);
|
|
||||||
void process_fencing_changes(void);
|
|
||||||
int dlm_join_lockspace(struct lockspace *ls);
|
|
||||||
-int dlm_leave_lockspace(struct lockspace *ls);
|
|
||||||
+int dlm_leave_lockspace(struct lockspace *ls,
|
|
||||||
+ const char *release_recover_str);
|
|
||||||
void update_flow_control_status(void);
|
|
||||||
int set_node_info(struct lockspace *ls, int nodeid, struct dlmc_node *node);
|
|
||||||
int set_lockspace_info(struct lockspace *ls, struct dlmc_lockspace *lockspace);
|
|
||||||
diff --git a/dlm_controld/main.c b/dlm_controld/main.c
|
|
||||||
index 1828428c..2dc6b91b 100644
|
|
||||||
--- a/dlm_controld/main.c
|
|
||||||
+++ b/dlm_controld/main.c
|
|
||||||
@@ -51,6 +51,7 @@ enum {
|
|
||||||
Env_DEVPATH,
|
|
||||||
Env_SUBSYSTEM,
|
|
||||||
Env_LOCKSPACE,
|
|
||||||
+ Env_RELEASE_RECOVER,
|
|
||||||
Env_Last, /* Flag for end of vars */
|
|
||||||
};
|
|
||||||
|
|
||||||
@@ -59,6 +60,7 @@ static const char *uevent_vars[] = {
|
|
||||||
[Env_DEVPATH] = "DEVPATH=",
|
|
||||||
[Env_SUBSYSTEM] = "SUBSYSTEM=",
|
|
||||||
[Env_LOCKSPACE] = "LOCKSPACE=",
|
|
||||||
+ [Env_RELEASE_RECOVER] = "RELEASE_RECOVER=",
|
|
||||||
};
|
|
||||||
|
|
||||||
static void decode_uevent(const char *buf, unsigned len, const char *vars[],
|
|
||||||
@@ -770,7 +772,7 @@ static void process_uevent(int ci)
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
- dlm_leave_lockspace(ls);
|
|
||||||
+ dlm_leave_lockspace(ls, uevent_vals[Env_RELEASE_RECOVER]);
|
|
||||||
}
|
|
||||||
out:
|
|
||||||
if (rv < 0)
|
|
||||||
--
|
|
||||||
2.43.0
|
|
||||||
|
|
||||||
@ -1,31 +1,26 @@
|
|||||||
Name: dlm
|
Name: dlm
|
||||||
Version: 4.1.0
|
Version: 4.3.0
|
||||||
Release: 3%{?dist}
|
Release: 1%{?dist}
|
||||||
License: GPLv2 and GPLv2+ and LGPLv2+
|
License: GPLv2 and GPLv2+ and LGPLv2+
|
||||||
# For a breakdown of the licensing, see README.license
|
# For a breakdown of the licensing, see README.license
|
||||||
Group: System Environment/Kernel
|
|
||||||
Summary: dlm control daemon and tool
|
Summary: dlm control daemon and tool
|
||||||
URL: https://pagure.io/dlm
|
URL: https://pagure.io/dlm
|
||||||
|
BuildRequires: gcc
|
||||||
BuildRequires: glibc-kernheaders
|
BuildRequires: glibc-kernheaders
|
||||||
BuildRequires: corosynclib-devel >= 1.99.9
|
BuildRequires: corosynclib-devel >= 3.1.0
|
||||||
BuildRequires: pacemaker-libs-devel >= 1.1.7
|
BuildRequires: pacemaker-libs-devel >= 1.1.7
|
||||||
BuildRequires: libxml2-devel
|
BuildRequires: libxml2-devel
|
||||||
BuildRequires: systemd-units
|
BuildRequires: systemd-units
|
||||||
BuildRequires: systemd-devel
|
BuildRequires: systemd-devel
|
||||||
|
BuildRequires: make
|
||||||
Source0: https://releases.pagure.org/dlm/%{name}-%{version}.tar.gz
|
Source0: https://releases.pagure.org/dlm/%{name}-%{version}.tar.gz
|
||||||
|
|
||||||
# Patch0: 0001-foo.patch
|
|
||||||
Patch0: 0001-dlm_controld-better-uevent-filtering.patch
|
|
||||||
Patch1: 0002-dlm_controld-terminate-uevent-buffer.patch
|
|
||||||
Patch2: 0003-dlm_controld-handle-RELEASE_RECOVER-event-env.patch
|
|
||||||
Patch3: 0001-dlm_controld-send-plock-operations-without-resource-.patch
|
|
||||||
|
|
||||||
%if 0%{?rhel} && 0%{?rhel} <= 7
|
%if 0%{?rhel} && 0%{?rhel} <= 7
|
||||||
ExclusiveArch: i686 x86_64
|
ExclusiveArch: i686 x86_64
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
Requires: %{name}-lib = %{version}-%{release}
|
Requires: %{name}-lib = %{version}-%{release}
|
||||||
Requires: corosync >= 1.99.9
|
Requires: corosync >= 3.1.0
|
||||||
%{?fedora:Requires: kernel-modules-extra}
|
%{?fedora:Requires: kernel-modules-extra}
|
||||||
Requires(post): systemd-units
|
Requires(post): systemd-units
|
||||||
Requires(preun): systemd-units
|
Requires(preun): systemd-units
|
||||||
@ -37,17 +32,12 @@ The kernel dlm requires a user daemon to control membership.
|
|||||||
|
|
||||||
%prep
|
%prep
|
||||||
%setup -q
|
%setup -q
|
||||||
# %patch0 -p1 -b .0001-foo.patch
|
|
||||||
%patch0 -p1 -b .backup0
|
|
||||||
%patch1 -p1 -b .backup1
|
|
||||||
%patch2 -p1 -b .backup2
|
|
||||||
%patch3 -p1 -b .backup3
|
|
||||||
|
|
||||||
%build
|
%build
|
||||||
# upstream does not require configure
|
# upstream does not require configure
|
||||||
# upstream does not support _smp_mflags
|
# upstream does not support _smp_mflags
|
||||||
CFLAGS+=$RPM_OPT_FLAGS make
|
CFLAGS=$RPM_OPT_FLAGS make
|
||||||
CFLAGS+=$RPM_OPT_FLAGS make -C fence
|
CFLAGS=$RPM_OPT_FLAGS make -C fence
|
||||||
|
|
||||||
%install
|
%install
|
||||||
rm -rf $RPM_BUILD_ROOT
|
rm -rf $RPM_BUILD_ROOT
|
||||||
@ -67,7 +57,6 @@ install -Dm 0644 init/dlm.sysconfig %{buildroot}/etc/sysconfig/dlm
|
|||||||
%systemd_postun_with_restart dlm.service
|
%systemd_postun_with_restart dlm.service
|
||||||
|
|
||||||
%files
|
%files
|
||||||
%defattr(-,root,root,-)
|
|
||||||
%doc README.license
|
%doc README.license
|
||||||
%{_unitdir}/dlm.service
|
%{_unitdir}/dlm.service
|
||||||
%{_sbindir}/dlm_controld
|
%{_sbindir}/dlm_controld
|
||||||
@ -80,25 +69,20 @@ install -Dm 0644 init/dlm.sysconfig %{buildroot}/etc/sysconfig/dlm
|
|||||||
|
|
||||||
%package lib
|
%package lib
|
||||||
Summary: Library for %{name}
|
Summary: Library for %{name}
|
||||||
Group: System Environment/Libraries
|
|
||||||
Conflicts: clusterlib
|
Conflicts: clusterlib
|
||||||
|
|
||||||
%description lib
|
%description lib
|
||||||
The %{name}-lib package contains the libraries needed to use the dlm
|
The %{name}-lib package contains the libraries needed to use the dlm
|
||||||
from userland applications.
|
from userland applications.
|
||||||
|
|
||||||
%post lib -p /sbin/ldconfig
|
%ldconfig_scriptlets lib
|
||||||
|
|
||||||
%postun lib -p /sbin/ldconfig
|
|
||||||
|
|
||||||
%files lib
|
%files lib
|
||||||
%defattr(-,root,root,-)
|
/usr/lib/udev/rules.d/*-dlm.rules
|
||||||
%{_prefix}/lib/udev/rules.d/*-dlm.rules
|
|
||||||
%{_libdir}/libdlm*.so.*
|
%{_libdir}/libdlm*.so.*
|
||||||
|
|
||||||
%package devel
|
%package devel
|
||||||
Summary: Development files for %{name}
|
Summary: Development files for %{name}
|
||||||
Group: Development/Libraries
|
|
||||||
Requires: %{name}-lib = %{version}-%{release}
|
Requires: %{name}-lib = %{version}-%{release}
|
||||||
Conflicts: clusterlib-devel
|
Conflicts: clusterlib-devel
|
||||||
|
|
||||||
@ -107,43 +91,59 @@ The %{name}-devel package contains libraries and header files for
|
|||||||
developing applications that use %{name}.
|
developing applications that use %{name}.
|
||||||
|
|
||||||
%files devel
|
%files devel
|
||||||
%defattr(-,root,root,-)
|
|
||||||
%{_libdir}/libdlm*.so
|
%{_libdir}/libdlm*.so
|
||||||
%{_includedir}/libdlm*.h
|
%{_includedir}/libdlm*.h
|
||||||
%{_libdir}/pkgconfig/*.pc
|
%{_libdir}/pkgconfig/*.pc
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
* Tue Jan 20 2026 Alexander Aring <aahringo@redhat.com> - 4.1.0-3
|
* Wed May 15 2024 David Teigland <teigland@redhat.com> - 4.3.0-1
|
||||||
- Rebuild for posix lock issue fix
|
- new upstream version
|
||||||
Related: RHEL-140243
|
|
||||||
|
|
||||||
* Tue Dec 16 2025 Alexander Aring <aahringo@redhat.com> - 4.1.0-2
|
* Fri Oct 14 2022 David Teigland <teigland@redhat.com> - 4.2.0-2
|
||||||
- Rebuild for recover flag functionality
|
- rebuild with tests
|
||||||
Related: RHEL-136235
|
|
||||||
|
|
||||||
* Wed Jan 13 2021 David Teigland <teigland@redhat.com> - 4.1.0-1
|
* Wed Oct 12 2022 David Teigland <teigland@redhat.com> - 4.2.0-1
|
||||||
- update to 4.1.0
|
- new upstream version
|
||||||
|
|
||||||
* Wed Jan 06 2021 David Teigland <teigland@redhat.com> - 4.0.9-4
|
* Tue Feb 15 2022 David Teigland <teigland@redhat.com> - 4.1.1-2
|
||||||
- dlm_controld: use new quorum api to detect missed failures
|
- compiler warnings and makefile flags
|
||||||
|
|
||||||
* Wed Jun 12 2019 David Teigland <teigland@redhat.com> - 4.0.9-3
|
* Mon Nov 15 2021 David Teigland <teigland@redhat.com> - 4.1.1-1
|
||||||
- kick gating system
|
- new upstream version
|
||||||
|
|
||||||
* Wed Jun 12 2019 David Teigland <teigland@redhat.com> - 4.0.9-2
|
* Wed Aug 25 2021 David Teigland <teigland@redhat.com> - 4.0.9-7
|
||||||
- try to kick gating system
|
- fix pacemaker header
|
||||||
|
|
||||||
* Tue Jun 11 2019 David Teigland <teigland@redhat.com> - 4.0.9-1
|
* Mon Aug 09 2021 Mohan Boddu <mboddu@redhat.com> - 4.0.9-6
|
||||||
- update to 4.0.9
|
- Rebuilt for IMA sigs, glibc 2.34, aarch64 flags
|
||||||
|
Related: rhbz#1991688
|
||||||
|
|
||||||
* Wed Jan 23 2019 David Teigland <teigland@redhat.com> - 4.0.6-10
|
* Thu Apr 15 2021 Mohan Boddu <mboddu@redhat.com> - 4.0.9-5
|
||||||
- dlm_controld: ignore unwanted uevent strings
|
- Rebuilt for RHEL 9 BETA on Apr 15th 2021. Related: rhbz#1947937
|
||||||
|
|
||||||
* Tue Oct 02 2018 David Teigland <teigland@redhat.com> - 4.0.6-9
|
* Tue Jan 26 2021 Fedora Release Engineering <releng@fedoraproject.org> - 4.0.9-4
|
||||||
- update makefile gcc flags
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild
|
||||||
|
|
||||||
* Thu Aug 09 2018 David Teigland <teigland@redhat.com> - 4.0.6-8
|
* Mon Jul 27 2020 Fedora Release Engineering <releng@fedoraproject.org> - 4.0.9-3
|
||||||
- Work around glibc regression for major/minor header
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
|
||||||
|
|
||||||
|
* Tue Jan 28 2020 Fedora Release Engineering <releng@fedoraproject.org> - 4.0.9-2
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild
|
||||||
|
|
||||||
|
* Wed Jul 31 2019 David Teigland <teigland@redhat.com> - 4.0.9-1
|
||||||
|
- New upstream realease
|
||||||
|
|
||||||
|
* Wed Jul 24 2019 Fedora Release Engineering <releng@fedoraproject.org> - 4.0.6-11
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild
|
||||||
|
|
||||||
|
* Thu Jan 31 2019 Fedora Release Engineering <releng@fedoraproject.org> - 4.0.6-10
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild
|
||||||
|
|
||||||
|
* Thu Jul 12 2018 Fedora Release Engineering <releng@fedoraproject.org> - 4.0.6-9
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild
|
||||||
|
|
||||||
|
* Sat Mar 24 2018 Richard W.M. Jones <rjones@redhat.com> - 4.0.6-8
|
||||||
|
- Fixes for glibc 2.27, required for riscv64.
|
||||||
|
|
||||||
* Wed Feb 07 2018 Fedora Release Engineering <releng@fedoraproject.org> - 4.0.6-7
|
* Wed Feb 07 2018 Fedora Release Engineering <releng@fedoraproject.org> - 4.0.6-7
|
||||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user