Rebase to sanlock upstream release 4.1.0

Resolves: RHEL-118947
This commit is contained in:
Marian Csontos 2025-10-03 15:26:22 +02:00
parent 0e00fa1aca
commit ab3033380c
12 changed files with 10 additions and 573 deletions

1
.gitignore vendored
View File

@ -34,3 +34,4 @@
/sanlock-3.9.3.tar.gz
/sanlock-3.9.5.tar.gz
/sanlock-4.0.0.tar.gz
/sanlock-4.1.0.tar.gz

View File

@ -1,108 +0,0 @@
From 5044719a27cb41889ec08177cba977596b783e83 Mon Sep 17 00:00:00 2001
From: Nir Soffer <nsoffer@redhat.com>
Date: Sun, 2 Aug 2020 02:01:06 +0300
Subject: [PATCH] python: Remove extra link args
Fedora 33 builds fails now with:
/usr/bin/ld: /tmp/sanlock.cpython-39-x86_64-linux-gnu.so.mpvMfj.ltrans0.ltrans.o:
relocation R_X86_64_PC32 against undefined symbol `PyExc_ValueError' can
not be used when making a shared object; recompile with -fPIC
We use these extra link args:
extra_link_args=['-fPIE', '-Wl,-z,relro,-z,now'],
Looking the generated compiler command[1]:
gcc -pthread \
-shared \
-Wl,-z,relro \
-Wl,--as-needed \
-Wl,-z,now \
-g \
-Wl,-z,relro \
-Wl,--as-needed \
-Wl,-z,now \
-g \
-Wl,-z,relro \
-Wl,--as-needed \
-Wl,-z,now \
-specs=/usr/lib/rpm/redhat/redhat-hardened-ld \
-O2 \
-fexceptions \
-g \
-grecord-gcc-switches \
-pipe \
-Wall \
-Werror=format-security \
-Wp,-D_FORTIFY_SOURCE=2 \
-Wp,-D_GLIBCXX_ASSERTIONS \
-specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 \
-fstack-protector-strong \
-specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 \
-m64 \
-mtune=generic \
-fasynchronous-unwind-tables \
-fstack-clash-protection \
-fcf-protection build/temp.linux-x86_64-3.9/sanlock.o \
-L../src \
-L/usr/lib64 \
-lsanlock \
-o build/lib.linux-x86_64-3.9/sanlock.cpython-39-x86_64-linux-gnu.so \
-fPIE \
-Wl,-z,relro,-z,now
This looks like a complete mess. These arguments are repeated 3 times:
-Wl,-z,relro \
-Wl,--as-needed \
-Wl,-z,now \
And our extra compiler flags adds the forth copy.
gcc says this about -fPIE:
These options are similar to -fpic and -fPIC, but the generated
position-independent code can be only linked into executables
But our python extension is a shared object, so I don't think -fPIE
makes sense.
The extra arguments were added in:
commit a1929080a6ce51879139eb8d05a425ccd3d37082
Author: David Teigland <teigland@redhat.com>
Date: Wed Oct 14 13:21:04 2015 -0500
python: add compile flags
Without any justification. I assume the intent was good, but it looks
like this change was not needed, and somehow it worked until now.
If some hardening is needed, it should be done by python build
infrastructure, not in sanlock. And it seems that python do use some
hardening specs (e.g. -specs=/usr/lib/rpm/redhat/redhat-hardened-ld).
[1] https://kojipkgs.fedoraproject.org//work/tasks/8900/48358900/build.log
Signed-off-by: Nir Soffer <nsoffer@redhat.com>
---
python/setup.py | 1 -
1 file changed, 1 deletion(-)
diff --git a/python/setup.py b/python/setup.py
index 0f3d683..b3bfaf1 100644
--- a/python/setup.py
+++ b/python/setup.py
@@ -12,7 +12,6 @@ sanlock = Extension(name='sanlock',
include_dirs=['../src'],
library_dirs=['../src'],
extra_compile_args=["-std=c99"],
- extra_link_args=['-fPIE', '-Wl,-z,relro,-z,now'],
libraries=sanlocklib)
version = None
--
2.25.4

View File

@ -1,50 +0,0 @@
From 5b34da78d33c2fca7dc3d2c49ae6d395d90c48c1 Mon Sep 17 00:00:00 2001
From: David Teigland <teigland@redhat.com>
Date: Wed, 14 Aug 2024 11:51:17 -0500
Subject: [PATCH] sanlock: fix invalid strcpy in direct dump
If a lockspace or resource name is the full 48 characters
in length, then the ondisk name field does not contain a
terminating null character and strcpy fails.
---
src/direct.c | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/src/direct.c b/src/direct.c
index f70dc19d5ef2..3bc7659e905c 100644
--- a/src/direct.c
+++ b/src/direct.c
@@ -730,8 +730,8 @@ int direct_dump(struct task *task, char *dump_path, int force_mode)
if (!lr->owner_id && !lr->owner_generation)
continue;
- strcpy(sname, lr->space_name);
- strcpy(rname, lr->resource_name);
+ memcpy(sname, lr->space_name, NAME_ID_SIZE);
+ memcpy(rname, lr->resource_name, NAME_ID_SIZE);
printf("%08llu %36s %48s %010llu %04llu %04llu",
(unsigned long long)(start_offset + ((sector_nr + i) * sector_size)),
@@ -754,8 +754,8 @@ int direct_dump(struct task *task, char *dump_path, int force_mode)
leader_record_in(lr_end, &lr_in);
lr = &lr_in;
- strcpy(sname, lr->space_name);
- strcpy(rname, lr->resource_name);
+ memcpy(sname, lr->space_name, NAME_ID_SIZE);
+ memcpy(rname, lr->resource_name, NAME_ID_SIZE);
printf("%08llu %36s %48s %010llu %04llu %04llu %llu",
(unsigned long long)(start_offset + (sector_nr * sector_size)),
@@ -806,7 +806,7 @@ int direct_dump(struct task *task, char *dump_path, int force_mode)
rindex_header_in(rh_end, &rh_in);
rh = &rh_in;
- strcpy(sname, rh->lockspace_name);
+ memcpy(sname, rh->lockspace_name, NAME_ID_SIZE);
printf("%08llu %36s rindex_header 0x%x %d %u %llu\n",
(unsigned long long)(start_offset + (sector_nr * sector_size)),
--
2.46.0

View File

@ -1,30 +0,0 @@
From e82899fd996f4901e1ec89d77e4a17a1032fee8f Mon Sep 17 00:00:00 2001
From: David Teigland <teigland@redhat.com>
Date: Thu, 3 Mar 2022 09:39:52 -0600
Subject: [PATCH 1/4] sanlock: fix memory leak of lockspace renewal_history
Leak was in original commit for "sanlock: renewal history"
6313c709722b3ba63234a75d1651a160bf1728ee.
With the default renewal history size, each lockspace that
was created would leak about 4kb of memory.
---
src/lockspace.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/lockspace.c b/src/lockspace.c
index 2ebc247dce41..d23dccd84815 100644
--- a/src/lockspace.c
+++ b/src/lockspace.c
@@ -939,6 +939,8 @@ static void free_sp(struct space *sp)
{
if (sp->lease_status.renewal_read_buf)
free(sp->lease_status.renewal_read_buf);
+ if (sp->renewal_history)
+ free(sp->renewal_history);
free(sp);
}
--
2.7.5

View File

@ -1,25 +0,0 @@
From 77ad5324fbad7558dd555cd7cabb0fa22a49e38a Mon Sep 17 00:00:00 2001
From: David Teigland <teigland@redhat.com>
Date: Wed, 30 Apr 2025 11:06:51 -0500
Subject: [PATCH] sanlock: fix zero io timeout for direct lockspace requests
---
src/direct.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/direct.c b/src/direct.c
index 208dd3509b14..e009de1a44b5 100644
--- a/src/direct.c
+++ b/src/direct.c
@@ -314,6 +314,8 @@ static int do_delta_action(int action,
if (!io_timeout)
io_timeout = com.io_timeout;
+ if (!io_timeout)
+ io_timeout = DEFAULT_IO_TIMEOUT;
rv = sizes_from_flags(ls->flags, &sector_size, &align_size, &max_hosts, "LSF");
if (rv)
--
2.48.1

View File

@ -1,29 +0,0 @@
From 9c626f97b25bf1973ece91c6f5dd67628bb0abd1 Mon Sep 17 00:00:00 2001
From: David Teigland <teigland@redhat.com>
Date: Fri, 18 Oct 2024 12:57:49 -0500
Subject: [PATCH] systemd-wdmd: work around race with udev setting softdog
label
After modprobe softdog, udev wants to set permission and/or label
on the watchdog device. Wait until that's done before trying to
test/probe the watchdog device. RHEL-56479
---
init.d/systemd-wdmd | 2 ++
1 file changed, 2 insertions(+)
diff --git a/init.d/systemd-wdmd b/init.d/systemd-wdmd
index 001609736287..c3126c408a89 100644
--- a/init.d/systemd-wdmd
+++ b/init.d/systemd-wdmd
@@ -19,6 +19,8 @@ watchdog_check() {
if [ $retval -ne 0 ]; then
echo -n $"Loading the softdog kernel module: "
modprobe softdog
+ # handle delay in udev setting permission/label
+ udevadm settle
watchdog_probe
retval=$?
--
2.46.2

View File

@ -1,51 +0,0 @@
From e44c47c48a3a71502deacbafda851cb6d93e78c8 Mon Sep 17 00:00:00 2001
From: David Teigland <teigland@redhat.com>
Date: Wed, 9 Mar 2022 15:25:11 -0600
Subject: [PATCH 2/4] sanlock: fix pthread_create error check
for non-zero rather than less than zero
---
src/lockspace.c | 4 ++--
src/main.c | 4 ++--
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/lockspace.c b/src/lockspace.c
index d23dccd84815..582a0e973566 100644
--- a/src/lockspace.c
+++ b/src/lockspace.c
@@ -1070,8 +1070,8 @@ int add_lockspace_start(struct sanlk_lockspace *ls, uint32_t io_timeout, struct
(unsigned long long)sp->host_id_disk.offset);
rv = pthread_create(&sp->thread, NULL, lockspace_thread, sp);
- if (rv < 0) {
- log_erros(sp, "add_lockspace create thread failed");
+ if (rv) {
+ log_erros(sp, "add_lockspace create thread failed %d", rv);
goto fail_del;
}
diff --git a/src/main.c b/src/main.c
index 5b6fabc6d0b8..613fb0ee23d5 100644
--- a/src/main.c
+++ b/src/main.c
@@ -995,7 +995,7 @@ static int thread_pool_add_work(struct cmd_args *ca)
if (!pool.free_workers && pool.num_workers < pool.max_workers) {
rv = pthread_create(&th, NULL, thread_pool_worker,
(void *)(long)pool.num_workers);
- if (rv < 0) {
+ if (rv) {
log_error("thread_pool_add_work ci %d error %d", ca->ci_in, rv);
list_del(&ca->list);
pthread_mutex_unlock(&pool.mutex);
@@ -1035,7 +1035,7 @@ static int thread_pool_create(int min_workers, int max_workers)
for (i = 0; i < min_workers; i++) {
rv = pthread_create(&th, NULL, thread_pool_worker,
(void *)(long)i);
- if (rv < 0)
+ if (rv)
break;
pool.num_workers++;
}
--
2.7.5

View File

@ -1,167 +0,0 @@
From 6240d633b229e15d445868a8b1463fb8ee6ddbc6 Mon Sep 17 00:00:00 2001
From: David Teigland <teigland@redhat.com>
Date: Wed, 23 Oct 2024 14:51:04 -0500
Subject: [PATCH] sanlock: new NODELAY flag for add_lockspace
Forces the existing "no delay" path for acquiring a host_id
delta lease. This avoids delays in add_lockspace that are
used to detect machines using the same host_id. So, using
this flag is unsafe if multiple hosts may end up using the
same host_id.
---
src/cmd.c | 3 ++-
src/delta_lease.c | 8 ++++++--
src/delta_lease.h | 1 +
src/direct.c | 1 +
src/lockspace.c | 5 +++--
src/lockspace.h | 2 +-
src/sanlock_admin.h | 1 +
src/sanlock_internal.h | 1 +
8 files changed, 16 insertions(+), 6 deletions(-)
diff --git a/src/cmd.c b/src/cmd.c
index e91da9d3eb41..47656bbb7f75 100644
--- a/src/cmd.c
+++ b/src/cmd.c
@@ -1306,6 +1306,7 @@ static void cmd_add_lockspace(struct cmd_args *ca, uint32_t cmd)
struct space *sp;
uint32_t io_timeout;
int async = ca->header.cmd_flags & SANLK_ADD_ASYNC;
+ int nodelay = (ca->header.cmd_flags & SANLK_ADD_NODELAY) ? 1 : 0;
int fd, rv, result;
fd = client[ca->ci_in].fd;
@@ -1329,7 +1330,7 @@ static void cmd_add_lockspace(struct cmd_args *ca, uint32_t cmd)
if (!io_timeout)
io_timeout = com.io_timeout;
- rv = add_lockspace_start(&lockspace, io_timeout, &sp);
+ rv = add_lockspace_start(&lockspace, io_timeout, nodelay, &sp);
if (rv < 0) {
result = rv;
goto reply;
diff --git a/src/delta_lease.c b/src/delta_lease.c
index fb4a6402858d..144c0ea0ee11 100644
--- a/src/delta_lease.c
+++ b/src/delta_lease.c
@@ -332,6 +332,7 @@ int delta_lease_acquire(struct task *task,
char *space_name,
char *our_host_name,
uint64_t host_id,
+ int nodelay,
struct leader_record *leader_ret)
{
struct leader_record leader;
@@ -394,13 +395,16 @@ int delta_lease_acquire(struct task *task,
no_delay = 1;
if (is_same && our_host_name_matches_product_uuid)
no_delay = 1;
+ if (nodelay)
+ no_delay = 1;
- log_space(sp, "delta_acquire %s owner, %s free, %s our_product_uuid, %s delay, other_io_timeout %d",
+ log_space(sp, "delta_acquire %s owner, %s free, %s our_product_uuid, %s delay, other_io_timeout %d, flag_nodelay %d",
is_same ? "same" : "new",
is_free ? "is" : "not",
our_host_name_matches_product_uuid ? "is" : "not",
no_delay ? "no" : "short",
- other_io_timeout);
+ other_io_timeout,
+ nodelay);
goto write_new;
}
diff --git a/src/delta_lease.h b/src/delta_lease.h
index ec1c3468bf72..22c6faa16995 100644
--- a/src/delta_lease.h
+++ b/src/delta_lease.h
@@ -24,6 +24,7 @@ int delta_lease_acquire(struct task *task,
char *space_name,
char *our_host_name,
uint64_t host_id,
+ int nodelay,
struct leader_record *leader_ret);
int delta_lease_renew(struct task *task,
diff --git a/src/direct.c b/src/direct.c
index 3bc7659e905c..1f4064795c4a 100644
--- a/src/direct.c
+++ b/src/direct.c
@@ -364,6 +364,7 @@ static int do_delta_action(int action,
ls->name,
our_host_name,
ls->host_id,
+ 0,
&leader);
break;
case ACT_RENEW_ID:
diff --git a/src/lockspace.c b/src/lockspace.c
index a2bee3f478fd..1cea79d41618 100644
--- a/src/lockspace.c
+++ b/src/lockspace.c
@@ -973,7 +973,7 @@ static void *lockspace_thread(void *arg_in)
delta_result = delta_lease_acquire(&task, sp, &sp->host_id_disk,
sp->space_name, our_host_name_global,
- sp->host_id, &leader);
+ sp->host_id, sp->nodelay, &leader);
delta_length = monotime() - delta_begin;
if (delta_result == SANLK_OK)
@@ -1152,7 +1152,7 @@ static void free_sp(struct space *sp)
free(sp);
}
-int add_lockspace_start(struct sanlk_lockspace *ls, uint32_t io_timeout, struct space **sp_out)
+int add_lockspace_start(struct sanlk_lockspace *ls, uint32_t io_timeout, int nodelay, struct space **sp_out)
{
struct space *sp, *sp2;
int listnum = 0;
@@ -1178,6 +1178,7 @@ int add_lockspace_start(struct sanlk_lockspace *ls, uint32_t io_timeout, struct
sp->host_id_disk.fd = -1;
sp->host_id = ls->host_id;
sp->io_timeout = io_timeout;
+ sp->nodelay = nodelay;
sp->set_bitmap_seconds = calc_set_bitmap_seconds(io_timeout);
pthread_mutex_init(&sp->mutex, NULL);
diff --git a/src/lockspace.h b/src/lockspace.h
index 0c3cba324e31..790a5cc68499 100644
--- a/src/lockspace.h
+++ b/src/lockspace.h
@@ -42,7 +42,7 @@ int check_our_lease(struct space *sp, int *check_all, char *check_buf);
void check_other_leases(struct space *sp, char *buf);
/* locks spaces_mutex */
-int add_lockspace_start(struct sanlk_lockspace *ls, uint32_t io_timeout, struct space **sp_out);
+int add_lockspace_start(struct sanlk_lockspace *ls, uint32_t io_timeout, int nodelay, struct space **sp_out);
/* locks sp, locks spaces_mutex */
int add_lockspace_wait(struct space *sp);
diff --git a/src/sanlock_admin.h b/src/sanlock_admin.h
index 685cce11d6f3..10bfc49b312b 100644
--- a/src/sanlock_admin.h
+++ b/src/sanlock_admin.h
@@ -12,6 +12,7 @@
/* add flags */
#define SANLK_ADD_ASYNC 0x00000001
+#define SANLK_ADD_NODELAY 0x00000002 /* can be unsafe */
/* rem flags */
#define SANLK_REM_ASYNC 0x00000001
diff --git a/src/sanlock_internal.h b/src/sanlock_internal.h
index ebb0a9c319c1..e57127b17233 100644
--- a/src/sanlock_internal.h
+++ b/src/sanlock_internal.h
@@ -217,6 +217,7 @@ struct space {
uint32_t renewal_read_extend_sec; /* defaults to io_timeout */
uint32_t rindex_op;
unsigned int set_max_sectors_kb;
+ int nodelay;
int sector_size;
int align_size;
int max_hosts;
--
2.46.2

View File

@ -1,42 +0,0 @@
From 4ed90cfb2462d3463ae74935c5eeb9d9588ea098 Mon Sep 17 00:00:00 2001
From: David Teigland <teigland@redhat.com>
Date: Thu, 17 Mar 2022 13:41:31 -0500
Subject: [PATCH 3/4] Revert "sanlock: Shrink thread pool when there is no
work"
This reverts commit 0ff9c1ab8852bec846822ee2af55ebcb7e5f5967.
This patch causes unexplained growth in memory usage.
Part of the problem may be that the worker threads are
not joined and the detached state is not set, but an
initial test setting the detached state didn't seem
to fix the problem.
---
src/main.c | 4 ----
1 file changed, 4 deletions(-)
diff --git a/src/main.c b/src/main.c
index 613fb0ee23d5..b447b723a490 100644
--- a/src/main.c
+++ b/src/main.c
@@ -946,9 +946,6 @@ static void *thread_pool_worker(void *data)
while (1) {
while (!pool.quit && list_empty(&pool.work_data)) {
- if (pool.free_workers >= DEFAULT_MIN_WORKER_THREADS)
- goto out;
-
pool.free_workers++;
pthread_cond_wait(&pool.cond, &pool.mutex);
pool.free_workers--;
@@ -969,7 +966,6 @@ static void *thread_pool_worker(void *data)
break;
}
-out:
pool.num_workers--;
if (!pool.num_workers)
pthread_cond_signal(&pool.quit_wait);
--
2.7.5

View File

@ -1,63 +0,0 @@
From 574d3cc3ecccd1e8a6c1a8a861dd4847a05789f5 Mon Sep 17 00:00:00 2001
From: David Teigland <teigland@redhat.com>
Date: Fri, 18 Mar 2022 09:32:06 -0500
Subject: [PATCH 4/4] sanlock: fix pthread_create error paths
The fix for pthread_create errors in commit
5abb9d50616d399914958b99352b8cf016e4928a
sanlock: fix pthread_create error check
missed error handling further in the exit path.
---
src/lockspace.c | 1 +
src/main.c | 8 ++++++--
2 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/src/lockspace.c b/src/lockspace.c
index 582a0e973566..d9b79f6de257 100644
--- a/src/lockspace.c
+++ b/src/lockspace.c
@@ -1072,6 +1072,7 @@ int add_lockspace_start(struct sanlk_lockspace *ls, uint32_t io_timeout, struct
rv = pthread_create(&sp->thread, NULL, lockspace_thread, sp);
if (rv) {
log_erros(sp, "add_lockspace create thread failed %d", rv);
+ rv = -1;
goto fail_del;
}
diff --git a/src/main.c b/src/main.c
index b447b723a490..5a0f9ba677ff 100644
--- a/src/main.c
+++ b/src/main.c
@@ -995,6 +995,7 @@ static int thread_pool_add_work(struct cmd_args *ca)
log_error("thread_pool_add_work ci %d error %d", ca->ci_in, rv);
list_del(&ca->list);
pthread_mutex_unlock(&pool.mutex);
+ rv = -1;
return rv;
}
pool.num_workers++;
@@ -1019,7 +1020,7 @@ static void thread_pool_free(void)
static int thread_pool_create(int min_workers, int max_workers)
{
pthread_t th;
- int i, rv;
+ int i, rv = 0;
memset(&pool, 0, sizeof(pool));
INIT_LIST_HEAD(&pool.work_data);
@@ -1031,8 +1032,11 @@ static int thread_pool_create(int min_workers, int max_workers)
for (i = 0; i < min_workers; i++) {
rv = pthread_create(&th, NULL, thread_pool_worker,
(void *)(long)i);
- if (rv)
+ if (rv) {
+ log_error("thread_pool_create failed %d", rv);
+ rv = -1;
break;
+ }
pool.num_workers++;
}
--
2.7.5

View File

@ -1,6 +1,6 @@
Name: sanlock
Version: 4.0.0
Release: 2%{?dist}
Version: 4.1.0
Release: 1%{?dist}
Summary: A shared storage lock manager
License: GPLv2 and GPLv2+ and LGPLv2+
@ -22,14 +22,14 @@ Requires(preun): systemd-units
Requires(postun): systemd-units
Source0: https://releases.pagure.org/sanlock/%{name}-%{version}.tar.gz
Patch0: 0001-sanlock-fix-zero-io-timeout-for-direct-lockspace-req.patch
#Patch0: 0001-
%description
The sanlock daemon manages leases for applications on hosts using shared storage.
%prep
%setup -q
%patch0 -p1 -b .backup0
#%%patch0 -p1 -b .backup0
%build
%set_build_flags
@ -67,14 +67,13 @@ install -D -m 0644 init.d/wdmd.sysconfig \
$RPM_BUILD_ROOT/etc/sysconfig/wdmd
install -Dd -m 0755 $RPM_BUILD_ROOT/etc/wdmd.d
install -Dd -m 0775 $RPM_BUILD_ROOT/run/sanlock
%pre
getent group sanlock > /dev/null || /usr/sbin/groupadd \
-g 179 sanlock
getent passwd sanlock > /dev/null || /usr/sbin/useradd \
-u 179 -c "sanlock" -s /sbin/nologin -r \
-g 179 -d /var/run/sanlock sanlock
-g 179 -d /run/sanlock sanlock
/usr/sbin/usermod -a -G disk sanlock
%post
@ -94,7 +93,6 @@ getent passwd sanlock > /dev/null || /usr/sbin/useradd \
%{_sbindir}/wdmd
%dir %{_sysconfdir}/wdmd.d
%dir %{_sysconfdir}/sanlock
%dir %attr(-,sanlock,sanlock) /run/sanlock
%{_mandir}/man8/wdmd*
%{_mandir}/man8/sanlock*
%config(noreplace) %{_sysconfdir}/logrotate.d/sanlock
@ -153,6 +151,9 @@ developing applications that use %{name}.
%{_libdir}/pkgconfig/libsanlock_client.pc
%changelog
* Thu Oct 09 2025 Marian Csontos <mcsontos@redhat.com> - 4.1.0-1
- new upstream release
* Wed Aug 06 2025 Marian Csontos <mcsontos@redhat.com> - 4.0.0-2
- Bump release.

View File

@ -1 +1 @@
SHA512 (sanlock-4.0.0.tar.gz) = a478c8bbc09043d5dad18cc3ddbcaeefec0dd5587ab2807721424a1efc9d58ab82deacaa2f88289dc9990a2a6f95a80dabb727670e7aeaeba5ed0a57a3849c27
SHA512 (sanlock-4.1.0.tar.gz) = dd3786aa22a3bf94981141d244d1422bfbe12870c070d0f835b68601b9f0152265144e68426a6f112248df0dbfcb65914b1586f0cd83ab4aece79d8279f4438e