File 0021-fs-dlm-implement-DLM_PLOCK_OP_CANCEL.patch of Package libdlm.42059
From 7ec0c78314b9cae4419577ff220eba7fac6eba8d Mon Sep 17 00:00:00 2001
From: Alexander Aring <aahringo@redhat.com>
Date: Tue, 11 Jul 2023 20:08:59 -0400
Subject: [PATCH] fs: dlm: implement DLM_PLOCK_OP_CANCEL
This patch implements DLM_PLOCK_OP_CANCEL to try to delete waiters for a
lock request which are waiting to being granted. If the waiter can be
deleted the reply is 0. If the waiter cannot be found it will return
-ENOENT to the kernel, either that there never was be a waiter or we were
to late to cancel the lock request.
---
dlm_controld/plock.c | 44 ++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 44 insertions(+)
diff --git a/dlm_controld/plock.c b/dlm_controld/plock.c
index 7f632888793f..695d94615516 100644
--- a/dlm_controld/plock.c
+++ b/dlm_controld/plock.c
@@ -18,6 +18,10 @@
#define DLM_PLOCK_BUILD_WORKAROUND 1
#endif
+#ifndef DLM_PLOCK_OP_CANCEL
+#define DLM_PLOCK_OP_CANCEL 4
+#endif
+
static uint32_t plock_read_count;
static uint32_t plock_recv_count;
static uint32_t plock_rate_delays;
@@ -141,6 +145,8 @@ static const char *op_str(int optype)
switch (optype) {
case DLM_PLOCK_OP_LOCK:
return "LK";
+ case DLM_PLOCK_OP_CANCEL:
+ return "CL";
case DLM_PLOCK_OP_UNLOCK:
return "UN";
case DLM_PLOCK_OP_GET:
@@ -750,6 +756,40 @@ static void do_lock(struct lockspace *ls, struct dlm_plock_info *in,
put_resource(ls, r);
}
+static int remove_waiter(const struct resource *r, const struct dlm_plock_info *in)
+{
+ struct lock_waiter *w;
+
+ list_for_each_entry(w, &r->waiters, list) {
+ if (w->info.nodeid == in->nodeid &&
+ w->info.fsid == in->fsid &&
+ w->info.number == in->number &&
+ w->info.owner == in->owner &&
+ w->info.pid == in->pid &&
+ w->info.start == in->start &&
+ w->info.end == in->end &&
+ w->info.ex == in->ex) {
+ list_del(&w->list);
+ free(w);
+ return 0;
+ }
+ }
+
+ return -ENOENT;
+}
+
+static void do_cancel(struct lockspace *ls, struct dlm_plock_info *in,
+ struct resource *r)
+{
+ int rv;
+
+ rv = remove_waiter(r, in);
+ if (in->nodeid == our_nodeid)
+ write_result(in, rv);
+
+ put_resource(ls, r);
+}
+
static void do_unlock(struct lockspace *ls, struct dlm_plock_info *in,
struct resource *r)
{
@@ -819,6 +859,10 @@ static void __receive_plock(struct lockspace *ls, struct dlm_plock_info *in,
ls->last_plock_time = monotime();
do_lock(ls, in, r);
break;
+ case DLM_PLOCK_OP_CANCEL:
+ ls->last_plock_time = monotime();
+ do_cancel(ls, in, r);
+ break;
case DLM_PLOCK_OP_UNLOCK:
ls->last_plock_time = monotime();
do_unlock(ls, in, r);
--
2.50.1 (Apple Git-155)