Compare commits
No commits in common. "factory" and "factory" have entirely different histories.
@ -1,81 +0,0 @@
|
||||
From d64ebe7eb7df8c622b20bca38f3d7f4c7bb033c9 Mon Sep 17 00:00:00 2001
|
||||
From: "zhengbing.huang" <zhengbing.huang@easystack.cn>
|
||||
Date: Sun, 15 Dec 2024 14:50:56 +0800
|
||||
Subject: [PATCH] drbd: Fix memory leak
|
||||
|
||||
In the output of kmemleak, we have the followe backtrace:
|
||||
|
||||
unreferenced object 0xffff8885b57cda80 (size 64):
|
||||
comm "drbd_r_testimg4", pid 37104, jiffies 4494192827 (age 127162.843s)
|
||||
hex dump (first 32 bytes):
|
||||
31 20 6f 66 20 32 20 6e 6f 64 65 73 20 76 69 73 1 of 2 nodes vis
|
||||
69 62 6c 65 2c 20 6e 65 65 64 20 32 20 66 6f 72 ible, need 2 for
|
||||
backtrace:
|
||||
[<000000006d641d68>] __kmalloc_track_caller+0x15c/0x270
|
||||
[<000000006a7ffbcf>] kvasprintf+0xa7/0x120
|
||||
[<000000002d2f15b3>] drbd_state_err+0xa9/0x190 [drbd]
|
||||
[<000000006aa2f3df>] __is_valid_soft_transition+0xe99/0xec0 [drbd]
|
||||
[<0000000009d68cc7>] try_state_change+0x4f0/0x840 [drbd]
|
||||
[<00000000d5640f06>] ___end_state_change+0x140/0x12a0 [drbd]
|
||||
[<000000009f4b8d71>] __end_state_change+0xa1/0x130 [drbd]
|
||||
[<000000001c6de1a7>] change_connection_state+0x5ee/0xbd0 [drbd]
|
||||
[<00000000ce4408d6>] process_twopc+0x1d3e/0x2ce0 [drbd]
|
||||
[<00000000df3af6e8>] receive_twopc+0x17b/0x2b0 [drbd]
|
||||
[<000000009701f919>] drbd_receiver+0x311/0x6e0 [drbd]
|
||||
[<0000000092c4aeb1>] drbd_thread_setup+0x19d/0x430 [drbd]
|
||||
[<0000000098e316ab>] kthread+0x19c/0x1c0
|
||||
[<000000004c72b3a8>] ret_from_fork+0x1f/0x40
|
||||
|
||||
This is a memory leak.
|
||||
|
||||
In drbd_state_err() function, if resource->state_change_err_str is a null pointer,
|
||||
the err_str will not be free.
|
||||
And _drbd_state_err() has same issues.
|
||||
|
||||
So, if err_str has not put to up layer, free it in current function.
|
||||
|
||||
Signed-off-by: zhengbing.huang <zhengbing.huang@easystack.cn>
|
||||
Signed-off-by: Joel Colledge <joel.colledge@linbit.com>
|
||||
---
|
||||
drbd/drbd_state.c | 14 ++++++++++----
|
||||
1 file changed, 10 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/drbd/drbd_state.c b/drbd/drbd_state.c
|
||||
index f498eaa60396..0e693c8e3af0 100644
|
||||
--- a/drbd/drbd_state.c
|
||||
+++ b/drbd/drbd_state.c
|
||||
@@ -1557,10 +1557,13 @@ static __printf(2, 3) void _drbd_state_err(struct change_context *context, const
|
||||
va_end(args);
|
||||
if (!err_str)
|
||||
return;
|
||||
- if (context->err_str)
|
||||
- *context->err_str = err_str;
|
||||
if (context->flags & CS_VERBOSE)
|
||||
drbd_err(resource, "%s\n", err_str);
|
||||
+
|
||||
+ if (context->err_str)
|
||||
+ *context->err_str = err_str;
|
||||
+ else
|
||||
+ kfree(err_str);
|
||||
}
|
||||
|
||||
static __printf(2, 3) void drbd_state_err(struct drbd_resource *resource, const char *fmt, ...)
|
||||
@@ -1573,10 +1576,13 @@ static __printf(2, 3) void drbd_state_err(struct drbd_resource *resource, const
|
||||
va_end(args);
|
||||
if (!err_str)
|
||||
return;
|
||||
- if (resource->state_change_err_str)
|
||||
- *resource->state_change_err_str = err_str;
|
||||
if (resource->state_change_flags & CS_VERBOSE)
|
||||
drbd_err(resource, "%s\n", err_str);
|
||||
+
|
||||
+ if (resource->state_change_err_str)
|
||||
+ *resource->state_change_err_str = err_str;
|
||||
+ else
|
||||
+ kfree(err_str);
|
||||
}
|
||||
|
||||
static enum drbd_state_rv __is_valid_soft_transition(struct drbd_resource *resource)
|
||||
--
|
||||
2.43.0
|
||||
|
@ -0,0 +1,37 @@
|
||||
From 0dda200877d1b801fba948a5948f321bee1a75a9 Mon Sep 17 00:00:00 2001
|
||||
From: Philipp Reisner <philipp.reisner@linbit.com>
|
||||
Date: Fri, 1 Sep 2023 08:03:01 +0200
|
||||
Subject: [PATCH 01/20] drbd: allow transports to take additional krefs on a
|
||||
listener
|
||||
|
||||
by making the drbd_listener_destroy() available to the transports.
|
||||
|
||||
heming.zhao@suse.com
|
||||
- For compiling drbd, I modified this patch. please differ with upstream
|
||||
to find changes.
|
||||
|
||||
---
|
||||
drbd/drbd_transport.c | 3 ++-
|
||||
1 files changed, 2 insertions(+), 1 deletions(-)
|
||||
|
||||
diff --git a/drbd/drbd_transport.c b/drbd/drbd_transport.c
|
||||
index d1ec5724dec6..416a50499046 100644
|
||||
--- a/drbd/drbd_transport.c
|
||||
+++ b/drbd/drbd_transport.c
|
||||
@@ -223,7 +223,7 @@ int drbd_get_listener(struct drbd_transport *transport, struct drbd_path *path,
|
||||
return err;
|
||||
}
|
||||
|
||||
-static void drbd_listener_destroy(struct kref *kref)
|
||||
+void drbd_listener_destroy(struct kref *kref)
|
||||
{
|
||||
struct drbd_listener *listener = container_of(kref, struct drbd_listener, kref);
|
||||
struct drbd_resource *resource = listener->resource;
|
||||
@@ -331,3 +331,4 @@ EXPORT_SYMBOL_GPL(drbd_find_path_by_addr);
|
||||
EXPORT_SYMBOL_GPL(drbd_stream_send_timed_out);
|
||||
EXPORT_SYMBOL_GPL(drbd_should_abort_listening);
|
||||
EXPORT_SYMBOL_GPL(drbd_path_event);
|
||||
+EXPORT_SYMBOL_GPL(drbd_listener_destroy);
|
||||
--
|
||||
2.35.3
|
||||
|
@ -0,0 +1,65 @@
|
||||
From f2cd05b8d60d27f43b07175b92ef4c2a69b8e3a2 Mon Sep 17 00:00:00 2001
|
||||
From: Joel Colledge <joel.colledge@linbit.com>
|
||||
Date: Wed, 6 Sep 2023 15:49:44 +0200
|
||||
Subject: [PATCH 02/20] drbd: improve decision about marking a failed disk
|
||||
Outdated
|
||||
|
||||
Sometimes it is possible to update the metadata even after our disk has
|
||||
failed. We were too eager to remove the MDF_WAS_UP_TO_DATE flag in this
|
||||
case.
|
||||
|
||||
Firstly, we used the "NOW" states, so would mark our metadata Outdated
|
||||
if we were a Primary with UpToDate data and no peers, and our disk
|
||||
failed. Use the "NEW" states instead.
|
||||
|
||||
Secondly, do not consider peers that are disconnecting, because they
|
||||
will not see that our disk state is Failed, and so will outdate
|
||||
themselves. We do not want to outdate both nodes in this situation.
|
||||
---
|
||||
drbd/drbd_state.c | 18 ++++++++++++++----
|
||||
1 file changed, 14 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/drbd/drbd_state.c b/drbd/drbd_state.c
|
||||
index 7e6e3477893d..8b60afeb097b 100644
|
||||
--- a/drbd/drbd_state.c
|
||||
+++ b/drbd/drbd_state.c
|
||||
@@ -2489,15 +2489,24 @@ static void initialize_resync(struct drbd_peer_device *peer_device)
|
||||
/* Is there a primary with access to up to date data known */
|
||||
static bool primary_and_data_present(struct drbd_device *device)
|
||||
{
|
||||
- bool up_to_date_data = device->disk_state[NOW] == D_UP_TO_DATE;
|
||||
- bool primary = device->resource->role[NOW] == R_PRIMARY;
|
||||
+ bool up_to_date_data = device->disk_state[NEW] == D_UP_TO_DATE;
|
||||
+ struct drbd_resource *resource = device->resource;
|
||||
+ bool primary = resource->role[NEW] == R_PRIMARY;
|
||||
struct drbd_peer_device *peer_device;
|
||||
|
||||
for_each_peer_device(peer_device, device) {
|
||||
- if (peer_device->connection->peer_role[NOW] == R_PRIMARY)
|
||||
+ struct drbd_connection *connection = peer_device->connection;
|
||||
+
|
||||
+ /* Do not consider the peer if we are disconnecting. */
|
||||
+ if (resource->remote_state_change &&
|
||||
+ drbd_twopc_between_peer_and_me(connection) &&
|
||||
+ resource->twopc_reply.is_disconnect)
|
||||
+ continue;
|
||||
+
|
||||
+ if (connection->peer_role[NEW] == R_PRIMARY)
|
||||
primary = true;
|
||||
|
||||
- if (peer_device->disk_state[NOW] == D_UP_TO_DATE)
|
||||
+ if (peer_device->disk_state[NEW] == D_UP_TO_DATE)
|
||||
up_to_date_data = true;
|
||||
}
|
||||
|
||||
@@ -4808,6 +4817,7 @@ change_cluster_wide_state(bool (*change)(struct change_context *, enum change_ph
|
||||
} else if (context->mask.conn == conn_MASK && context->val.conn == C_DISCONNECTING) {
|
||||
reply->target_reachable_nodes = NODE_MASK(context->target_node_id);
|
||||
reply->reachable_nodes &= ~reply->target_reachable_nodes;
|
||||
+ reply->is_disconnect = 1;
|
||||
} else {
|
||||
reply->target_reachable_nodes = reply->reachable_nodes;
|
||||
}
|
||||
--
|
||||
2.35.3
|
||||
|
32
0003-drbd-fix-error-path-in-drbd_get_listener.patch
Normal file
32
0003-drbd-fix-error-path-in-drbd_get_listener.patch
Normal file
@ -0,0 +1,32 @@
|
||||
From fbfb92d11e64daec167b24521c715ceab505b55d Mon Sep 17 00:00:00 2001
|
||||
From: Philipp Reisner <philipp.reisner@linbit.com>
|
||||
Date: Thu, 7 Sep 2023 10:36:29 +0200
|
||||
Subject: [PATCH 03/20] drbd: fix error path in drbd_get_listener()
|
||||
|
||||
When initializing a listener fails do not access the fields of the
|
||||
listener struct after giving up the reference.
|
||||
---
|
||||
drbd/drbd_transport.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drbd/drbd_transport.c b/drbd/drbd_transport.c
|
||||
index 416a50499046..2aefd71ee395 100644
|
||||
--- a/drbd/drbd_transport.c
|
||||
+++ b/drbd/drbd_transport.c
|
||||
@@ -207,11 +207,11 @@ int drbd_get_listener(struct drbd_transport *transport, struct drbd_path *path,
|
||||
|
||||
if (needs_init) {
|
||||
err = init_listener(transport, addr, &init_net, listener);
|
||||
+ listener->err = err;
|
||||
+ complete_all(&listener->ready);
|
||||
if (err)
|
||||
drbd_put_listener(path);
|
||||
|
||||
- listener->err = err;
|
||||
- complete_all(&listener->ready);
|
||||
return err;
|
||||
}
|
||||
|
||||
--
|
||||
2.35.3
|
||||
|
@ -0,0 +1,47 @@
|
||||
From 67ac093d6dc176fd6a3bf0c7f5a3ad046d48f558 Mon Sep 17 00:00:00 2001
|
||||
From: Lars Ellenberg <lars.ellenberg@linbit.com>
|
||||
Date: Wed, 6 Sep 2023 14:38:32 +0200
|
||||
Subject: [PATCH 04/20] drbd: build: fix spurious re-build attempt of
|
||||
compat.patch
|
||||
|
||||
Patching changed the timestamp of the patched files,
|
||||
which are pre-requisites for generating the patch.
|
||||
|
||||
The second build after extracting the tarball
|
||||
would try to regenerate the patch file.
|
||||
|
||||
Exclude generated *.mod.c from "to-be-patched" files for spatch.
|
||||
Reset timestamp of patched files to that of the patch file, instead of current time.
|
||||
---
|
||||
drbd/Kbuild | 1 +
|
||||
drbd/Makefile | 2 +-
|
||||
2 files changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drbd/Kbuild b/drbd/Kbuild
|
||||
index 1576dc19e1da..073469ae4191 100644
|
||||
--- a/drbd/Kbuild
|
||||
+++ b/drbd/Kbuild
|
||||
@@ -110,6 +110,7 @@ filechk_compat.h = cat $(obj)/compat.$(KERNELVERSION).h
|
||||
$(src)/.compat_patches_applied: $(src)/drbd-kernel-compat/compat.patch
|
||||
@$(kecho) ' PATCH'
|
||||
@patch -d $(src) -p0 --batch --forward --reject-file=- < $(src)/drbd-kernel-compat/compat.patch
|
||||
+ @cd $(src) && p=drbd-kernel-compat/compat.patch && sed -ne 's/^--- //p' < $$p | xargs -r -- touch -r $$p
|
||||
@cp -d $(src)/drbd-kernel-compat/compat.patch $(src)/.compat_patches_applied
|
||||
|
||||
$(src)/drbd-kernel-compat/compat.patch: $(obj)/compat.h
|
||||
diff --git a/drbd/Makefile b/drbd/Makefile
|
||||
index 09a1efbf7fe1..ecdff04b9808 100644
|
||||
--- a/drbd/Makefile
|
||||
+++ b/drbd/Makefile
|
||||
@@ -170,7 +170,7 @@ else
|
||||
compat_headers := $(wildcard drbd-kernel-compat/cocci_cache/*/compat.h)
|
||||
compat_patches := $(patsubst %.h,%.patch,$(compat_headers))
|
||||
|
||||
- sources := $(filter-out drbd_strings.c drbd_buildtag.c,$(wildcard *.c))
|
||||
+ sources := $(filter-out drbd_strings.c drbd_buildtag.c drbd%.mod.c,$(wildcard *.c))
|
||||
sources += $(wildcard drbd-headers/linux/*.h)
|
||||
|
||||
$(compat_patches): $(sources)
|
||||
--
|
||||
2.35.3
|
||||
|
28
0005-drbd-log-error-code-when-thread-fails-to-start.patch
Normal file
28
0005-drbd-log-error-code-when-thread-fails-to-start.patch
Normal file
@ -0,0 +1,28 @@
|
||||
From a98c818bd33920fd5189cdd8f5d81850ad4a945b Mon Sep 17 00:00:00 2001
|
||||
From: Joel Colledge <joel.colledge@linbit.com>
|
||||
Date: Thu, 7 Sep 2023 17:32:56 +0200
|
||||
Subject: [PATCH 05/20] drbd: log error code when thread fails to start
|
||||
|
||||
---
|
||||
drbd/drbd_main.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drbd/drbd_main.c b/drbd/drbd_main.c
|
||||
index 38f728f3da73..810df864f60b 100644
|
||||
--- a/drbd/drbd_main.c
|
||||
+++ b/drbd/drbd_main.c
|
||||
@@ -642,9 +642,9 @@ int drbd_thread_start(struct drbd_thread *thi)
|
||||
|
||||
if (IS_ERR(nt)) {
|
||||
if (connection)
|
||||
- drbd_err(connection, "Couldn't start thread\n");
|
||||
+ drbd_err(connection, "Couldn't start thread: %ld\n", PTR_ERR(nt));
|
||||
else
|
||||
- drbd_err(resource, "Couldn't start thread\n");
|
||||
+ drbd_err(resource, "Couldn't start thread: %ld\n", PTR_ERR(nt));
|
||||
|
||||
return false;
|
||||
}
|
||||
--
|
||||
2.35.3
|
||||
|
@ -0,0 +1,82 @@
|
||||
From 8c2c783a09d81f0a725e7a3ae48be4ceb2d79a63 Mon Sep 17 00:00:00 2001
|
||||
From: Joel Colledge <joel.colledge@linbit.com>
|
||||
Date: Fri, 8 Sep 2023 11:26:01 +0200
|
||||
Subject: [PATCH 06/20] drbd: log numeric value of drbd_state_rv as well as
|
||||
string form
|
||||
|
||||
"Auto-promote failed: ?" was seen in a log. Logging the numeric value of
|
||||
the state change return value gives us more information about what
|
||||
happened in such a case.
|
||||
---
|
||||
drbd/drbd_main.c | 8 ++++----
|
||||
drbd/drbd_receiver.c | 6 +++---
|
||||
drbd/drbd_state.c | 3 ++-
|
||||
3 files changed, 9 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/drbd/drbd_main.c b/drbd/drbd_main.c
|
||||
index 810df864f60b..e26cf7e2b008 100644
|
||||
--- a/drbd/drbd_main.c
|
||||
+++ b/drbd/drbd_main.c
|
||||
@@ -2698,8 +2698,8 @@ static int drbd_open(struct block_device *bdev, fmode_t mode)
|
||||
if (resource->role[NOW] == R_SECONDARY) {
|
||||
rv = try_to_promote(device, timeout, (mode & FMODE_NDELAY));
|
||||
if (rv < SS_SUCCESS)
|
||||
- drbd_info(resource, "Auto-promote failed: %s\n",
|
||||
- drbd_set_st_err_str(rv));
|
||||
+ drbd_info(resource, "Auto-promote failed: %s (%d)\n",
|
||||
+ drbd_set_st_err_str(rv), rv);
|
||||
}
|
||||
} else if ((mode & FMODE_NDELAY) == 0) {
|
||||
/* Double check peers
|
||||
@@ -2856,8 +2856,8 @@ static void drbd_release(struct gendisk *gd, fmode_t mode)
|
||||
!test_bit(EXPLICIT_PRIMARY, &resource->flags)) {
|
||||
rv = drbd_set_role(resource, R_SECONDARY, false, NULL);
|
||||
if (rv < SS_SUCCESS)
|
||||
- drbd_warn(resource, "Auto-demote failed: %s\n",
|
||||
- drbd_set_st_err_str(rv));
|
||||
+ drbd_warn(resource, "Auto-demote failed: %s (%d)\n",
|
||||
+ drbd_set_st_err_str(rv), rv);
|
||||
}
|
||||
}
|
||||
|
||||
diff --git a/drbd/drbd_receiver.c b/drbd/drbd_receiver.c
|
||||
index 95cf7ac36762..2162d13cb25e 100644
|
||||
--- a/drbd/drbd_receiver.c
|
||||
+++ b/drbd/drbd_receiver.c
|
||||
@@ -983,8 +983,8 @@ static int connect_work(struct drbd_work *work, int cancel)
|
||||
drbd_send_disconnect(connection);
|
||||
apply_local_state_change(connection, OUTDATE_DISKS_AND_DISCONNECT, force_demote);
|
||||
} else {
|
||||
- drbd_info(connection, "Failure to connect %d %s; retrying\n",
|
||||
- rv, drbd_set_st_err_str(rv));
|
||||
+ drbd_info(connection, "Failure to connect: %s (%d); retrying\n",
|
||||
+ drbd_set_st_err_str(rv), rv);
|
||||
change_cstate(connection, C_NETWORK_FAILURE, CS_HARD);
|
||||
}
|
||||
|
||||
@@ -6107,7 +6107,7 @@ out:
|
||||
}
|
||||
|
||||
if (rv < SS_SUCCESS) {
|
||||
- drbd_err(resource, "State change failed: %s\n", drbd_set_st_err_str(rv));
|
||||
+ drbd_err(resource, "State change failed: %s (%d)\n", drbd_set_st_err_str(rv), rv);
|
||||
if (rv == SS_PRIMARY_READER)
|
||||
log_openers(resource);
|
||||
}
|
||||
diff --git a/drbd/drbd_state.c b/drbd/drbd_state.c
|
||||
index 8b60afeb097b..23eab7f867aa 100644
|
||||
--- a/drbd/drbd_state.c
|
||||
+++ b/drbd/drbd_state.c
|
||||
@@ -791,7 +791,8 @@ static enum drbd_state_rv ___end_state_change(struct drbd_resource *resource, st
|
||||
rv = try_state_change(resource);
|
||||
if (rv < SS_SUCCESS) {
|
||||
if (flags & CS_VERBOSE) {
|
||||
- drbd_err(resource, "State change failed: %s\n", drbd_set_st_err_str(rv));
|
||||
+ drbd_err(resource, "State change failed: %s (%d)\n",
|
||||
+ drbd_set_st_err_str(rv), rv);
|
||||
print_state_change(resource, "Failed: ");
|
||||
}
|
||||
goto out;
|
||||
--
|
||||
2.35.3
|
||||
|
45
0007-drbd-stop-defining-__KERNEL_SYSCALLS__.patch
Normal file
45
0007-drbd-stop-defining-__KERNEL_SYSCALLS__.patch
Normal file
@ -0,0 +1,45 @@
|
||||
From 15cf257c277020e1ba76eff7aa99ed08d44f7d3c Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Moritz=20=22WanzenBug=22=20Wanzenb=C3=B6ck?=
|
||||
<moritz.wanzenboeck@linbit.com>
|
||||
Date: Fri, 8 Sep 2023 11:45:48 +0200
|
||||
Subject: [PATCH 07/20] drbd: stop defining __KERNEL_SYSCALLS__
|
||||
|
||||
See also upstream Linux kernel commit
|
||||
d519df00938e ("drbd: stop defining __KERNEL_SYSCALLS__")
|
||||
|
||||
Original message:
|
||||
|
||||
__KERNEL_SYSCALLS__ hasn't been needed since Linux 2.6.19 so stop
|
||||
defining it.
|
||||
---
|
||||
drbd/drbd_main.c | 1 -
|
||||
drbd/drbd_receiver.c | 1 -
|
||||
2 files changed, 2 deletions(-)
|
||||
|
||||
diff --git a/drbd/drbd_main.c b/drbd/drbd_main.c
|
||||
index e26cf7e2b008..ccf0f72829db 100644
|
||||
--- a/drbd/drbd_main.c
|
||||
+++ b/drbd/drbd_main.c
|
||||
@@ -36,7 +36,6 @@
|
||||
#include <linux/notifier.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/kthread.h>
|
||||
-#define __KERNEL_SYSCALLS__
|
||||
#include <linux/unistd.h>
|
||||
#include <linux/vmalloc.h>
|
||||
#include <linux/device.h>
|
||||
diff --git a/drbd/drbd_receiver.c b/drbd/drbd_receiver.c
|
||||
index 2162d13cb25e..2e2ed4699a94 100644
|
||||
--- a/drbd/drbd_receiver.c
|
||||
+++ b/drbd/drbd_receiver.c
|
||||
@@ -26,7 +26,6 @@
|
||||
#include <linux/slab.h>
|
||||
#include <linux/pkt_sched.h>
|
||||
#include <uapi/linux/sched/types.h>
|
||||
-#define __KERNEL_SYSCALLS__
|
||||
#include <linux/unistd.h>
|
||||
#include <linux/vmalloc.h>
|
||||
#include <linux/random.h>
|
||||
--
|
||||
2.35.3
|
||||
|
80
0008-compat-block-introduce-holder-ops.patch
Normal file
80
0008-compat-block-introduce-holder-ops.patch
Normal file
@ -0,0 +1,80 @@
|
||||
From c34a13c3df85352124e94456f81e3d4ba4f52440 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Moritz=20=22WanzenBug=22=20Wanzenb=C3=B6ck?=
|
||||
<moritz.wanzenboeck@linbit.com>
|
||||
Date: Fri, 8 Sep 2023 12:20:10 +0200
|
||||
Subject: [PATCH 08/20] compat: block: introduce holder ops
|
||||
|
||||
See also upstream Linux kernel commit
|
||||
0718afd47f70 ("block: introduce holder ops")
|
||||
|
||||
Original message:
|
||||
|
||||
Add a new blk_holder_ops structure, which is passed to blkdev_get_by_* and
|
||||
installed in the block_device for exclusive claims. It will be used to
|
||||
allow the block layer to call back into the user of the block device for
|
||||
thing like notification of a removed device or a device resize.
|
||||
---
|
||||
.../cocci/blkdev_get_by_path__no_has_holder_ops.cocci | 6 ++++++
|
||||
drbd/drbd-kernel-compat/gen_patch_names.c | 3 +++
|
||||
.../tests/blkdev_get_by_path_has_holder_ops.c | 7 +++++++
|
||||
drbd/drbd_nl.c | 3 ++-
|
||||
4 files changed, 18 insertions(+), 1 deletion(-)
|
||||
create mode 100644 drbd/drbd-kernel-compat/cocci/blkdev_get_by_path__no_has_holder_ops.cocci
|
||||
create mode 100644 drbd/drbd-kernel-compat/tests/blkdev_get_by_path_has_holder_ops.c
|
||||
|
||||
diff --git a/drbd/drbd-kernel-compat/cocci/blkdev_get_by_path__no_has_holder_ops.cocci b/drbd/drbd-kernel-compat/cocci/blkdev_get_by_path__no_has_holder_ops.cocci
|
||||
new file mode 100644
|
||||
index 000000000000..050d89e6fe0d
|
||||
--- /dev/null
|
||||
+++ b/drbd/drbd-kernel-compat/cocci/blkdev_get_by_path__no_has_holder_ops.cocci
|
||||
@@ -0,0 +1,6 @@
|
||||
+@@
|
||||
+expression path, mode, holder, ops;
|
||||
+@@
|
||||
+ blkdev_get_by_path(path, mode, holder
|
||||
+- , ops
|
||||
+ )
|
||||
diff --git a/drbd/drbd-kernel-compat/gen_patch_names.c b/drbd/drbd-kernel-compat/gen_patch_names.c
|
||||
index 959bbc351e1b..7071a0a4c5ec 100644
|
||||
--- a/drbd/drbd-kernel-compat/gen_patch_names.c
|
||||
+++ b/drbd/drbd-kernel-compat/gen_patch_names.c
|
||||
@@ -556,6 +556,9 @@ int main(int argc, char **argv)
|
||||
patch(1, "__bio_add_page", true, false,
|
||||
COMPAT_HAVE___BIO_ADD_PAGE, "present");
|
||||
|
||||
+ patch(1, "blkdev_get_by_path", true, false,
|
||||
+ COMPAT_BLKDEV_GET_BY_PATH_HAS_HOLDER_OPS, "has_holder_ops");
|
||||
+
|
||||
/* #define BLKDEV_ISSUE_ZEROOUT_EXPORTED */
|
||||
/* #define BLKDEV_ZERO_NOUNMAP */
|
||||
|
||||
diff --git a/drbd/drbd-kernel-compat/tests/blkdev_get_by_path_has_holder_ops.c b/drbd/drbd-kernel-compat/tests/blkdev_get_by_path_has_holder_ops.c
|
||||
new file mode 100644
|
||||
index 000000000000..02a560782f37
|
||||
--- /dev/null
|
||||
+++ b/drbd/drbd-kernel-compat/tests/blkdev_get_by_path_has_holder_ops.c
|
||||
@@ -0,0 +1,7 @@
|
||||
+/* { "version": "v6.5-rc1", "commit": "0718afd47f70cf46877c39c25d06b786e1a3f36c", "comment": "block: introduce holder ops", "author": "Christoph Hellwig <hch@lst.de>", "date": "Thu Jun 1 11:44:52 2023 +0200" } */
|
||||
+#include <linux/blkdev.h>
|
||||
+
|
||||
+struct block_device *foo(const char *bdev_path, struct blk_holder_ops *ops)
|
||||
+{
|
||||
+ return blkdev_get_by_path(bdev_path, 0, NULL, ops);
|
||||
+}
|
||||
diff --git a/drbd/drbd_nl.c b/drbd/drbd_nl.c
|
||||
index 0fc1d84a996f..0a67bfa4ca52 100644
|
||||
--- a/drbd/drbd_nl.c
|
||||
+++ b/drbd/drbd_nl.c
|
||||
@@ -2560,7 +2560,8 @@ static struct block_device *open_backing_dev(struct drbd_device *device,
|
||||
const char *bdev_path, void *claim_ptr)
|
||||
{
|
||||
struct block_device *bdev = blkdev_get_by_path(bdev_path,
|
||||
- FMODE_READ | FMODE_WRITE | FMODE_EXCL, claim_ptr);
|
||||
+ FMODE_READ | FMODE_WRITE | FMODE_EXCL,
|
||||
+ claim_ptr, NULL);
|
||||
if (IS_ERR(bdev)) {
|
||||
drbd_err(device, "open(\"%s\") failed with %ld\n",
|
||||
bdev_path, PTR_ERR(bdev));
|
||||
--
|
||||
2.35.3
|
||||
|
@ -0,0 +1,45 @@
|
||||
From fc7b1ad2c422e4148d6419f1eec56189a7a578ac Mon Sep 17 00:00:00 2001
|
||||
From: Joel Colledge <joel.colledge@linbit.com>
|
||||
Date: Fri, 1 Sep 2023 11:04:49 +0200
|
||||
Subject: [PATCH 09/20] drbd: reduce "net_ee not empty" info to a dynamic debug
|
||||
print
|
||||
|
||||
This situation is known and harmless. No need to print a worrying
|
||||
"killed N entries" message when it occurs.
|
||||
|
||||
A similar comment explaining that this is harmless was introduced in
|
||||
commit:
|
||||
31e0f1250f17 on disconnect, just give up all references on pages from net_ee
|
||||
|
||||
But the comment got lost in some refactoring:
|
||||
0b220db6109e drbd: move {active,read,sync,done}_ee lists from device to connection
|
||||
|
||||
Bring the comment back, slightly simplified.
|
||||
---
|
||||
drbd/drbd_receiver.c | 8 +++++++-
|
||||
1 file changed, 7 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drbd/drbd_receiver.c b/drbd/drbd_receiver.c
|
||||
index 2e2ed4699a94..223353b1081c 100644
|
||||
--- a/drbd/drbd_receiver.c
|
||||
+++ b/drbd/drbd_receiver.c
|
||||
@@ -8664,9 +8664,15 @@ static void conn_disconnect(struct drbd_connection *connection)
|
||||
i = drbd_free_peer_reqs(connection, &connection->sync_ee);
|
||||
if (i)
|
||||
drbd_info(connection, "sync_ee not empty, killed %u entries\n", i);
|
||||
+
|
||||
+ /*
|
||||
+ * tcp_close and release of sendpage pages can be deferred. We don't
|
||||
+ * care for exactly when the network stack does its put_page(), but
|
||||
+ * release our reference on these pages right here.
|
||||
+ */
|
||||
i = drbd_free_peer_reqs(connection, &connection->net_ee);
|
||||
if (i)
|
||||
- drbd_info(connection, "net_ee not empty, killed %u entries\n", i);
|
||||
+ dynamic_drbd_dbg(connection, "net_ee not empty, killed %u entries\n", i);
|
||||
|
||||
cleanup_unacked_peer_requests(connection);
|
||||
cleanup_peer_ack_list(connection);
|
||||
--
|
||||
2.35.3
|
||||
|
@ -0,0 +1,37 @@
|
||||
From 1b94c10250c7d37423ba894457c40d9799025a93 Mon Sep 17 00:00:00 2001
|
||||
From: Joel Colledge <joel.colledge@linbit.com>
|
||||
Date: Mon, 11 Sep 2023 09:20:24 +0200
|
||||
Subject: [PATCH 10/20] drbd: do not send P_CURRENT_UUID to DRBD 8 peer when
|
||||
our disk fails
|
||||
|
||||
DRBD 8 does not understand P_CURRENT_UUID. Skip the peer in
|
||||
diskfull_peers_need_new_cur_uuid() to avoid sending such a packet.
|
||||
|
||||
This is valid because the DRBD 8 peer generates a new UUID itself when
|
||||
our disk fails.
|
||||
|
||||
This prevents failures of the form:
|
||||
|
||||
drbd res: Unexpected data packet Unknown (0x0044)
|
||||
drbd res: peer( Primary -> Unknown ) conn( Connected -> ProtocolError ) pdsk( Failed -> DUnknown )
|
||||
---
|
||||
drbd/drbd_main.c | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/drbd/drbd_main.c b/drbd/drbd_main.c
|
||||
index ccf0f72829db..e6ed1185c710 100644
|
||||
--- a/drbd/drbd_main.c
|
||||
+++ b/drbd/drbd_main.c
|
||||
@@ -4614,6 +4614,9 @@ static bool diskfull_peers_need_new_cur_uuid(struct drbd_device *device)
|
||||
|
||||
rcu_read_lock();
|
||||
for_each_peer_device_rcu(peer_device, device) {
|
||||
+ if (peer_device->connection->agreed_pro_version < 110)
|
||||
+ continue;
|
||||
+
|
||||
/* Only an up-to-date peer persists a new current uuid! */
|
||||
if (peer_device->disk_state[NOW] < D_UP_TO_DATE)
|
||||
continue;
|
||||
--
|
||||
2.35.3
|
||||
|
129
0011-compat-block-pass-a-gendisk-to-open.patch
Normal file
129
0011-compat-block-pass-a-gendisk-to-open.patch
Normal file
@ -0,0 +1,129 @@
|
||||
From b993152e80676f5b9ce583c9471b630cbd0675d7 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Moritz=20=22WanzenBug=22=20Wanzenb=C3=B6ck?=
|
||||
<moritz.wanzenboeck@linbit.com>
|
||||
Date: Fri, 8 Sep 2023 15:09:47 +0200
|
||||
Subject: [PATCH 11/20] compat: block: pass a gendisk to ->open
|
||||
|
||||
See also upstream Linux kernel commit
|
||||
d32e2bf83791 ("block: pass a gendisk to ->open")
|
||||
|
||||
Original message:
|
||||
|
||||
->open is only called on the whole device. Make that explicit by
|
||||
passing a gendisk instead of the block_device.
|
||||
---
|
||||
...ice_operations_open__no_takes_gendisk.cocci | 18 ++++++++++++++++++
|
||||
drbd/drbd-kernel-compat/gen_patch_names.c | 3 +++
|
||||
...lock_device_operations_open_takes_gendisk.c | 17 +++++++++++++++++
|
||||
drbd/drbd_main.c | 10 +++++-----
|
||||
4 files changed, 43 insertions(+), 5 deletions(-)
|
||||
create mode 100644 drbd/drbd-kernel-compat/cocci/block_device_operations_open__no_takes_gendisk.cocci
|
||||
create mode 100644 drbd/drbd-kernel-compat/tests/block_device_operations_open_takes_gendisk.c
|
||||
|
||||
diff --git a/drbd/drbd-kernel-compat/cocci/block_device_operations_open__no_takes_gendisk.cocci b/drbd/drbd-kernel-compat/cocci/block_device_operations_open__no_takes_gendisk.cocci
|
||||
new file mode 100644
|
||||
index 000000000000..2ba2856da9db
|
||||
--- /dev/null
|
||||
+++ b/drbd/drbd-kernel-compat/cocci/block_device_operations_open__no_takes_gendisk.cocci
|
||||
@@ -0,0 +1,18 @@
|
||||
+@ drbd_open_arg @
|
||||
+identifier gd;
|
||||
+fresh identifier bdev = "" ## "bdev";
|
||||
+@@
|
||||
+ drbd_open(
|
||||
+- struct gendisk *gd,
|
||||
++ struct block_device *bdev,
|
||||
+ ... ) {
|
||||
+<...
|
||||
+(
|
||||
+- gd->part0
|
||||
++ bdev
|
||||
+|
|
||||
+- gd
|
||||
++ bdev->bd_disk
|
||||
+)
|
||||
+...>
|
||||
+}
|
||||
diff --git a/drbd/drbd-kernel-compat/gen_patch_names.c b/drbd/drbd-kernel-compat/gen_patch_names.c
|
||||
index 7071a0a4c5ec..6e4f06d9a3a7 100644
|
||||
--- a/drbd/drbd-kernel-compat/gen_patch_names.c
|
||||
+++ b/drbd/drbd-kernel-compat/gen_patch_names.c
|
||||
@@ -559,6 +559,9 @@ int main(int argc, char **argv)
|
||||
patch(1, "blkdev_get_by_path", true, false,
|
||||
COMPAT_BLKDEV_GET_BY_PATH_HAS_HOLDER_OPS, "has_holder_ops");
|
||||
|
||||
+ patch(1, "block_device_operations_open", true, false,
|
||||
+ COMPAT_BLOCK_DEVICE_OPERATIONS_OPEN_TAKES_GENDISK, "takes_gendisk");
|
||||
+
|
||||
/* #define BLKDEV_ISSUE_ZEROOUT_EXPORTED */
|
||||
/* #define BLKDEV_ZERO_NOUNMAP */
|
||||
|
||||
diff --git a/drbd/drbd-kernel-compat/tests/block_device_operations_open_takes_gendisk.c b/drbd/drbd-kernel-compat/tests/block_device_operations_open_takes_gendisk.c
|
||||
new file mode 100644
|
||||
index 000000000000..d5f20fd569fb
|
||||
--- /dev/null
|
||||
+++ b/drbd/drbd-kernel-compat/tests/block_device_operations_open_takes_gendisk.c
|
||||
@@ -0,0 +1,17 @@
|
||||
+/* { "version": "v6.5-rc1", "commit": "d32e2bf83791727a84ad5d3e3d713e82f9adbe30", "comment": "block: pass a gendisk to ->open", "author": "Christoph Hellwig <hch@lst.de>", "date": "Thu Jun 8 13:02:36 2023 +0200" } */
|
||||
+#include <linux/blkdev.h>
|
||||
+
|
||||
+#ifndef __same_type
|
||||
+# define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))
|
||||
+#endif
|
||||
+
|
||||
+int foo_open(struct gendisk *disk, unsigned int mode)
|
||||
+{
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+void foo(void)
|
||||
+{
|
||||
+ struct block_device_operations ops;
|
||||
+ BUILD_BUG_ON(!(__same_type(ops.open, &foo_open)));
|
||||
+}
|
||||
diff --git a/drbd/drbd_main.c b/drbd/drbd_main.c
|
||||
index e6ed1185c710..53cb4c9e7db3 100644
|
||||
--- a/drbd/drbd_main.c
|
||||
+++ b/drbd/drbd_main.c
|
||||
@@ -52,7 +52,7 @@
|
||||
#include "drbd_meta_data.h"
|
||||
#include "drbd_dax_pmem.h"
|
||||
|
||||
-static int drbd_open(struct block_device *bdev, fmode_t mode);
|
||||
+static int drbd_open(struct gendisk *gd, fmode_t mode);
|
||||
static void drbd_release(struct gendisk *gd, fmode_t mode);
|
||||
static void md_sync_timer_fn(struct timer_list *t);
|
||||
static int w_bitmap_io(struct drbd_work *w, int unused);
|
||||
@@ -2646,9 +2646,9 @@ out:
|
||||
spin_unlock(&device->openers_lock);
|
||||
}
|
||||
|
||||
-static int drbd_open(struct block_device *bdev, fmode_t mode)
|
||||
+static int drbd_open(struct gendisk *gd, fmode_t mode)
|
||||
{
|
||||
- struct drbd_device *device = bdev->bd_disk->private_data;
|
||||
+ struct drbd_device *device = gd->private_data;
|
||||
struct drbd_resource *resource = device->resource;
|
||||
long timeout = resource->res_opts.auto_promote_timeout * HZ / 10;
|
||||
enum ioc_rv r;
|
||||
@@ -2664,7 +2664,7 @@ static int drbd_open(struct block_device *bdev, fmode_t mode)
|
||||
|
||||
/* Fail read-write open early,
|
||||
* in case someone explicitly set us read-only (blockdev --setro) */
|
||||
- if (bdev_read_only(bdev) && (mode & FMODE_WRITE))
|
||||
+ if (bdev_read_only(gd->part0) && (mode & FMODE_WRITE))
|
||||
return -EACCES;
|
||||
|
||||
if (resource->fail_io[NOW])
|
||||
@@ -2740,7 +2740,7 @@ out:
|
||||
|
||||
mutex_unlock(&resource->open_release);
|
||||
if (err) {
|
||||
- drbd_release(bdev->bd_disk, mode);
|
||||
+ drbd_release(gd, mode);
|
||||
if (err == -EAGAIN && !(mode & FMODE_NDELAY))
|
||||
err = -EMEDIUMTYPE;
|
||||
}
|
||||
--
|
||||
2.35.3
|
||||
|
67
0012-drbd-Restore-DATA_CORKED-and-CONTROL_CORKED-bits.patch
Normal file
67
0012-drbd-Restore-DATA_CORKED-and-CONTROL_CORKED-bits.patch
Normal file
@ -0,0 +1,67 @@
|
||||
From 88bf7f95dc359f4901f08ac8fb8ffc7dfceca9c1 Mon Sep 17 00:00:00 2001
|
||||
From: Philipp Reisner <philipp.reisner@linbit.com>
|
||||
Date: Wed, 13 Sep 2023 17:50:37 +0200
|
||||
Subject: [PATCH 12/20] drbd: Restore DATA_CORKED and CONTROL_CORKED bits
|
||||
|
||||
They were removed with 9072e1d1b6b3 in January 2022.
|
||||
|
||||
Since then, the CONTROL_CORKED mapped onto C_UNREGISTERED.
|
||||
|
||||
I think that had a negligible impact because C_UNREGISTERED indicates
|
||||
if a connection was deleted before. It is no longer connected when it
|
||||
is time to delete a connection. Therefore, the corking code can not
|
||||
set that double-used bit.
|
||||
|
||||
The other user of C_UNREGISTERED is when iterating over connections. A
|
||||
wrongly set C_UNREGISTERED causes another iteration over the
|
||||
connections list - no further harm.
|
||||
|
||||
Still, I am fixing this by allocating dedicated bits for corking in
|
||||
the flags word.
|
||||
---
|
||||
drbd/drbd_debugfs.c | 2 ++
|
||||
drbd/drbd_int.h | 2 ++
|
||||
drbd/drbd_main.c | 1 +
|
||||
3 files changed, 5 insertions(+)
|
||||
|
||||
diff --git a/drbd/drbd_debugfs.c b/drbd/drbd_debugfs.c
|
||||
index 778a995018d7..b8e4f2cde426 100644
|
||||
--- a/drbd/drbd_debugfs.c
|
||||
+++ b/drbd/drbd_debugfs.c
|
||||
@@ -839,6 +839,8 @@ static int connection_debug_show(struct seq_file *m, void *ignored)
|
||||
pretty_print_bit(CONN_DRY_RUN);
|
||||
pretty_print_bit(DISCONNECT_EXPECTED);
|
||||
pretty_print_bit(BARRIER_ACK_PENDING);
|
||||
+ pretty_print_bit(DATA_CORKED);
|
||||
+ pretty_print_bit(CONTROL_CORKED);
|
||||
pretty_print_bit(C_UNREGISTERED);
|
||||
pretty_print_bit(RECONNECT);
|
||||
pretty_print_bit(CONN_DISCARD_MY_DATA);
|
||||
diff --git a/drbd/drbd_int.h b/drbd/drbd_int.h
|
||||
index 17be90e7d8fa..4f3228d5a4d1 100644
|
||||
--- a/drbd/drbd_int.h
|
||||
+++ b/drbd/drbd_int.h
|
||||
@@ -755,6 +755,8 @@ enum connection_flag {
|
||||
DISCONNECT_EXPECTED,
|
||||
BARRIER_ACK_PENDING,
|
||||
CORKED,
|
||||
+ DATA_CORKED = CORKED, /* used as computed value CORKED + DATA_STREAM */
|
||||
+ CONTROL_CORKED, /* used as computed value CORKED + CONTROL_STREAM */
|
||||
C_UNREGISTERED,
|
||||
RECONNECT,
|
||||
CONN_DISCARD_MY_DATA,
|
||||
diff --git a/drbd/drbd_main.c b/drbd/drbd_main.c
|
||||
index 53cb4c9e7db3..6bb618909aa0 100644
|
||||
--- a/drbd/drbd_main.c
|
||||
+++ b/drbd/drbd_main.c
|
||||
@@ -1039,6 +1039,7 @@ int __send_command(struct drbd_connection *connection, int vnr,
|
||||
struct drbd_send_buffer *sbuf = &connection->send_buffer[drbd_stream];
|
||||
struct drbd_transport *transport = &connection->transport;
|
||||
struct drbd_transport_ops *tr_ops = transport->ops;
|
||||
+ /* CORKED + drbd_stream is either DATA_CORKED or CONTROL_CORKED */
|
||||
bool corked = test_bit(CORKED + drbd_stream, &connection->flags);
|
||||
bool flush = stream_and_flags & SFLAG_FLUSH;
|
||||
int err;
|
||||
--
|
||||
2.35.3
|
||||
|
@ -0,0 +1,38 @@
|
||||
From 9e087399533445e3df60a34f26a1e6a285b0504a Mon Sep 17 00:00:00 2001
|
||||
From: Joel Colledge <joel.colledge@linbit.com>
|
||||
Date: Tue, 12 Sep 2023 16:36:43 +0200
|
||||
Subject: [PATCH 13/20] drbd: remove unused extern for conn_try_outdate_peer()
|
||||
|
||||
---
|
||||
drbd/drbd_int.h | 1 -
|
||||
drbd/drbd_nl.c | 2 +-
|
||||
2 files changed, 1 insertion(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drbd/drbd_int.h b/drbd/drbd_int.h
|
||||
index 4f3228d5a4d1..f6e7c3ac2629 100644
|
||||
--- a/drbd/drbd_int.h
|
||||
+++ b/drbd/drbd_int.h
|
||||
@@ -1932,7 +1932,6 @@ extern void drbd_reconsider_queue_parameters(struct drbd_device *device,
|
||||
struct drbd_backing_dev *bdev);
|
||||
extern bool barrier_pending(struct drbd_resource *resource);
|
||||
extern enum drbd_state_rv drbd_set_role(struct drbd_resource *, enum drbd_role, bool, struct sk_buff *);
|
||||
-extern bool conn_try_outdate_peer(struct drbd_connection *connection);
|
||||
extern void conn_try_outdate_peer_async(struct drbd_connection *connection);
|
||||
extern int drbd_maybe_khelper(struct drbd_device *, struct drbd_connection *, char *);
|
||||
extern int drbd_create_peer_device_default_config(struct drbd_peer_device *peer_device);
|
||||
diff --git a/drbd/drbd_nl.c b/drbd/drbd_nl.c
|
||||
index 0a67bfa4ca52..cb5cdb184824 100644
|
||||
--- a/drbd/drbd_nl.c
|
||||
+++ b/drbd/drbd_nl.c
|
||||
@@ -768,7 +768,7 @@ static bool intentional_diskless(struct drbd_resource *resource)
|
||||
return intentional_diskless;
|
||||
}
|
||||
|
||||
-bool conn_try_outdate_peer(struct drbd_connection *connection)
|
||||
+static bool conn_try_outdate_peer(struct drbd_connection *connection)
|
||||
{
|
||||
struct drbd_resource *resource = connection->resource;
|
||||
unsigned long last_reconnect_jif;
|
||||
--
|
||||
2.35.3
|
||||
|
1480
0014-drbd-include-source-of-state-change-in-log.patch
Normal file
1480
0014-drbd-include-source-of-state-change-in-log.patch
Normal file
File diff suppressed because it is too large
Load Diff
202
0015-compat-block-use-the-holder-as-indication-for-exclus.patch
Normal file
202
0015-compat-block-use-the-holder-as-indication-for-exclus.patch
Normal file
@ -0,0 +1,202 @@
|
||||
From 3b9fcc2cfaa32766724f371cc2054e057adbc425 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Moritz=20=22WanzenBug=22=20Wanzenb=C3=B6ck?=
|
||||
<moritz.wanzenboeck@linbit.com>
|
||||
Date: Mon, 11 Sep 2023 13:36:07 +0200
|
||||
Subject: [PATCH 15/20] compat: block: use the holder as indication for
|
||||
exclusive opens
|
||||
|
||||
See also upstream Linux kernel commit
|
||||
2736e8eeb0cc ("block: use the holder as indication for exclusive opens")
|
||||
Original message:
|
||||
|
||||
The current interface for exclusive opens is rather confusing as it
|
||||
requires both the FMODE_EXCL flag and a holder. Remove the need to pass
|
||||
FMODE_EXCL and just key off the exclusive open off a non-NULL holder.
|
||||
|
||||
For blkdev_put this requires adding the holder argument, which provides
|
||||
better debug checking that only the holder actually releases the hold,
|
||||
but at the same time allows removing the now superfluous mode argument.
|
||||
---
|
||||
.../cocci/blkdev_put__no_has_holder.cocci | 38 +++++++++++++++++++
|
||||
drbd/drbd-kernel-compat/gen_patch_names.c | 3 ++
|
||||
.../tests/blkdev_put_has_holder.c | 17 +++++++++
|
||||
drbd/drbd_nl.c | 28 ++++++++------
|
||||
4 files changed, 75 insertions(+), 11 deletions(-)
|
||||
create mode 100644 drbd/drbd-kernel-compat/cocci/blkdev_put__no_has_holder.cocci
|
||||
create mode 100644 drbd/drbd-kernel-compat/tests/blkdev_put_has_holder.c
|
||||
|
||||
diff --git a/drbd/drbd-kernel-compat/cocci/blkdev_put__no_has_holder.cocci b/drbd/drbd-kernel-compat/cocci/blkdev_put__no_has_holder.cocci
|
||||
new file mode 100644
|
||||
index 000000000000..c903bc2d529c
|
||||
--- /dev/null
|
||||
+++ b/drbd/drbd-kernel-compat/cocci/blkdev_put__no_has_holder.cocci
|
||||
@@ -0,0 +1,38 @@
|
||||
+@@
|
||||
+expression path, mode;
|
||||
+@@
|
||||
+ blkdev_get_by_path(
|
||||
+ path,
|
||||
+- mode,
|
||||
++ mode | FMODE_EXCL,
|
||||
+ ...
|
||||
+ )
|
||||
+
|
||||
+@@
|
||||
+expression bdev, holder;
|
||||
+@@
|
||||
+ blkdev_put(
|
||||
+ bdev,
|
||||
+- holder
|
||||
++ FMODE_READ | FMODE_WRITE | FMODE_EXCL
|
||||
+ )
|
||||
+
|
||||
+@@
|
||||
+identifier device, bdev, holder, do_bd_unlink;
|
||||
+@@
|
||||
+ void close_backing_dev(
|
||||
+ struct drbd_device *device,
|
||||
+ struct block_device *bdev,
|
||||
+- void *holder,
|
||||
+ bool do_bd_unlink
|
||||
+ ) { ... }
|
||||
+
|
||||
+@@
|
||||
+expression device, bdev, holder, do_bd_unlink;
|
||||
+@@
|
||||
+ close_backing_dev(
|
||||
+ device,
|
||||
+ bdev,
|
||||
+- holder,
|
||||
+ do_bd_unlink
|
||||
+ )
|
||||
diff --git a/drbd/drbd-kernel-compat/gen_patch_names.c b/drbd/drbd-kernel-compat/gen_patch_names.c
|
||||
index 6e4f06d9a3a7..4761c1ef7d0c 100644
|
||||
--- a/drbd/drbd-kernel-compat/gen_patch_names.c
|
||||
+++ b/drbd/drbd-kernel-compat/gen_patch_names.c
|
||||
@@ -562,6 +562,9 @@ int main(int argc, char **argv)
|
||||
patch(1, "block_device_operations_open", true, false,
|
||||
COMPAT_BLOCK_DEVICE_OPERATIONS_OPEN_TAKES_GENDISK, "takes_gendisk");
|
||||
|
||||
+ patch(1, "blkdev_put", true, false,
|
||||
+ COMPAT_BLKDEV_PUT_HAS_HOLDER, "has_holder");
|
||||
+
|
||||
/* #define BLKDEV_ISSUE_ZEROOUT_EXPORTED */
|
||||
/* #define BLKDEV_ZERO_NOUNMAP */
|
||||
|
||||
diff --git a/drbd/drbd-kernel-compat/tests/blkdev_put_has_holder.c b/drbd/drbd-kernel-compat/tests/blkdev_put_has_holder.c
|
||||
new file mode 100644
|
||||
index 000000000000..d5f0c5dd0355
|
||||
--- /dev/null
|
||||
+++ b/drbd/drbd-kernel-compat/tests/blkdev_put_has_holder.c
|
||||
@@ -0,0 +1,17 @@
|
||||
+/* { "version": "v6.5-rc1", "commit": "ae220766d87cd6799dbf918fea10613ae14c0654", "comment": "block: remove the unused mode argument to ->release", "author": "Christoph Hellwig <hch@lst.de>", "date": "Thu Jun 8 13:02:37 2023 +0200" } */
|
||||
+#include <linux/blkdev.h>
|
||||
+
|
||||
+#ifndef __same_type
|
||||
+# define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))
|
||||
+#endif
|
||||
+
|
||||
+void foo_blkdev_put(struct block_device *bdev, void *holder)
|
||||
+{
|
||||
+}
|
||||
+
|
||||
+
|
||||
+void foo(void)
|
||||
+{
|
||||
+ BUILD_BUG_ON(!(__same_type(&blkdev_put, &foo_blkdev_put)));
|
||||
+}
|
||||
+
|
||||
diff --git a/drbd/drbd_nl.c b/drbd/drbd_nl.c
|
||||
index b7e9e43312f9..8c968cf252ca 100644
|
||||
--- a/drbd/drbd_nl.c
|
||||
+++ b/drbd/drbd_nl.c
|
||||
@@ -2536,13 +2536,13 @@ bool want_bitmap(struct drbd_peer_device *peer_device)
|
||||
}
|
||||
|
||||
static void close_backing_dev(struct drbd_device *device, struct block_device *bdev,
|
||||
- bool do_bd_unlink)
|
||||
+ void *holder, bool do_bd_unlink)
|
||||
{
|
||||
if (!bdev)
|
||||
return;
|
||||
if (do_bd_unlink)
|
||||
bd_unlink_disk_holder(bdev, device->vdisk);
|
||||
- blkdev_put(bdev, FMODE_READ | FMODE_WRITE | FMODE_EXCL);
|
||||
+ blkdev_put(bdev, holder);
|
||||
}
|
||||
|
||||
void drbd_backing_dev_free(struct drbd_device *device, struct drbd_backing_dev *ldev)
|
||||
@@ -2552,8 +2552,11 @@ void drbd_backing_dev_free(struct drbd_device *device, struct drbd_backing_dev *
|
||||
|
||||
drbd_dax_close(ldev);
|
||||
|
||||
- close_backing_dev(device, ldev->md_bdev, ldev->md_bdev != ldev->backing_bdev);
|
||||
- close_backing_dev(device, ldev->backing_bdev, true);
|
||||
+ close_backing_dev(device,
|
||||
+ ldev->md_bdev,
|
||||
+ ldev->md.meta_dev_idx < 0 ? (void *)device : (void *)drbd_m_holder,
|
||||
+ ldev->md_bdev != ldev->backing_bdev);
|
||||
+ close_backing_dev(device, ldev->backing_bdev, device, true);
|
||||
|
||||
kfree(ldev->disk_conf);
|
||||
kfree(ldev);
|
||||
@@ -2563,7 +2566,7 @@ static struct block_device *open_backing_dev(struct drbd_device *device,
|
||||
const char *bdev_path, void *claim_ptr)
|
||||
{
|
||||
struct block_device *bdev = blkdev_get_by_path(bdev_path,
|
||||
- FMODE_READ | FMODE_WRITE | FMODE_EXCL,
|
||||
+ FMODE_READ | FMODE_WRITE,
|
||||
claim_ptr, NULL);
|
||||
if (IS_ERR(bdev)) {
|
||||
drbd_err(device, "open(\"%s\") failed with %ld\n",
|
||||
@@ -2588,6 +2591,7 @@ static int open_backing_devices(struct drbd_device *device,
|
||||
struct drbd_backing_dev *nbc)
|
||||
{
|
||||
struct block_device *bdev;
|
||||
+ void *meta_claim_ptr;
|
||||
int err;
|
||||
|
||||
bdev = open_backing_dev(device, new_disk_conf->backing_dev, device);
|
||||
@@ -2597,12 +2601,17 @@ static int open_backing_devices(struct drbd_device *device,
|
||||
err = link_backing_dev(device, new_disk_conf->backing_dev, bdev);
|
||||
if (err) {
|
||||
/* close without unlinking; otherwise error path will try to unlink */
|
||||
- close_backing_dev(device, bdev, false);
|
||||
+ close_backing_dev(device, bdev, device, false);
|
||||
return ERR_OPEN_DISK;
|
||||
}
|
||||
|
||||
nbc->backing_bdev = bdev;
|
||||
|
||||
+ /* meta_claim_ptr: device, if claimed exclusively; shared drbd_m_holder,
|
||||
+ * if potentially shared with other drbd minors
|
||||
+ */
|
||||
+ meta_claim_ptr = (new_disk_conf->meta_dev_idx < 0) ?
|
||||
+ (void *)device : (void *)drbd_m_holder;
|
||||
/*
|
||||
* meta_dev_idx >= 0: external fixed size, possibly multiple
|
||||
* drbd sharing one meta device. TODO in that case, paranoia
|
||||
@@ -2611,10 +2620,7 @@ static int open_backing_devices(struct drbd_device *device,
|
||||
* should check it for you already; but if you don't, or
|
||||
* someone fooled it, we need to double check here)
|
||||
*/
|
||||
- bdev = open_backing_dev(device, new_disk_conf->meta_dev,
|
||||
- /* claim ptr: device, if claimed exclusively; shared drbd_m_holder,
|
||||
- * if potentially shared with other drbd minors */
|
||||
- (new_disk_conf->meta_dev_idx < 0) ? (void*)device : (void*)drbd_m_holder);
|
||||
+ bdev = open_backing_dev(device, new_disk_conf->meta_dev, meta_claim_ptr);
|
||||
if (IS_ERR(bdev))
|
||||
return ERR_OPEN_MD_DISK;
|
||||
|
||||
@@ -2624,7 +2630,7 @@ static int open_backing_devices(struct drbd_device *device,
|
||||
err = link_backing_dev(device, new_disk_conf->meta_dev, bdev);
|
||||
if (err) {
|
||||
/* close without unlinking; otherwise error path will try to unlink */
|
||||
- close_backing_dev(device, bdev, false);
|
||||
+ close_backing_dev(device, bdev, meta_claim_ptr, false);
|
||||
return ERR_OPEN_MD_DISK;
|
||||
}
|
||||
}
|
||||
--
|
||||
2.35.3
|
||||
|
@ -0,0 +1,33 @@
|
||||
From 69d9286628b730870665cd2c6f05dd9f1813c65e Mon Sep 17 00:00:00 2001
|
||||
From: Philipp Reisner <philipp.reisner@linbit.com>
|
||||
Date: Sun, 17 Sep 2023 22:21:11 +0800
|
||||
Subject: [PATCH 16/20] drbd: Fix `net-options --set-defaults` to not clear the
|
||||
transport
|
||||
|
||||
So far, `drbdsetup net-options --set-defaults` cleared the
|
||||
transport_name. That is a stupid bug that caused `drbdadm adjust` to
|
||||
do a disconnect/connect cycle. This affected `lb-tcp` and `rdma`. As
|
||||
`tcp` is the default, it was not affected by this.
|
||||
---
|
||||
drbd/drbd_nl.c | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
diff --git a/drbd/drbd_nl.c b/drbd/drbd_nl.c
|
||||
index 8c968cf252ca..b0a1e6fa46f1 100644
|
||||
--- a/drbd/drbd_nl.c
|
||||
+++ b/drbd/drbd_nl.c
|
||||
@@ -3729,6 +3729,11 @@ int drbd_adm_net_opts(struct sk_buff *skb, struct genl_info *info)
|
||||
if (should_set_defaults(info))
|
||||
set_net_conf_defaults(new_net_conf);
|
||||
|
||||
+ /* The transport_name is immutable taking precedence over set_net_conf_defaults() */
|
||||
+ memcpy(new_net_conf->transport_name, old_net_conf->transport_name,
|
||||
+ old_net_conf->transport_name_len);
|
||||
+ new_net_conf->transport_name_len = old_net_conf->transport_name_len;
|
||||
+
|
||||
err = net_conf_from_attrs_for_change(new_net_conf, info);
|
||||
if (err && err != -ENOMSG) {
|
||||
retcode = ERR_MANDATORY_TAG;
|
||||
--
|
||||
2.35.3
|
||||
|
@ -0,0 +1,35 @@
|
||||
From 0666bc5b014049b6aa184b5a8fdb60481b9c8717 Mon Sep 17 00:00:00 2001
|
||||
From: Philipp Reisner <philipp.reisner@linbit.com>
|
||||
Date: Fri, 22 Sep 2023 15:09:07 +0200
|
||||
Subject: [PATCH 17/20] drbd: propagate exposed UUIDs only into established
|
||||
connections
|
||||
|
||||
Sending into connections in C_CONNECTING state while we exchange the
|
||||
feature and auth packets might interfere with exchanging those. I also
|
||||
witnessed that it might block unexpectedly long (2 - 6 seconds),
|
||||
holding the `connection->mutex[DATA_STREAM]` mutex and again causing
|
||||
troubles with establishing connections.
|
||||
|
||||
This is a fix for commit 772e5b21d from April 2023
|
||||
"drbd: Consider outdating a disk when more recent data is behind a diskless"
|
||||
Released with of 9.1.15 and 9.2.4.
|
||||
---
|
||||
drbd/drbd_receiver.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drbd/drbd_receiver.c b/drbd/drbd_receiver.c
|
||||
index 0c3ab0fd486c..bfd265b86b43 100644
|
||||
--- a/drbd/drbd_receiver.c
|
||||
+++ b/drbd/drbd_receiver.c
|
||||
@@ -7206,7 +7206,7 @@ static void propagate_exposed_uuid(struct drbd_device *device)
|
||||
u64 im;
|
||||
|
||||
for_each_peer_device_ref(peer_device, im, device) {
|
||||
- if (peer_device->connection->cstate[NOW] < C_CONNECTING)
|
||||
+ if (!test_bit(INITIAL_STATE_SENT, &peer_device->flags))
|
||||
continue;
|
||||
drbd_send_current_uuid(peer_device, device->exposed_data_uuid, 0);
|
||||
}
|
||||
--
|
||||
2.35.3
|
||||
|
185
0018-drbd-rework-autopromote.patch
Normal file
185
0018-drbd-rework-autopromote.patch
Normal file
@ -0,0 +1,185 @@
|
||||
From e3ef0e229a6ae88346164d1507697ae1b397cdf9 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Moritz=20=22WanzenBug=22=20Wanzenb=C3=B6ck?=
|
||||
<moritz.wanzenboeck@linbit.com>
|
||||
Date: Tue, 12 Sep 2023 10:17:08 +0200
|
||||
Subject: [PATCH 18/20] drbd: rework autopromote
|
||||
|
||||
With upstream commit ae220766d87c we lost the ability to keep separate
|
||||
counts for RW and RO openers. Instead, we keep track of openers using a
|
||||
single count, and a flag indicating if the device was opened RW once.
|
||||
|
||||
Once a device was opened RW, it will stay "writable" for DRBD, until all
|
||||
openers are gone. This should offer a good compromise between keeping
|
||||
the old auto-promote behaviour, and the changed device interface.
|
||||
---
|
||||
drbd/drbd_int.h | 3 ++-
|
||||
drbd/drbd_main.c | 38 +++++++++++++++++++++-----------------
|
||||
drbd/drbd_nl.c | 9 +++++----
|
||||
drbd/drbd_state.c | 7 ++++---
|
||||
4 files changed, 32 insertions(+), 25 deletions(-)
|
||||
|
||||
diff --git a/drbd/drbd_int.h b/drbd/drbd_int.h
|
||||
index b705f26e71a4..cf593c09cda1 100644
|
||||
--- a/drbd/drbd_int.h
|
||||
+++ b/drbd/drbd_int.h
|
||||
@@ -1399,7 +1399,8 @@ struct drbd_device {
|
||||
|
||||
struct drbd_bitmap *bitmap;
|
||||
|
||||
- int open_rw_cnt, open_ro_cnt;
|
||||
+ int open_cnt;
|
||||
+ bool writable;
|
||||
/* FIXME clean comments, restructure so it is more obvious which
|
||||
* members are protected by what */
|
||||
|
||||
diff --git a/drbd/drbd_main.c b/drbd/drbd_main.c
|
||||
index 4b0b967c2c97..bb05b2215dfb 100644
|
||||
--- a/drbd/drbd_main.c
|
||||
+++ b/drbd/drbd_main.c
|
||||
@@ -2579,10 +2579,9 @@ static enum ioc_rv inc_open_count(struct drbd_device *device, fmode_t mode)
|
||||
r = IOC_ABORT;
|
||||
else if (!resource->remote_state_change) {
|
||||
r = IOC_OK;
|
||||
+ device->open_cnt++;
|
||||
if (mode & FMODE_WRITE)
|
||||
- device->open_rw_cnt++;
|
||||
- else
|
||||
- device->open_ro_cnt++;
|
||||
+ device->writable = true;
|
||||
}
|
||||
read_unlock_irq(&resource->state_rwlock);
|
||||
|
||||
@@ -2756,8 +2755,10 @@ void drbd_open_counts(struct drbd_resource *resource, int *rw_count_ptr, int *ro
|
||||
|
||||
rcu_read_lock();
|
||||
idr_for_each_entry(&resource->devices, device, vnr) {
|
||||
- rw_count += device->open_rw_cnt;
|
||||
- ro_count += device->open_ro_cnt;
|
||||
+ if (device->writable)
|
||||
+ rw_count += device->open_cnt;
|
||||
+ else
|
||||
+ ro_count += device->open_cnt;
|
||||
}
|
||||
rcu_read_unlock();
|
||||
*rw_count_ptr = rw_count;
|
||||
@@ -2825,33 +2826,35 @@ static void drbd_release(struct gendisk *gd, fmode_t mode)
|
||||
{
|
||||
struct drbd_device *device = gd->private_data;
|
||||
struct drbd_resource *resource = device->resource;
|
||||
+ bool was_writable = device->writable;
|
||||
int open_rw_cnt, open_ro_cnt;
|
||||
|
||||
mutex_lock(&resource->open_release);
|
||||
- if (mode & FMODE_WRITE)
|
||||
- device->open_rw_cnt--;
|
||||
- else
|
||||
- device->open_ro_cnt--;
|
||||
+ device->open_cnt--;
|
||||
|
||||
drbd_open_counts(resource, &open_rw_cnt, &open_ro_cnt);
|
||||
|
||||
- /* last one to close will be responsible for write-out of all dirty pages */
|
||||
- if (mode & FMODE_WRITE && device->open_rw_cnt == 0)
|
||||
+ /* last one to close will be responsible for write-out of all dirty pages.
|
||||
+ * We also reset the writable flag for this device here: later code may
|
||||
+ * check if the device is still opened for writes to determine things
|
||||
+ * like auto-demote.
|
||||
+ */
|
||||
+ if (was_writable && device->open_cnt == 0) {
|
||||
drbd_fsync_device(device);
|
||||
+ device->writable = false;
|
||||
+ }
|
||||
|
||||
if (open_ro_cnt == 0)
|
||||
wake_up_all(&resource->state_wait);
|
||||
|
||||
- if (test_bit(UNREGISTERED, &device->flags) &&
|
||||
- device->open_rw_cnt == 0 && device->open_ro_cnt == 0 &&
|
||||
+ if (test_bit(UNREGISTERED, &device->flags) && device->open_cnt == 0 &&
|
||||
!test_and_set_bit(DESTROYING_DEV, &device->flags))
|
||||
call_rcu(&device->rcu, drbd_reclaim_device);
|
||||
|
||||
if (resource->res_opts.auto_promote) {
|
||||
enum drbd_state_rv rv;
|
||||
|
||||
- if (mode & FMODE_WRITE &&
|
||||
- open_rw_cnt == 0 &&
|
||||
+ if (was_writable && open_rw_cnt == 0 &&
|
||||
resource->role[NOW] == R_PRIMARY &&
|
||||
!test_bit(EXPLICIT_PRIMARY, &resource->flags)) {
|
||||
rv = drbd_set_role(resource, R_SECONDARY, false, "auto-demote", NULL);
|
||||
@@ -2869,9 +2872,10 @@ static void drbd_release(struct gendisk *gd, fmode_t mode)
|
||||
end_state_change(resource, &irq_flags, "release");
|
||||
}
|
||||
|
||||
- /* if the open counts are 0, we free the whole list, otherwise we remove the specific pid */
|
||||
+ /* if the open count is 0, we free the whole list, otherwise we remove the specific pid */
|
||||
prune_or_free_openers(device,
|
||||
- (open_ro_cnt == 0 && open_rw_cnt == 0) ? 0 : task_pid_nr(current));
|
||||
+ (open_ro_cnt == 0 && open_rw_cnt == 0) ?
|
||||
+ 0 : task_pid_nr(current));
|
||||
|
||||
mutex_unlock(&resource->open_release);
|
||||
|
||||
diff --git a/drbd/drbd_nl.c b/drbd/drbd_nl.c
|
||||
index b0a1e6fa46f1..71ed4272614e 100644
|
||||
--- a/drbd/drbd_nl.c
|
||||
+++ b/drbd/drbd_nl.c
|
||||
@@ -4541,8 +4541,10 @@ int drbd_open_ro_count(struct drbd_resource *resource)
|
||||
int vnr, open_ro_cnt = 0;
|
||||
|
||||
read_lock_irq(&resource->state_rwlock);
|
||||
- idr_for_each_entry(&resource->devices, device, vnr)
|
||||
- open_ro_cnt += device->open_ro_cnt;
|
||||
+ idr_for_each_entry(&resource->devices, device, vnr) {
|
||||
+ if (!device->writable)
|
||||
+ open_ro_cnt += device->open_cnt;
|
||||
+ }
|
||||
read_unlock_irq(&resource->state_rwlock);
|
||||
|
||||
return open_ro_cnt;
|
||||
@@ -6394,8 +6396,7 @@ static enum drbd_ret_code adm_del_minor(struct drbd_device *device)
|
||||
notify_device_state(NULL, 0, device, NULL, NOTIFY_DESTROY);
|
||||
mutex_unlock(¬ification_mutex);
|
||||
|
||||
- if (device->open_ro_cnt == 0 && device->open_rw_cnt == 0 &&
|
||||
- !test_and_set_bit(DESTROYING_DEV, &device->flags))
|
||||
+ if (device->open_cnt == 0 && !test_and_set_bit(DESTROYING_DEV, &device->flags))
|
||||
call_rcu(&device->rcu, drbd_reclaim_device);
|
||||
|
||||
return ret;
|
||||
diff --git a/drbd/drbd_state.c b/drbd/drbd_state.c
|
||||
index 22cd134be962..fa70507df425 100644
|
||||
--- a/drbd/drbd_state.c
|
||||
+++ b/drbd/drbd_state.c
|
||||
@@ -1634,7 +1634,7 @@ handshake_found:
|
||||
return SS_TWO_PRIMARIES;
|
||||
if (!fail_io[NEW]) {
|
||||
idr_for_each_entry(&resource->devices, device, vnr) {
|
||||
- if (device->open_ro_cnt)
|
||||
+ if (!device->writable && device->open_cnt)
|
||||
return SS_PRIMARY_READER;
|
||||
/*
|
||||
* One might be tempted to add "|| open_rw_cont" here.
|
||||
@@ -1661,7 +1661,7 @@ handshake_found:
|
||||
(disk_state[OLD] > D_DETACHING && disk_state[NEW] == D_DETACHING)))
|
||||
return SS_IN_TRANSIENT_STATE;
|
||||
|
||||
- if (role[OLD] == R_PRIMARY && role[NEW] == R_SECONDARY && device->open_rw_cnt &&
|
||||
+ if (role[OLD] == R_PRIMARY && role[NEW] == R_SECONDARY && device->writable &&
|
||||
!(resource->state_change_flags & CS_FS_IGN_OPENERS))
|
||||
return SS_DEVICE_IN_USE;
|
||||
|
||||
@@ -1693,7 +1693,8 @@ handshake_found:
|
||||
return SS_NO_UP_TO_DATE_DISK;
|
||||
|
||||
/* Prevent detach or disconnect while held open read only */
|
||||
- if (device->open_ro_cnt && any_disk_up_to_date[OLD] && !any_disk_up_to_date[NEW])
|
||||
+ if (!device->writable && device->open_cnt &&
|
||||
+ any_disk_up_to_date[OLD] && !any_disk_up_to_date[NEW])
|
||||
return SS_NO_UP_TO_DATE_DISK;
|
||||
|
||||
if (disk_state[NEW] == D_NEGOTIATING)
|
||||
--
|
||||
2.35.3
|
||||
|
107
0019-compat-block-remove-the-unused-mode-argument-to-rele.patch
Normal file
107
0019-compat-block-remove-the-unused-mode-argument-to-rele.patch
Normal file
@ -0,0 +1,107 @@
|
||||
From bf287c15359c4495a706ca270e7dcab4c2d6ebcc Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Moritz=20=22WanzenBug=22=20Wanzenb=C3=B6ck?=
|
||||
<moritz.wanzenboeck@linbit.com>
|
||||
Date: Tue, 12 Sep 2023 15:27:01 +0200
|
||||
Subject: [PATCH 19/20] compat: block: remove the unused mode argument to
|
||||
->release
|
||||
|
||||
See also upstream Linux kernel commit
|
||||
ae220766d87c ("block: remove the unused mode argument to ->release")
|
||||
|
||||
Original message:
|
||||
|
||||
The mode argument to the ->release block_device_operation is never used,
|
||||
so remove it.
|
||||
---
|
||||
...ions_release__no_takes_single_argument.cocci | 17 +++++++++++++++++
|
||||
drbd/drbd-kernel-compat/gen_patch_names.c | 3 +++
|
||||
...e_operations_release_takes_single_argument.c | 7 +++++++
|
||||
drbd/drbd_main.c | 6 +++---
|
||||
4 files changed, 30 insertions(+), 3 deletions(-)
|
||||
create mode 100644 drbd/drbd-kernel-compat/cocci/block_device_operations_release__no_takes_single_argument.cocci
|
||||
create mode 100644 drbd/drbd-kernel-compat/tests/block_device_operations_release_takes_single_argument.c
|
||||
|
||||
diff --git a/drbd/drbd-kernel-compat/cocci/block_device_operations_release__no_takes_single_argument.cocci b/drbd/drbd-kernel-compat/cocci/block_device_operations_release__no_takes_single_argument.cocci
|
||||
new file mode 100644
|
||||
index 000000000000..b0a0ee9eef39
|
||||
--- /dev/null
|
||||
+++ b/drbd/drbd-kernel-compat/cocci/block_device_operations_release__no_takes_single_argument.cocci
|
||||
@@ -0,0 +1,17 @@
|
||||
+@@
|
||||
+identifier gd;
|
||||
+fresh identifier mode = "" ## "mode";
|
||||
+@@
|
||||
+ drbd_release(
|
||||
+ struct gendisk *gd
|
||||
++ , fmode_t mode
|
||||
+ ) { ... }
|
||||
+
|
||||
+@@
|
||||
+symbol drbd_release;
|
||||
+expression gd;
|
||||
+@@
|
||||
+ drbd_release(
|
||||
+ gd
|
||||
++ , 0
|
||||
+ )
|
||||
diff --git a/drbd/drbd-kernel-compat/gen_patch_names.c b/drbd/drbd-kernel-compat/gen_patch_names.c
|
||||
index 4761c1ef7d0c..608be8b4f099 100644
|
||||
--- a/drbd/drbd-kernel-compat/gen_patch_names.c
|
||||
+++ b/drbd/drbd-kernel-compat/gen_patch_names.c
|
||||
@@ -565,6 +565,9 @@ int main(int argc, char **argv)
|
||||
patch(1, "blkdev_put", true, false,
|
||||
COMPAT_BLKDEV_PUT_HAS_HOLDER, "has_holder");
|
||||
|
||||
+ patch(1, "block_device_operations_release", true, false,
|
||||
+ COMPAT_BLOCK_DEVICE_OPERATIONS_RELEASE_TAKES_SINGLE_ARGUMENT, "takes_single_argument");
|
||||
+
|
||||
/* #define BLKDEV_ISSUE_ZEROOUT_EXPORTED */
|
||||
/* #define BLKDEV_ZERO_NOUNMAP */
|
||||
|
||||
diff --git a/drbd/drbd-kernel-compat/tests/block_device_operations_release_takes_single_argument.c b/drbd/drbd-kernel-compat/tests/block_device_operations_release_takes_single_argument.c
|
||||
new file mode 100644
|
||||
index 000000000000..d51c863e359a
|
||||
--- /dev/null
|
||||
+++ b/drbd/drbd-kernel-compat/tests/block_device_operations_release_takes_single_argument.c
|
||||
@@ -0,0 +1,7 @@
|
||||
+/* { "version": "v6.5-rc1", "commit": "ae220766d87cd6799dbf918fea10613ae14c0654", "comment": "block: remove the unused mode argument to ->release", "author": "Christoph Hellwig <hch@lst.de>", "date": "Thu Jun 8 13:02:37 2023 +0200" } */
|
||||
+#include <linux/blkdev.h>
|
||||
+
|
||||
+void foo(struct block_device_operations *ops, struct gendisk *gd)
|
||||
+{
|
||||
+ ops->release(gd);
|
||||
+}
|
||||
diff --git a/drbd/drbd_main.c b/drbd/drbd_main.c
|
||||
index bb05b2215dfb..1864861db21d 100644
|
||||
--- a/drbd/drbd_main.c
|
||||
+++ b/drbd/drbd_main.c
|
||||
@@ -53,7 +53,7 @@
|
||||
#include "drbd_dax_pmem.h"
|
||||
|
||||
static int drbd_open(struct gendisk *gd, fmode_t mode);
|
||||
-static void drbd_release(struct gendisk *gd, fmode_t mode);
|
||||
+static void drbd_release(struct gendisk *gd);
|
||||
static void md_sync_timer_fn(struct timer_list *t);
|
||||
static int w_bitmap_io(struct drbd_work *w, int unused);
|
||||
static int flush_send_buffer(struct drbd_connection *connection, enum drbd_stream drbd_stream);
|
||||
@@ -2740,7 +2740,7 @@ out:
|
||||
|
||||
mutex_unlock(&resource->open_release);
|
||||
if (err) {
|
||||
- drbd_release(gd, mode);
|
||||
+ drbd_release(gd);
|
||||
if (err == -EAGAIN && !(mode & FMODE_NDELAY))
|
||||
err = -EMEDIUMTYPE;
|
||||
}
|
||||
@@ -2822,7 +2822,7 @@ void drbd_fsync_device(struct drbd_device *device)
|
||||
drbd_flush_peer_acks(resource);
|
||||
}
|
||||
|
||||
-static void drbd_release(struct gendisk *gd, fmode_t mode)
|
||||
+static void drbd_release(struct gendisk *gd)
|
||||
{
|
||||
struct drbd_device *device = gd->private_data;
|
||||
struct drbd_resource *resource = device->resource;
|
||||
--
|
||||
2.35.3
|
||||
|
@ -0,0 +1,66 @@
|
||||
From c8e2a3c4355b4794267cd6e58a074802b4607cb9 Mon Sep 17 00:00:00 2001
|
||||
From: Joel Colledge <joel.colledge@linbit.com>
|
||||
Date: Fri, 22 Sep 2023 16:57:24 +0200
|
||||
Subject: [PATCH 20/20] drbd: do not allow auto-demote to be interrupted by
|
||||
signal
|
||||
|
||||
Pending signals can mess up auto-demote:
|
||||
|
||||
drbd res: Preparing cluster-wide state change 671410162 (0->-1 3/2)
|
||||
drbd res: Aborting cluster-wide state change 671410162 (6ms) rv = -21
|
||||
drbd res: Auto-demote failed: Interrupted state change
|
||||
|
||||
After this state change failure no process has the DRBD device open, but
|
||||
DRBD remains Primary.
|
||||
---
|
||||
drbd/drbd_main.c | 33 +++++++++++++++++++++++----------
|
||||
1 file changed, 23 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/drbd/drbd_main.c b/drbd/drbd_main.c
|
||||
index 1864861db21d..0719229f210e 100644
|
||||
--- a/drbd/drbd_main.c
|
||||
+++ b/drbd/drbd_main.c
|
||||
@@ -2851,17 +2851,30 @@ static void drbd_release(struct gendisk *gd)
|
||||
!test_and_set_bit(DESTROYING_DEV, &device->flags))
|
||||
call_rcu(&device->rcu, drbd_reclaim_device);
|
||||
|
||||
- if (resource->res_opts.auto_promote) {
|
||||
- enum drbd_state_rv rv;
|
||||
+ if (resource->res_opts.auto_promote &&
|
||||
+ open_rw_cnt == 0 &&
|
||||
+ resource->role[NOW] == R_PRIMARY &&
|
||||
+ !test_bit(EXPLICIT_PRIMARY, &resource->flags)) {
|
||||
+ sigset_t mask, oldmask;
|
||||
+ int rv;
|
||||
+
|
||||
+ /*
|
||||
+ * Auto-demote is triggered by the last opener releasing the
|
||||
+ * DRBD device. However, it is an implicit action, so it should
|
||||
+ * not be affected by the state of the process. In particular,
|
||||
+ * it should ignore any pending signals. It may be the case
|
||||
+ * that the process is releasing DRBD because it is being
|
||||
+ * terminated using a signal.
|
||||
+ */
|
||||
+ sigfillset(&mask);
|
||||
+ sigprocmask(SIG_BLOCK, &mask, &oldmask);
|
||||
|
||||
- if (was_writable && open_rw_cnt == 0 &&
|
||||
- resource->role[NOW] == R_PRIMARY &&
|
||||
- !test_bit(EXPLICIT_PRIMARY, &resource->flags)) {
|
||||
- rv = drbd_set_role(resource, R_SECONDARY, false, "auto-demote", NULL);
|
||||
- if (rv < SS_SUCCESS)
|
||||
- drbd_warn(resource, "Auto-demote failed: %s (%d)\n",
|
||||
- drbd_set_st_err_str(rv), rv);
|
||||
- }
|
||||
+ rv = drbd_set_role(resource, R_SECONDARY, false, "auto-demote", NULL);
|
||||
+ if (rv < SS_SUCCESS)
|
||||
+ drbd_warn(resource, "Auto-demote failed: %s (%d)\n",
|
||||
+ drbd_set_st_err_str(rv), rv);
|
||||
+
|
||||
+ sigprocmask(SIG_SETMASK, &oldmask, NULL);
|
||||
}
|
||||
|
||||
if (open_ro_cnt == 0 && open_rw_cnt == 0 && resource->fail_io[NOW]) {
|
||||
--
|
||||
2.35.3
|
||||
|
107
0021-compat-sock-Remove-sendpage-in-favour-of-sendmsg-MSG.patch
Normal file
107
0021-compat-sock-Remove-sendpage-in-favour-of-sendmsg-MSG.patch
Normal file
@ -0,0 +1,107 @@
|
||||
From a000a5577210929ca808fe19719186cb7e917f44 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Moritz=20WanzenBug=20Wanzenb=C3=B6ck?=
|
||||
<moritz.wanzenboeck@linbit.com>
|
||||
Date: Wed, 13 Sep 2023 13:30:57 +0200
|
||||
Subject: [PATCH] compat: sock: Remove ->sendpage*() in favour of
|
||||
sendmsg(MSG_SPLICE_PAGES)
|
||||
|
||||
See also upstream Linux kernel commits
|
||||
dc97391e6610 ("sock: Remove ->sendpage*() in favour of sendmsg(MSG_SPLICE_PAGES)")
|
||||
eeac7405c735 ("drbd: Use sendmsg(MSG_SPLICE_PAGES) rather than sendpage()")
|
||||
4b9c2edaf728 ("drbd: swap bvec_set_page len and offset")
|
||||
|
||||
Original message:
|
||||
|
||||
Remove ->sendpage() and ->sendpage_locked(). sendmsg() with
|
||||
MSG_SPLICE_PAGES should be used instead. This allows multiple pages and
|
||||
multipage folios to be passed through.
|
||||
---
|
||||
.../cocci/msg_splice_pages__no_present.cocci | 16 ++++++++++++++++
|
||||
drbd/drbd-kernel-compat/gen_patch_names.c | 3 +++
|
||||
.../tests/have_msg_splice_pages.c | 7 +++++++
|
||||
drbd/drbd_transport_tcp.c | 8 ++++++--
|
||||
4 files changed, 32 insertions(+), 2 deletions(-)
|
||||
create mode 100644 drbd/drbd-kernel-compat/cocci/msg_splice_pages__no_present.cocci
|
||||
create mode 100644 drbd/drbd-kernel-compat/tests/have_msg_splice_pages.c
|
||||
|
||||
diff --git a/drbd/drbd-kernel-compat/cocci/msg_splice_pages__no_present.cocci b/drbd/drbd-kernel-compat/cocci/msg_splice_pages__no_present.cocci
|
||||
new file mode 100644
|
||||
index 000000000000..0fdf77e43737
|
||||
--- /dev/null
|
||||
+++ b/drbd/drbd-kernel-compat/cocci/msg_splice_pages__no_present.cocci
|
||||
@@ -0,0 +1,16 @@
|
||||
+@@
|
||||
+expression flags;
|
||||
+@@
|
||||
+ flags
|
||||
+- | MSG_SPLICE_PAGES
|
||||
+
|
||||
+@@
|
||||
+identifier bvec, page, len, offset, msg, socket;
|
||||
+@@
|
||||
+- struct bio_vec bvec;
|
||||
+ ...
|
||||
+ int sent;
|
||||
+- bvec_set_page(&bvec, page, len, offset);
|
||||
+- iov_iter_bvec(&msg.msg_iter, ITER_SOURCE, &bvec, 1, len);
|
||||
+- sent = sock_sendmsg(socket, &msg);
|
||||
++ sent = socket->ops->sendpage(socket, page, offset, len, msg.msg_flags);
|
||||
diff --git a/drbd/drbd-kernel-compat/gen_patch_names.c b/drbd/drbd-kernel-compat/gen_patch_names.c
|
||||
index 608be8b4f099..6a96c5b89f11 100644
|
||||
--- a/drbd/drbd-kernel-compat/gen_patch_names.c
|
||||
+++ b/drbd/drbd-kernel-compat/gen_patch_names.c
|
||||
@@ -127,6 +127,9 @@ int main(int argc, char **argv)
|
||||
patch(1, "bvec_kmap_local", true, false,
|
||||
COMPAT_HAVE_BVEC_KMAP_LOCAL, "present");
|
||||
|
||||
+ patch(1, "msg_splice_pages", true, false,
|
||||
+ COMPAT_HAVE_MSG_SPLICE_PAGES, "present");
|
||||
+
|
||||
patch(1, "struct_bvec_iter", true, false,
|
||||
COMPAT_HAVE_STRUCT_BVEC_ITER, "present");
|
||||
|
||||
diff --git a/drbd/drbd-kernel-compat/tests/have_msg_splice_pages.c b/drbd/drbd-kernel-compat/tests/have_msg_splice_pages.c
|
||||
new file mode 100644
|
||||
index 000000000000..0bb23ef6d39a
|
||||
--- /dev/null
|
||||
+++ b/drbd/drbd-kernel-compat/tests/have_msg_splice_pages.c
|
||||
@@ -0,0 +1,7 @@
|
||||
+/* { "version": "v6.5-rc1", "commit": "dc97391e661009eab46783030d2404c9b6e6f2e7", "comment": "sock: Remove ->sendpage*() in favour of sendmsg(MSG_SPLICE_PAGES)", "author": "David Howells <dhowells@redhat.com>", "date": "Fri Jun 23 23:55:12 2023 +0100" } */
|
||||
+#include <linux/net.h>
|
||||
+
|
||||
+int foo(void)
|
||||
+{
|
||||
+ return MSG_SPLICE_PAGES;
|
||||
+}
|
||||
diff --git a/drbd/drbd_transport_tcp.c b/drbd/drbd_transport_tcp.c
|
||||
index ca60833f73d7..5dcba50dd0eb 100644
|
||||
--- a/drbd/drbd_transport_tcp.c
|
||||
+++ b/drbd/drbd_transport_tcp.c
|
||||
@@ -1193,18 +1193,22 @@ static int dtt_send_page(struct drbd_transport *transport, enum drbd_stream stre
|
||||
struct drbd_tcp_transport *tcp_transport =
|
||||
container_of(transport, struct drbd_tcp_transport, transport);
|
||||
struct socket *socket = tcp_transport->stream[stream];
|
||||
+ struct msghdr msg = { .msg_flags = msg_flags | MSG_NOSIGNAL | MSG_SPLICE_PAGES };
|
||||
+ struct bio_vec bvec;
|
||||
int len = size;
|
||||
int err = -EIO;
|
||||
|
||||
if (!socket)
|
||||
return -ENOTCONN;
|
||||
|
||||
- msg_flags |= MSG_NOSIGNAL;
|
||||
dtt_update_congested(tcp_transport);
|
||||
do {
|
||||
int sent;
|
||||
|
||||
- sent = socket->ops->sendpage(socket, page, offset, len, msg_flags);
|
||||
+ bvec_set_page(&bvec, page, len, offset);
|
||||
+ iov_iter_bvec(&msg.msg_iter, ITER_SOURCE, &bvec, 1, len);
|
||||
+
|
||||
+ sent = sock_sendmsg(socket, &msg);
|
||||
if (sent <= 0) {
|
||||
if (sent == -EAGAIN) {
|
||||
if (drbd_stream_send_timed_out(transport, stream))
|
||||
--
|
||||
2.42.1
|
||||
|
183
0022-compat-block-replace-fmode_t-with-a-block-specific-t.patch
Normal file
183
0022-compat-block-replace-fmode_t-with-a-block-specific-t.patch
Normal file
@ -0,0 +1,183 @@
|
||||
From 2d3c3fd6546174a0452c9bbd64d4f4193c0c39e2 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Moritz=20WanzenBug=20Wanzenb=C3=B6ck?=
|
||||
<moritz.wanzenboeck@linbit.com>
|
||||
Date: Wed, 13 Sep 2023 11:26:35 +0200
|
||||
Subject: [PATCH] compat: block: replace fmode_t with a block-specific type for
|
||||
block open flags
|
||||
|
||||
See also upstream Linux kernel commit
|
||||
05bdb9965305 ("block: replace fmode_t with a block-specific type for block open flags"
|
||||
|
||||
Original message:
|
||||
|
||||
The only overlap between the block open flags mapped into the fmode_t and
|
||||
other uses of fmode_t are FMODE_READ and FMODE_WRITE. Define a new
|
||||
blk_mode_t instead for use in blkdev_get_by_{dev,path}, ->open and
|
||||
->ioctl and stop abusing fmode_t.
|
||||
---
|
||||
.../cocci/blk_mode_t__no_present.cocci | 19 ++++++++++++++
|
||||
drbd/drbd-kernel-compat/gen_patch_names.c | 3 +++
|
||||
.../tests/have_blk_mode_t.c | 4 +++
|
||||
drbd/drbd_main.c | 26 +++++++++----------
|
||||
4 files changed, 39 insertions(+), 13 deletions(-)
|
||||
create mode 100644 drbd/drbd-kernel-compat/cocci/blk_mode_t__no_present.cocci
|
||||
create mode 100644 drbd/drbd-kernel-compat/tests/have_blk_mode_t.c
|
||||
|
||||
diff --git a/drbd/drbd-kernel-compat/cocci/blk_mode_t__no_present.cocci b/drbd/drbd-kernel-compat/cocci/blk_mode_t__no_present.cocci
|
||||
new file mode 100644
|
||||
index 000000000000..030723c817de
|
||||
--- /dev/null
|
||||
+++ b/drbd/drbd-kernel-compat/cocci/blk_mode_t__no_present.cocci
|
||||
@@ -0,0 +1,19 @@
|
||||
+@@
|
||||
+identifier fn;
|
||||
+identifier mode;
|
||||
+@@
|
||||
+ fn (
|
||||
+ ...,
|
||||
+- blk_mode_t mode
|
||||
++ fmode_t mode
|
||||
+ ) {
|
||||
+ <...
|
||||
+(
|
||||
+- BLK_OPEN_WRITE
|
||||
++ FMODE_WRITE
|
||||
+|
|
||||
+- BLK_OPEN_NDELAY
|
||||
++ FMODE_NDELAY
|
||||
+)
|
||||
+ ...>
|
||||
+ }
|
||||
diff --git a/drbd/drbd-kernel-compat/gen_patch_names.c b/drbd/drbd-kernel-compat/gen_patch_names.c
|
||||
index 6a96c5b89f11..e4a65a3c451e 100644
|
||||
--- a/drbd/drbd-kernel-compat/gen_patch_names.c
|
||||
+++ b/drbd/drbd-kernel-compat/gen_patch_names.c
|
||||
@@ -571,6 +571,9 @@ int main(int argc, char **argv)
|
||||
patch(1, "block_device_operations_release", true, false,
|
||||
COMPAT_BLOCK_DEVICE_OPERATIONS_RELEASE_TAKES_SINGLE_ARGUMENT, "takes_single_argument");
|
||||
|
||||
+ patch(1, "blk_mode_t", true, false,
|
||||
+ COMPAT_HAVE_BLK_MODE_T, "present");
|
||||
+
|
||||
/* #define BLKDEV_ISSUE_ZEROOUT_EXPORTED */
|
||||
/* #define BLKDEV_ZERO_NOUNMAP */
|
||||
|
||||
diff --git a/drbd/drbd-kernel-compat/tests/have_blk_mode_t.c b/drbd/drbd-kernel-compat/tests/have_blk_mode_t.c
|
||||
new file mode 100644
|
||||
index 000000000000..e063bdc30f43
|
||||
--- /dev/null
|
||||
+++ b/drbd/drbd-kernel-compat/tests/have_blk_mode_t.c
|
||||
@@ -0,0 +1,4 @@
|
||||
+/* { "version": "v6.5-rc1", "commit": "05bdb9965305bbfdae79b31d22df03d1e2cfcb22", "comment": "block: replace fmode_t with a block-specific type for block open flags", "author": "Christoph Hellwig <hch@lst.de>", "date": "Thu Jun 8 13:02:55 2023 +0200" } */
|
||||
+#include <linux/blkdev.h>
|
||||
+
|
||||
+void foo(blk_mode_t mode) {}
|
||||
diff --git a/drbd/drbd_main.c b/drbd/drbd_main.c
|
||||
index 0719229f210e..f9560bdff63f 100644
|
||||
--- a/drbd/drbd_main.c
|
||||
+++ b/drbd/drbd_main.c
|
||||
@@ -52,7 +52,7 @@
|
||||
#include "drbd_meta_data.h"
|
||||
#include "drbd_dax_pmem.h"
|
||||
|
||||
-static int drbd_open(struct gendisk *gd, fmode_t mode);
|
||||
+static int drbd_open(struct gendisk *gd, blk_mode_t mode);
|
||||
static void drbd_release(struct gendisk *gd);
|
||||
static void md_sync_timer_fn(struct timer_list *t);
|
||||
static int w_bitmap_io(struct drbd_work *w, int unused);
|
||||
@@ -2566,10 +2566,10 @@ enum ioc_rv {
|
||||
IOC_ABORT = 2,
|
||||
};
|
||||
|
||||
-static enum ioc_rv inc_open_count(struct drbd_device *device, fmode_t mode)
|
||||
+static enum ioc_rv inc_open_count(struct drbd_device *device, blk_mode_t mode)
|
||||
{
|
||||
struct drbd_resource *resource = device->resource;
|
||||
- enum ioc_rv r = mode & FMODE_NDELAY ? IOC_ABORT : IOC_SLEEP;
|
||||
+ enum ioc_rv r = mode & BLK_OPEN_NDELAY ? IOC_ABORT : IOC_SLEEP;
|
||||
|
||||
if (test_bit(DOWN_IN_PROGRESS, &resource->flags))
|
||||
return IOC_ABORT;
|
||||
@@ -2580,7 +2580,7 @@ static enum ioc_rv inc_open_count(struct drbd_device *device, fmode_t mode)
|
||||
else if (!resource->remote_state_change) {
|
||||
r = IOC_OK;
|
||||
device->open_cnt++;
|
||||
- if (mode & FMODE_WRITE)
|
||||
+ if (mode & BLK_OPEN_WRITE)
|
||||
device->writable = true;
|
||||
}
|
||||
read_unlock_irq(&resource->state_rwlock);
|
||||
@@ -2646,7 +2646,7 @@ out:
|
||||
spin_unlock(&device->openers_lock);
|
||||
}
|
||||
|
||||
-static int drbd_open(struct gendisk *gd, fmode_t mode)
|
||||
+static int drbd_open(struct gendisk *gd, blk_mode_t mode)
|
||||
{
|
||||
struct drbd_device *device = gd->private_data;
|
||||
struct drbd_resource *resource = device->resource;
|
||||
@@ -2655,7 +2655,7 @@ static int drbd_open(struct gendisk *gd, fmode_t mode)
|
||||
int err = 0;
|
||||
|
||||
/* Fail read-only open from systemd-udev (version <= 238) */
|
||||
- if (!(mode & FMODE_WRITE) && !drbd_allow_oos) {
|
||||
+ if (!(mode & BLK_OPEN_WRITE) && !drbd_allow_oos) {
|
||||
char comm[TASK_COMM_LEN];
|
||||
get_task_comm(comm, current);
|
||||
if (!strcmp("systemd-udevd", comm))
|
||||
@@ -2664,7 +2664,7 @@ static int drbd_open(struct gendisk *gd, fmode_t mode)
|
||||
|
||||
/* Fail read-write open early,
|
||||
* in case someone explicitly set us read-only (blockdev --setro) */
|
||||
- if (bdev_read_only(gd->part0) && (mode & FMODE_WRITE))
|
||||
+ if (bdev_read_only(gd->part0) && (mode & BLK_OPEN_WRITE))
|
||||
return -EACCES;
|
||||
|
||||
if (resource->fail_io[NOW])
|
||||
@@ -2693,14 +2693,14 @@ static int drbd_open(struct gendisk *gd, fmode_t mode)
|
||||
This avoids split brain when the drbd volume gets opened
|
||||
temporarily by udev while it scans for PV signatures. */
|
||||
|
||||
- if (mode & FMODE_WRITE) {
|
||||
+ if (mode & BLK_OPEN_WRITE) {
|
||||
if (resource->role[NOW] == R_SECONDARY) {
|
||||
- rv = try_to_promote(device, timeout, (mode & FMODE_NDELAY));
|
||||
+ rv = try_to_promote(device, timeout, (mode & BLK_OPEN_NDELAY));
|
||||
if (rv < SS_SUCCESS)
|
||||
drbd_info(resource, "Auto-promote failed: %s (%d)\n",
|
||||
drbd_set_st_err_str(rv), rv);
|
||||
}
|
||||
- } else if ((mode & FMODE_NDELAY) == 0) {
|
||||
+ } else if ((mode & BLK_OPEN_NDELAY) == 0) {
|
||||
/* Double check peers
|
||||
*
|
||||
* Some services may try to first open ro, and only if that
|
||||
@@ -2720,14 +2720,14 @@ static int drbd_open(struct gendisk *gd, fmode_t mode)
|
||||
}
|
||||
}
|
||||
} else if (resource->role[NOW] != R_PRIMARY &&
|
||||
- !(mode & FMODE_WRITE) && !drbd_allow_oos) {
|
||||
+ !(mode & BLK_OPEN_WRITE) && !drbd_allow_oos) {
|
||||
err = -EMEDIUMTYPE;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (test_bit(UNREGISTERED, &device->flags)) {
|
||||
err = -ENODEV;
|
||||
- } else if (mode & FMODE_WRITE) {
|
||||
+ } else if (mode & BLK_OPEN_WRITE) {
|
||||
if (resource->role[NOW] != R_PRIMARY)
|
||||
err = -EROFS;
|
||||
} else /* READ access only */ {
|
||||
@@ -2741,7 +2741,7 @@ out:
|
||||
mutex_unlock(&resource->open_release);
|
||||
if (err) {
|
||||
drbd_release(gd);
|
||||
- if (err == -EAGAIN && !(mode & FMODE_NDELAY))
|
||||
+ if (err == -EAGAIN && !(mode & BLK_OPEN_NDELAY))
|
||||
err = -EMEDIUMTYPE;
|
||||
}
|
||||
|
||||
--
|
||||
2.42.1
|
||||
|
@ -0,0 +1,96 @@
|
||||
From 1412792a443ddc696fd1c8981a6cc544272f54bf Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Moritz=20WanzenBug=20Wanzenb=C3=B6ck?=
|
||||
<moritz.wanzenboeck@linbit.com>
|
||||
Date: Wed, 13 Sep 2023 15:46:12 +0200
|
||||
Subject: [PATCH] compat: genetlink: remove userhdr from struct genl_info
|
||||
|
||||
See also upstream Linux kernel commit
|
||||
bffcc6882a1b ("genetlink: remove userhdr from struct genl_info")
|
||||
|
||||
Original message:
|
||||
|
||||
Only three families use info->userhdr today and going forward
|
||||
we discourage using fixed headers in new families.
|
||||
So having the pointer to user header in struct genl_info
|
||||
is an overkill. Compute the header pointer at runtime.
|
||||
---
|
||||
.../cocci/genl_info_userhdr__no_present.cocci | 5 +++++
|
||||
drbd/drbd-kernel-compat/gen_patch_names.c | 3 +++
|
||||
drbd/drbd-kernel-compat/tests/have_genl_info_userhdr.c | 7 +++++++
|
||||
drbd/drbd_nl.c | 6 +++---
|
||||
4 files changed, 18 insertions(+), 3 deletions(-)
|
||||
create mode 100644 drbd/drbd-kernel-compat/cocci/genl_info_userhdr__no_present.cocci
|
||||
create mode 100644 drbd/drbd-kernel-compat/tests/have_genl_info_userhdr.c
|
||||
|
||||
diff --git a/drbd/drbd-kernel-compat/cocci/genl_info_userhdr__no_present.cocci b/drbd/drbd-kernel-compat/cocci/genl_info_userhdr__no_present.cocci
|
||||
new file mode 100644
|
||||
index 000000000000..75e787797068
|
||||
--- /dev/null
|
||||
+++ b/drbd/drbd-kernel-compat/cocci/genl_info_userhdr__no_present.cocci
|
||||
@@ -0,0 +1,5 @@
|
||||
+@@
|
||||
+expression info;
|
||||
+@@
|
||||
+- genl_info_userhdr(info)
|
||||
++ info->userhdr
|
||||
diff --git a/drbd/drbd-kernel-compat/gen_patch_names.c b/drbd/drbd-kernel-compat/gen_patch_names.c
|
||||
index e4a65a3c451e..b136acf3148a 100644
|
||||
--- a/drbd/drbd-kernel-compat/gen_patch_names.c
|
||||
+++ b/drbd/drbd-kernel-compat/gen_patch_names.c
|
||||
@@ -574,6 +574,9 @@ int main(int argc, char **argv)
|
||||
patch(1, "blk_mode_t", true, false,
|
||||
COMPAT_HAVE_BLK_MODE_T, "present");
|
||||
|
||||
+ patch(1, "genl_info_userhdr", true, false,
|
||||
+ COMPAT_HAVE_GENL_INFO_USERHDR, "present");
|
||||
+
|
||||
/* #define BLKDEV_ISSUE_ZEROOUT_EXPORTED */
|
||||
/* #define BLKDEV_ZERO_NOUNMAP */
|
||||
|
||||
diff --git a/drbd/drbd-kernel-compat/tests/have_genl_info_userhdr.c b/drbd/drbd-kernel-compat/tests/have_genl_info_userhdr.c
|
||||
new file mode 100644
|
||||
index 000000000000..3c69dacce244
|
||||
--- /dev/null
|
||||
+++ b/drbd/drbd-kernel-compat/tests/have_genl_info_userhdr.c
|
||||
@@ -0,0 +1,7 @@
|
||||
+/* { "version": "v6.6-rc1", "commit": "bffcc6882a1bb2be8c9420184966f4c2c822078e", "comment": "genetlink: remove userhdr from struct genl_info", "author": "Jakub Kicinski <kuba@kernel.org>", "date": "Mon Aug 14 14:47:16 2023 -0700" } */
|
||||
+#include <net/genetlink.h>
|
||||
+
|
||||
+void *foo(struct genl_info *info)
|
||||
+{
|
||||
+ return genl_info_userhdr(info);
|
||||
+}
|
||||
diff --git a/drbd/drbd_nl.c b/drbd/drbd_nl.c
|
||||
index 71ed4272614e..538c31202e4b 100644
|
||||
--- a/drbd/drbd_nl.c
|
||||
+++ b/drbd/drbd_nl.c
|
||||
@@ -203,7 +203,7 @@ static struct drbd_path *first_path(struct drbd_connection *connection)
|
||||
static int drbd_adm_prepare(struct drbd_config_context *adm_ctx,
|
||||
struct sk_buff *skb, struct genl_info *info, unsigned flags)
|
||||
{
|
||||
- struct drbd_genlmsghdr *d_in = info->userhdr;
|
||||
+ struct drbd_genlmsghdr *d_in = genl_info_userhdr(info);
|
||||
const u8 cmd = info->genlhdr->cmd;
|
||||
int err;
|
||||
|
||||
@@ -2106,7 +2106,7 @@ static void drbd_try_suspend_al(struct drbd_device *device)
|
||||
|
||||
static bool should_set_defaults(struct genl_info *info)
|
||||
{
|
||||
- unsigned flags = ((struct drbd_genlmsghdr*)info->userhdr)->flags;
|
||||
+ unsigned int flags = ((struct drbd_genlmsghdr *)genl_info_userhdr(info))->flags;
|
||||
return 0 != (flags & DRBD_GENL_F_SET_DEFAULTS);
|
||||
}
|
||||
|
||||
@@ -6279,7 +6279,7 @@ out_no_unlock:
|
||||
int drbd_adm_new_minor(struct sk_buff *skb, struct genl_info *info)
|
||||
{
|
||||
struct drbd_config_context adm_ctx;
|
||||
- struct drbd_genlmsghdr *dh = info->userhdr;
|
||||
+ struct drbd_genlmsghdr *dh = genl_info_userhdr(info);
|
||||
struct device_conf device_conf;
|
||||
struct drbd_resource *resource;
|
||||
struct drbd_device *device;
|
||||
--
|
||||
2.42.1
|
||||
|
75
0024-compat-fixup-FMODE_READ-FMODE_WRITE-usage.patch
Normal file
75
0024-compat-fixup-FMODE_READ-FMODE_WRITE-usage.patch
Normal file
@ -0,0 +1,75 @@
|
||||
From 5a09ad97f57eb276dc1e9a84e1c82f11ce1fe1b7 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Christoph=20B=C3=B6hmwalder?=
|
||||
<christoph.boehmwalder@linbit.com>
|
||||
Date: Thu, 4 Apr 2024 15:53:31 +0200
|
||||
Subject: [PATCH 1/3] compat: fixup FMODE_READ/FMODE_WRITE usage
|
||||
|
||||
Fixes: 4a84d1d0 ("compat: block: replace fmode_t with a block-specific type for block open flags")
|
||||
---
|
||||
.../cocci/blk_mode_t__no_present.cocci | 15 +++++++++++++++
|
||||
drbd/drbd-kernel-compat/gen_patch_names.c | 6 +++---
|
||||
drbd/drbd_nl.c | 2 +-
|
||||
3 files changed, 19 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/drbd/drbd-kernel-compat/cocci/blk_mode_t__no_present.cocci b/drbd/drbd-kernel-compat/cocci/blk_mode_t__no_present.cocci
|
||||
index 030723c817de..d1312a093ffe 100644
|
||||
--- a/drbd/drbd-kernel-compat/cocci/blk_mode_t__no_present.cocci
|
||||
+++ b/drbd/drbd-kernel-compat/cocci/blk_mode_t__no_present.cocci
|
||||
@@ -17,3 +17,18 @@ identifier mode;
|
||||
)
|
||||
...>
|
||||
}
|
||||
+
|
||||
+@@
|
||||
+@@
|
||||
+// special case: bdev_open_by_path takes a blk_mode_t, so convert that too. I can't seem to get
|
||||
+// coccinelle to match the "READ | WRITE" condition generically, so just hard code it.
|
||||
+// NOTE: we use blkdev_get_by_path instead of bdev_open_by_path in some compat cases, so support that too.
|
||||
+(
|
||||
+bdev_open_by_path
|
||||
+|
|
||||
+blkdev_get_by_path
|
||||
+)
|
||||
+ (...,
|
||||
+- BLK_OPEN_READ | BLK_OPEN_WRITE
|
||||
++ FMODE_READ | FMODE_WRITE
|
||||
+ , ...)
|
||||
diff --git a/drbd/drbd-kernel-compat/gen_patch_names.c b/drbd/drbd-kernel-compat/gen_patch_names.c
|
||||
index b136acf3148a..86a7ce7a93ed 100644
|
||||
--- a/drbd/drbd-kernel-compat/gen_patch_names.c
|
||||
+++ b/drbd/drbd-kernel-compat/gen_patch_names.c
|
||||
@@ -565,15 +565,15 @@ int main(int argc, char **argv)
|
||||
patch(1, "block_device_operations_open", true, false,
|
||||
COMPAT_BLOCK_DEVICE_OPERATIONS_OPEN_TAKES_GENDISK, "takes_gendisk");
|
||||
|
||||
- patch(1, "blkdev_put", true, false,
|
||||
- COMPAT_BLKDEV_PUT_HAS_HOLDER, "has_holder");
|
||||
-
|
||||
patch(1, "block_device_operations_release", true, false,
|
||||
COMPAT_BLOCK_DEVICE_OPERATIONS_RELEASE_TAKES_SINGLE_ARGUMENT, "takes_single_argument");
|
||||
|
||||
patch(1, "blk_mode_t", true, false,
|
||||
COMPAT_HAVE_BLK_MODE_T, "present");
|
||||
|
||||
+ patch(1, "blkdev_put", true, false,
|
||||
+ COMPAT_BLKDEV_PUT_HAS_HOLDER, "has_holder");
|
||||
+
|
||||
patch(1, "genl_info_userhdr", true, false,
|
||||
COMPAT_HAVE_GENL_INFO_USERHDR, "present");
|
||||
|
||||
diff --git a/drbd/drbd_nl.c b/drbd/drbd_nl.c
|
||||
index d41ccfcd4bb2..a355f5d5feb1 100644
|
||||
--- a/drbd/drbd_nl.c
|
||||
+++ b/drbd/drbd_nl.c
|
||||
@@ -2566,7 +2566,7 @@ static struct block_device *open_backing_dev(struct drbd_device *device,
|
||||
const char *bdev_path, void *claim_ptr)
|
||||
{
|
||||
struct block_device *bdev = blkdev_get_by_path(bdev_path,
|
||||
- FMODE_READ | FMODE_WRITE,
|
||||
+ BLK_OPEN_READ | BLK_OPEN_WRITE,
|
||||
claim_ptr, NULL);
|
||||
if (IS_ERR(bdev)) {
|
||||
drbd_err(device, "open(\"%s\") failed with %ld\n",
|
||||
--
|
||||
2.44.0
|
||||
|
379
0025-compat-drdb-Convert-to-use-bdev_open_by_path.patch
Normal file
379
0025-compat-drdb-Convert-to-use-bdev_open_by_path.patch
Normal file
@ -0,0 +1,379 @@
|
||||
From 604f31ab14eeca9eddb42028de93bb89f3ae6515 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Christoph=20B=C3=B6hmwalder?=
|
||||
<christoph.boehmwalder@linbit.com>
|
||||
Date: Thu, 4 Apr 2024 16:27:51 +0200
|
||||
Subject: [PATCH 2/3] compat: drdb: Convert to use bdev_open_by_path()
|
||||
|
||||
Equivalent to upstream Linux commit 75e27d373425
|
||||
("drdb [sic]: Convert to use bdev_open_by_path()"), plus a compat patch.
|
||||
---
|
||||
.../cocci/bdev_open_by_path__no_present.cocci | 173 ++++++++++++++++++
|
||||
drbd/drbd-kernel-compat/gen_patch_names.c | 3 +
|
||||
.../tests/have_bdev_open_by_path.c | 8 +
|
||||
drbd/drbd_int.h | 2 +
|
||||
drbd/drbd_nl.c | 59 +++---
|
||||
5 files changed, 216 insertions(+), 29 deletions(-)
|
||||
create mode 100644 drbd/drbd-kernel-compat/cocci/bdev_open_by_path__no_present.cocci
|
||||
create mode 100644 drbd/drbd-kernel-compat/tests/have_bdev_open_by_path.c
|
||||
|
||||
diff --git a/drbd/drbd-kernel-compat/cocci/bdev_open_by_path__no_present.cocci b/drbd/drbd-kernel-compat/cocci/bdev_open_by_path__no_present.cocci
|
||||
new file mode 100644
|
||||
index 000000000000..983f05080f79
|
||||
--- /dev/null
|
||||
+++ b/drbd/drbd-kernel-compat/cocci/bdev_open_by_path__no_present.cocci
|
||||
@@ -0,0 +1,173 @@
|
||||
+@@
|
||||
+@@
|
||||
+struct drbd_backing_dev {
|
||||
+...
|
||||
+- struct bdev_handle *backing_bdev_handle;
|
||||
+...
|
||||
+- struct bdev_handle *md_bdev_handle;
|
||||
+...
|
||||
+}
|
||||
+
|
||||
+@@
|
||||
+identifier handle;
|
||||
+@@
|
||||
+static void close_backing_dev(...,
|
||||
+- struct bdev_handle *handle
|
||||
++ struct block_device *bdev, void *holder
|
||||
+ , ...
|
||||
+ )
|
||||
+{
|
||||
+<...
|
||||
+(
|
||||
+- handle->bdev
|
||||
++ bdev
|
||||
+|
|
||||
+- bdev_release(handle)
|
||||
++ blkdev_put(bdev, holder)
|
||||
+|
|
||||
+- handle
|
||||
++ bdev
|
||||
+)
|
||||
+...>
|
||||
+}
|
||||
+
|
||||
+@@
|
||||
+identifier device;
|
||||
+struct bdev_handle *handle;
|
||||
+identifier err;
|
||||
+identifier new_disk_conf;
|
||||
+@@
|
||||
+// special case: when linking the meta_dev, we want to pass meta_claim_ptr to close instead of device
|
||||
+err = link_backing_dev(..., new_disk_conf->meta_dev, ...);
|
||||
+if (err) {
|
||||
+ ...
|
||||
+ close_backing_dev(device,
|
||||
+- handle
|
||||
++ bdev, meta_claim_ptr
|
||||
+ , ...);
|
||||
+ ...
|
||||
+}
|
||||
+
|
||||
+@@
|
||||
+identifier ldev;
|
||||
+struct bdev_handle *handle;
|
||||
+identifier device;
|
||||
+@@
|
||||
+// generic close_backing_dev usage
|
||||
+close_backing_dev(device,
|
||||
+(
|
||||
+- ldev->backing_bdev_handle
|
||||
++ ldev->backing_bdev, device
|
||||
+|
|
||||
+- ldev->md_bdev_handle
|
||||
++ ldev->md_bdev,
|
||||
++ ldev->md.meta_dev_idx < 0 ? (void *)device : (void *)drbd_m_holder
|
||||
+|
|
||||
+- handle
|
||||
++ bdev, device
|
||||
+)
|
||||
+, ...);
|
||||
+
|
||||
+@@
|
||||
+identifier handle;
|
||||
+@@
|
||||
+- struct bdev_handle *
|
||||
++ struct block_device *
|
||||
+open_backing_dev(...)
|
||||
+{
|
||||
+...
|
||||
+- struct bdev_handle *handle = bdev_open_by_path(
|
||||
++ struct block_device *bdev = blkdev_get_by_path(
|
||||
+...);
|
||||
+<...
|
||||
+(
|
||||
+IS_ERR
|
||||
+|
|
||||
+PTR_ERR
|
||||
+)
|
||||
+ (
|
||||
+- handle
|
||||
++ bdev
|
||||
+ )
|
||||
+...>
|
||||
+return
|
||||
+- handle
|
||||
++ bdev
|
||||
+;
|
||||
+}
|
||||
+
|
||||
+@@
|
||||
+identifier handle;
|
||||
+identifier err;
|
||||
+@@
|
||||
+static int link_backing_dev(...,
|
||||
+- struct bdev_handle *handle
|
||||
++ struct block_device *bdev
|
||||
+ )
|
||||
+{
|
||||
+...
|
||||
+int err = bd_link_disk_holder(
|
||||
+- handle->bdev
|
||||
++ bdev
|
||||
+ , ...);
|
||||
+if (err) {
|
||||
+- bdev_release(handle);
|
||||
+ ...
|
||||
+}
|
||||
+...
|
||||
+}
|
||||
+
|
||||
+@@
|
||||
+identifier device;
|
||||
+expression bd;
|
||||
+identifier handle;
|
||||
+@@
|
||||
+// generic link_backing_dev usage
|
||||
+link_backing_dev(device, bd,
|
||||
+- handle
|
||||
++ bdev
|
||||
+ )
|
||||
+
|
||||
+@@
|
||||
+identifier handle;
|
||||
+@@
|
||||
+// generic open_backing_dev usage
|
||||
+{
|
||||
+...
|
||||
+- struct bdev_handle *handle;
|
||||
++ struct block_device *bdev;
|
||||
+<...
|
||||
+(
|
||||
+- handle
|
||||
++ bdev
|
||||
+= open_backing_dev(...);
|
||||
+|
|
||||
+IS_ERR(
|
||||
+- handle
|
||||
++ bdev
|
||||
+ )
|
||||
+)
|
||||
+...>
|
||||
+}
|
||||
+
|
||||
+@@
|
||||
+struct drbd_backing_dev *nbc;
|
||||
+identifier handle;
|
||||
+@@
|
||||
+(
|
||||
+- nbc->backing_bdev = handle->bdev;
|
||||
+- nbc->backing_bdev_handle = handle;
|
||||
++ nbc->backing_bdev = bdev;
|
||||
+|
|
||||
+- nbc->md_bdev = handle->bdev;
|
||||
+- nbc->md_bdev_handle = handle;
|
||||
++ nbc->md_bdev = bdev;
|
||||
+)
|
||||
+
|
||||
+@@
|
||||
+identifier handle;
|
||||
+identifier nbc;
|
||||
+@@
|
||||
+// only this one comparison exists in the code, just special-case it instead of implementing the generic case
|
||||
+- handle != nbc->backing_bdev_handle
|
||||
++ bdev != nbc->backing_bdev
|
||||
diff --git a/drbd/drbd-kernel-compat/gen_patch_names.c b/drbd/drbd-kernel-compat/gen_patch_names.c
|
||||
index 86a7ce7a93ed..d6fe75a80cf6 100644
|
||||
--- a/drbd/drbd-kernel-compat/gen_patch_names.c
|
||||
+++ b/drbd/drbd-kernel-compat/gen_patch_names.c
|
||||
@@ -559,6 +559,9 @@ int main(int argc, char **argv)
|
||||
patch(1, "__bio_add_page", true, false,
|
||||
COMPAT_HAVE___BIO_ADD_PAGE, "present");
|
||||
|
||||
+ patch(1, "bdev_open_by_path", true, false,
|
||||
+ COMPAT_HAVE_BDEV_OPEN_BY_PATH, "present");
|
||||
+
|
||||
patch(1, "blkdev_get_by_path", true, false,
|
||||
COMPAT_BLKDEV_GET_BY_PATH_HAS_HOLDER_OPS, "has_holder_ops");
|
||||
|
||||
diff --git a/drbd/drbd-kernel-compat/tests/have_bdev_open_by_path.c b/drbd/drbd-kernel-compat/tests/have_bdev_open_by_path.c
|
||||
new file mode 100644
|
||||
index 000000000000..92266de0b15b
|
||||
--- /dev/null
|
||||
+++ b/drbd/drbd-kernel-compat/tests/have_bdev_open_by_path.c
|
||||
@@ -0,0 +1,8 @@
|
||||
+/* { "version": "v6.7", "commit": "e719b4d156749f02eafed31a3c515f2aa9dcc72a", "comment": "introduce bdev_open_by_* functions", "author": "Jan Kara <jack@suse.cz>", "date": "Wed Sep 27 11:34:07 2023 +0200" } */
|
||||
+
|
||||
+#include <linux/blkdev.h>
|
||||
+
|
||||
+struct bdev_handle *foo(const char *path, blk_mode_t mode, void *holder,
|
||||
+ const struct blk_holder_ops *hops) {
|
||||
+ return bdev_open_by_path(path, mode, holder, hops);
|
||||
+}
|
||||
diff --git a/drbd/drbd_int.h b/drbd/drbd_int.h
|
||||
index cf593c09cda1..a41b228cb13b 100644
|
||||
--- a/drbd/drbd_int.h
|
||||
+++ b/drbd/drbd_int.h
|
||||
@@ -700,7 +700,9 @@ struct drbd_md {
|
||||
|
||||
struct drbd_backing_dev {
|
||||
struct block_device *backing_bdev;
|
||||
+ struct bdev_handle *backing_bdev_handle;
|
||||
struct block_device *md_bdev;
|
||||
+ struct bdev_handle *md_bdev_handle;
|
||||
struct drbd_md md;
|
||||
struct disk_conf __rcu *disk_conf; /* RCU, for updates: resource->conf_update */
|
||||
sector_t known_size; /* last known size of that backing device */
|
||||
diff --git a/drbd/drbd_nl.c b/drbd/drbd_nl.c
|
||||
index a355f5d5feb1..6a48287e251e 100644
|
||||
--- a/drbd/drbd_nl.c
|
||||
+++ b/drbd/drbd_nl.c
|
||||
@@ -94,7 +94,7 @@ atomic_t drbd_genl_seq = ATOMIC_INIT(2); /* two. */
|
||||
|
||||
DEFINE_MUTEX(notification_mutex);
|
||||
|
||||
-/* used blkdev_get_by_path, to claim our meta data device(s) */
|
||||
+/* used bdev_open_by_path, to claim our meta data device(s) */
|
||||
static char *drbd_m_holder = "Hands off! this is DRBD's meta data device.";
|
||||
|
||||
static void drbd_adm_send_reply(struct sk_buff *skb, struct genl_info *info)
|
||||
@@ -2535,14 +2535,14 @@ bool want_bitmap(struct drbd_peer_device *peer_device)
|
||||
return want_bitmap;
|
||||
}
|
||||
|
||||
-static void close_backing_dev(struct drbd_device *device, struct block_device *bdev,
|
||||
- void *holder, bool do_bd_unlink)
|
||||
+static void close_backing_dev(struct drbd_device *device,
|
||||
+ struct bdev_handle *handle, bool do_bd_unlink)
|
||||
{
|
||||
- if (!bdev)
|
||||
+ if (!handle)
|
||||
return;
|
||||
if (do_bd_unlink)
|
||||
- bd_unlink_disk_holder(bdev, device->vdisk);
|
||||
- blkdev_put(bdev, holder);
|
||||
+ bd_unlink_disk_holder(handle->bdev, device->vdisk);
|
||||
+ bdev_release(handle);
|
||||
}
|
||||
|
||||
void drbd_backing_dev_free(struct drbd_device *device, struct drbd_backing_dev *ldev)
|
||||
@@ -2553,33 +2553,33 @@ void drbd_backing_dev_free(struct drbd_device *device, struct drbd_backing_dev *
|
||||
drbd_dax_close(ldev);
|
||||
|
||||
close_backing_dev(device,
|
||||
- ldev->md_bdev,
|
||||
- ldev->md.meta_dev_idx < 0 ? (void *)device : (void *)drbd_m_holder,
|
||||
+ ldev->md_bdev_handle,
|
||||
ldev->md_bdev != ldev->backing_bdev);
|
||||
- close_backing_dev(device, ldev->backing_bdev, device, true);
|
||||
+ close_backing_dev(device, ldev->backing_bdev_handle, true);
|
||||
|
||||
kfree(ldev->disk_conf);
|
||||
kfree(ldev);
|
||||
}
|
||||
|
||||
-static struct block_device *open_backing_dev(struct drbd_device *device,
|
||||
+static struct bdev_handle *open_backing_dev(struct drbd_device *device,
|
||||
const char *bdev_path, void *claim_ptr)
|
||||
{
|
||||
- struct block_device *bdev = blkdev_get_by_path(bdev_path,
|
||||
+ struct bdev_handle *handle = bdev_open_by_path(bdev_path,
|
||||
BLK_OPEN_READ | BLK_OPEN_WRITE,
|
||||
claim_ptr, NULL);
|
||||
- if (IS_ERR(bdev)) {
|
||||
+ if (IS_ERR(handle)) {
|
||||
drbd_err(device, "open(\"%s\") failed with %ld\n",
|
||||
- bdev_path, PTR_ERR(bdev));
|
||||
+ bdev_path, PTR_ERR(handle));
|
||||
}
|
||||
- return bdev;
|
||||
+ return handle;
|
||||
}
|
||||
|
||||
static int link_backing_dev(struct drbd_device *device,
|
||||
- const char *bdev_path, struct block_device *bdev)
|
||||
+ const char *bdev_path, struct bdev_handle *handle)
|
||||
{
|
||||
- int err = bd_link_disk_holder(bdev, device->vdisk);
|
||||
+ int err = bd_link_disk_holder(handle->bdev, device->vdisk);
|
||||
if (err) {
|
||||
+ bdev_release(handle);
|
||||
drbd_err(device, "bd_link_disk_holder(\"%s\", ...) failed with %d\n",
|
||||
bdev_path, err);
|
||||
}
|
||||
@@ -2590,22 +2590,22 @@ static int open_backing_devices(struct drbd_device *device,
|
||||
struct disk_conf *new_disk_conf,
|
||||
struct drbd_backing_dev *nbc)
|
||||
{
|
||||
- struct block_device *bdev;
|
||||
+ struct bdev_handle *handle;
|
||||
void *meta_claim_ptr;
|
||||
int err;
|
||||
|
||||
- bdev = open_backing_dev(device, new_disk_conf->backing_dev, device);
|
||||
- if (IS_ERR(bdev))
|
||||
+ handle = open_backing_dev(device, new_disk_conf->backing_dev, device);
|
||||
+ if (IS_ERR(handle))
|
||||
return ERR_OPEN_DISK;
|
||||
|
||||
- err = link_backing_dev(device, new_disk_conf->backing_dev, bdev);
|
||||
+ err = link_backing_dev(device, new_disk_conf->backing_dev, handle);
|
||||
if (err) {
|
||||
/* close without unlinking; otherwise error path will try to unlink */
|
||||
- close_backing_dev(device, bdev, device, false);
|
||||
+ close_backing_dev(device, handle, false);
|
||||
return ERR_OPEN_DISK;
|
||||
}
|
||||
-
|
||||
- nbc->backing_bdev = bdev;
|
||||
+ nbc->backing_bdev = handle->bdev;
|
||||
+ nbc->backing_bdev_handle = handle;
|
||||
|
||||
/* meta_claim_ptr: device, if claimed exclusively; shared drbd_m_holder,
|
||||
* if potentially shared with other drbd minors
|
||||
@@ -2620,22 +2620,23 @@ static int open_backing_devices(struct drbd_device *device,
|
||||
* should check it for you already; but if you don't, or
|
||||
* someone fooled it, we need to double check here)
|
||||
*/
|
||||
- bdev = open_backing_dev(device, new_disk_conf->meta_dev, meta_claim_ptr);
|
||||
- if (IS_ERR(bdev))
|
||||
+ handle = open_backing_dev(device, new_disk_conf->meta_dev, meta_claim_ptr);
|
||||
+ if (IS_ERR(handle))
|
||||
return ERR_OPEN_MD_DISK;
|
||||
|
||||
/* avoid double bd_claim_by_disk() for the same (source,target) tuple,
|
||||
* as would happen with internal metadata. */
|
||||
- if (bdev != nbc->backing_bdev) {
|
||||
- err = link_backing_dev(device, new_disk_conf->meta_dev, bdev);
|
||||
+ if (handle != nbc->backing_bdev_handle) {
|
||||
+ err = link_backing_dev(device, new_disk_conf->meta_dev, handle);
|
||||
if (err) {
|
||||
/* close without unlinking; otherwise error path will try to unlink */
|
||||
- close_backing_dev(device, bdev, meta_claim_ptr, false);
|
||||
+ close_backing_dev(device, handle, false);
|
||||
return ERR_OPEN_MD_DISK;
|
||||
}
|
||||
}
|
||||
|
||||
- nbc->md_bdev = bdev;
|
||||
+ nbc->md_bdev = handle->bdev;
|
||||
+ nbc->md_bdev_handle = handle;
|
||||
return NO_ERROR;
|
||||
}
|
||||
|
||||
--
|
||||
2.44.0
|
||||
|
@ -0,0 +1,41 @@
|
||||
From 6088f29b44fed60d1e631383a9b6f280ff42aaa6 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Christoph=20B=C3=B6hmwalder?=
|
||||
<christoph.boehmwalder@linbit.com>
|
||||
Date: Thu, 11 Apr 2024 11:59:38 +0200
|
||||
Subject: [PATCH 3/3] compat: gate blkdev_* patches behind bdev_open_by_path
|
||||
|
||||
If we have bdev_open_by_path, there is no need to consider these patches
|
||||
since they only apply to the (older) blkdev_{get_put}_* functions.
|
||||
---
|
||||
drbd/drbd-kernel-compat/gen_patch_names.c | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
diff --git a/drbd/drbd-kernel-compat/gen_patch_names.c b/drbd/drbd-kernel-compat/gen_patch_names.c
|
||||
index d6fe75a80cf6..8355e723f82c 100644
|
||||
--- a/drbd/drbd-kernel-compat/gen_patch_names.c
|
||||
+++ b/drbd/drbd-kernel-compat/gen_patch_names.c
|
||||
@@ -562,8 +562,10 @@ int main(int argc, char **argv)
|
||||
patch(1, "bdev_open_by_path", true, false,
|
||||
COMPAT_HAVE_BDEV_OPEN_BY_PATH, "present");
|
||||
|
||||
+#if !defined(COMPAT_HAVE_BDEV_OPEN_BY_PATH)
|
||||
patch(1, "blkdev_get_by_path", true, false,
|
||||
COMPAT_BLKDEV_GET_BY_PATH_HAS_HOLDER_OPS, "has_holder_ops");
|
||||
+#endif
|
||||
|
||||
patch(1, "block_device_operations_open", true, false,
|
||||
COMPAT_BLOCK_DEVICE_OPERATIONS_OPEN_TAKES_GENDISK, "takes_gendisk");
|
||||
@@ -574,8 +576,10 @@ int main(int argc, char **argv)
|
||||
patch(1, "blk_mode_t", true, false,
|
||||
COMPAT_HAVE_BLK_MODE_T, "present");
|
||||
|
||||
+#if !defined(COMPAT_HAVE_BDEV_OPEN_BY_PATH)
|
||||
patch(1, "blkdev_put", true, false,
|
||||
COMPAT_BLKDEV_PUT_HAS_HOLDER, "has_holder");
|
||||
+#endif
|
||||
|
||||
patch(1, "genl_info_userhdr", true, false,
|
||||
COMPAT_HAVE_GENL_INFO_USERHDR, "present");
|
||||
--
|
||||
2.44.0
|
||||
|
59
boo1229062-re-enable-blk_queue_max_hw_sectors.patch
Normal file
59
boo1229062-re-enable-blk_queue_max_hw_sectors.patch
Normal file
@ -0,0 +1,59 @@
|
||||
diff -Nupr a/drbd/drbd_nl.c b/drbd/drbd_nl.c
|
||||
--- a/drbd/drbd_nl.c 2024-08-12 15:03:18.458476462 +0800
|
||||
+++ b/drbd/drbd_nl.c 2024-08-12 15:05:08.415670056 +0800
|
||||
@@ -2017,6 +2017,55 @@ static void fixup_discard_support(struct
|
||||
}
|
||||
}
|
||||
|
||||
+/**
|
||||
+ * blk_queue_max_hw_sectors - set max sectors for a request for this queue
|
||||
+ * @q: the request queue for the device
|
||||
+ * @max_hw_sectors: max hardware sectors in the usual 512b unit
|
||||
+ *
|
||||
+ * Description:
|
||||
+ * Enables a low level driver to set a hard upper limit,
|
||||
+ * max_hw_sectors, on the size of requests. max_hw_sectors is set by
|
||||
+ * the device driver based upon the capabilities of the I/O
|
||||
+ * controller.
|
||||
+ *
|
||||
+ * max_dev_sectors is a hard limit imposed by the storage device for
|
||||
+ * READ/WRITE requests. It is set by the disk driver.
|
||||
+ *
|
||||
+ * max_sectors is a soft limit imposed by the block layer for
|
||||
+ * filesystem type requests. This value can be overridden on a
|
||||
+ * per-device basis in /sys/block/<device>/queue/max_sectors_kb.
|
||||
+ * The soft limit can not exceed max_hw_sectors.
|
||||
+ **/
|
||||
+static void blk_queue_max_hw_sectors(struct request_queue *q, unsigned int max_hw_sectors)
|
||||
+{
|
||||
+ struct queue_limits *limits = &q->limits;
|
||||
+ unsigned int max_sectors;
|
||||
+
|
||||
+ if ((max_hw_sectors << 9) < PAGE_SIZE) {
|
||||
+ max_hw_sectors = 1 << (PAGE_SHIFT - 9);
|
||||
+ pr_info("%s: set to minimum %u\n", __func__, max_hw_sectors);
|
||||
+ }
|
||||
+
|
||||
+ max_hw_sectors = round_down(max_hw_sectors,
|
||||
+ limits->logical_block_size >> SECTOR_SHIFT);
|
||||
+ limits->max_hw_sectors = max_hw_sectors;
|
||||
+
|
||||
+ max_sectors = min_not_zero(max_hw_sectors, limits->max_dev_sectors);
|
||||
+
|
||||
+ if (limits->max_user_sectors)
|
||||
+ max_sectors = min(max_sectors, limits->max_user_sectors);
|
||||
+ else
|
||||
+ max_sectors = min(max_sectors, BLK_DEF_MAX_SECTORS_CAP);
|
||||
+
|
||||
+ max_sectors = round_down(max_sectors,
|
||||
+ limits->logical_block_size >> SECTOR_SHIFT);
|
||||
+ limits->max_sectors = max_sectors;
|
||||
+
|
||||
+ if (!q->disk)
|
||||
+ return;
|
||||
+ q->disk->bdi->io_pages = max_sectors >> (PAGE_SHIFT - 9);
|
||||
+}
|
||||
+
|
||||
void drbd_reconsider_queue_parameters(struct drbd_device *device, struct drbd_backing_dev *bdev)
|
||||
{
|
||||
struct request_queue * const q = device->rq_queue;
|
@ -1,73 +0,0 @@
|
||||
Subject: [PATCH] drbd: Fix block layer warning
|
||||
|
||||
drbdadm down r0 trigger kernel warning
|
||||
|
||||
drbd_reconsider_queue_parameters
|
||||
+ get_common_queue_limits
|
||||
| blk_set_stacking_limits
|
||||
| lim->max_zone_append_sectors = UINT_MAX; <=== set
|
||||
|
|
||||
+ ... ...
|
||||
|
|
||||
+ queue_limits_commit_update
|
||||
blk_validate_limits
|
||||
WARN_ON_ONCE(lim->max_zone_append_sectors) <== trigger
|
||||
|
||||
log:
|
||||
|
||||
```
|
||||
Jan 08 14:43:37 tw-2 kernel: drbd r0/0 drbd0: disk( UpToDate -> Detaching ) [down]
|
||||
Jan 08 14:43:37 tw-2 kernel: drbd r0/0 drbd0: disk( Detaching -> Diskless ) [go-diskless]
|
||||
------------[ cut here ]------------
|
||||
WARNING: CPU: 0 PID: 1773 at block/blk-settings.c:75 blk_validate_limits+0x41d/0x440
|
||||
... ...
|
||||
Call Trace:
|
||||
<TASK>
|
||||
? blk_validate_limits+0x41d/0x440
|
||||
? __warn.cold+0x93/0xf7
|
||||
? blk_validate_limits+0x41d/0x440
|
||||
? report_bug+0xff/0x140
|
||||
? handle_bug+0x58/0x90
|
||||
? exc_invalid_op+0x17/0x70
|
||||
? asm_exc_invalid_op+0x1a/0x20
|
||||
? blk_validate_limits+0x41d/0x440
|
||||
queue_limits_commit_update+0x1b/0xa0
|
||||
drbd_reconsider_queue_parameters+0x1d2/0x240 [drbd 9a1d8dc285f5b1fe449ab4495af7893c660ff3ea]
|
||||
w_after_state_change+0x1997/0x20a0 [drbd 9a1d8dc285f5b1fe449ab4495af7893c660ff3ea]
|
||||
? idr_get_next_ul+0xee/0x110
|
||||
? do_unqueued_device_work+0x1da/0x2a0 [drbd 9a1d8dc285f5b1fe449ab4495af7893c660ff3ea]
|
||||
drbd_worker+0x109/0x530 [drbd 9a1d8dc285f5b1fe449ab4495af7893c660ff3ea]
|
||||
? __pfx_autoremove_wake_function+0x10/0x10
|
||||
? __pfx_drbd_thread_setup+0x10/0x10 [drbd 9a1d8dc285f5b1fe449ab4495af7893c660ff3ea]
|
||||
drbd_thread_setup+0x6d/0x170 [drbd 9a1d8dc285f5b1fe449ab4495af7893c660ff3ea]
|
||||
kthread+0xcf/0x100
|
||||
? __pfx_kthread+0x10/0x10
|
||||
ret_from_fork+0x31/0x50
|
||||
? __pfx_kthread+0x10/0x10
|
||||
ret_from_fork_asm+0x1a/0x30
|
||||
</TASK>
|
||||
Jan 08 14:43:37 tw-2 kernel: ---[ end trace 0000000000000000 ]---
|
||||
Jan 08 14:43:37 tw-2 kernel: drbd r0/0 drbd0: setting new queue limits failed
|
||||
Jan 08 14:43:37 tw-2 kernel: drbd r0/0 drbd0: drbd_bm_resize called with capacity == 0
|
||||
Jan 08 14:43:37 tw-2 kernel: drbd /unregistered/r0: Terminating worker thread
|
||||
|
||||
---[ end trace 0000000000000000 ]---
|
||||
drbd /unregistered/r0/0 drbd0: setting new queue limits failed
|
||||
drbd /unregistered/r0: Terminating worker thread
|
||||
```
|
||||
|
||||
Signed-off-by: Heming Zhao <heming.zhao@suse.com>
|
||||
---
|
||||
|
||||
diff -Nupr a/drbd/drbd_nl.c b/drbd/drbd_nl.c
|
||||
--- a/drbd/drbd_nl.c 2025-01-08 14:25:56.369599242 +0800
|
||||
+++ b/drbd/drbd_nl.c 2025-01-08 14:32:07.260157474 +0800
|
||||
@@ -2068,6 +2068,8 @@ static void get_common_queue_limits(stru
|
||||
common_limits->physical_block_size = device->device_conf.block_size;
|
||||
common_limits->logical_block_size = device->device_conf.block_size;
|
||||
common_limits->io_min = device->device_conf.block_size;
|
||||
+ if (!(common_limits->features & BLK_FEAT_ZONED))
|
||||
+ common_limits->max_zone_append_sectors = 0;
|
||||
|
||||
rcu_read_lock();
|
||||
for_each_peer_device_rcu(peer_device, device) {
|
216
bsc1226510-fix-build-err-against-6.9.3.patch
Normal file
216
bsc1226510-fix-build-err-against-6.9.3.patch
Normal file
@ -0,0 +1,216 @@
|
||||
diff -Nupr a/drbd/drbd-kernel-compat/tests/have_bdev_open_by_path.c b/drbd/drbd-kernel-compat/tests/have_bdev_open_by_path.c
|
||||
--- a/drbd/drbd-kernel-compat/tests/have_bdev_open_by_path.c 2024-06-19 15:02:47.050694378 +0800
|
||||
+++ b/drbd/drbd-kernel-compat/tests/have_bdev_open_by_path.c 2024-06-19 15:11:39.313298178 +0800
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
#include <linux/blkdev.h>
|
||||
|
||||
-struct bdev_handle *foo(const char *path, blk_mode_t mode, void *holder,
|
||||
- const struct blk_holder_ops *hops) {
|
||||
- return bdev_open_by_path(path, mode, holder, hops);
|
||||
+void foo(void)
|
||||
+{
|
||||
+ return;
|
||||
}
|
||||
diff -Nupr a/drbd/drbd-kernel-compat/tests/have_blk_alloc_disk.c b/drbd/drbd-kernel-compat/tests/have_blk_alloc_disk.c
|
||||
--- a/drbd/drbd-kernel-compat/tests/have_blk_alloc_disk.c 2024-06-19 11:35:39.957400039 +0800
|
||||
+++ b/drbd/drbd-kernel-compat/tests/have_blk_alloc_disk.c 2024-06-19 11:36:43.594396686 +0800
|
||||
@@ -2,7 +2,17 @@
|
||||
|
||||
#include <linux/blkdev.h>
|
||||
|
||||
+#define DRBD_MAX_BIO_SIZE_SAFE (1U << 12) /* Works always = 4k */
|
||||
+
|
||||
struct gendisk *foo(int node)
|
||||
{
|
||||
- return blk_alloc_disk(node);
|
||||
+ struct queue_limits lim = {
|
||||
+ /*
|
||||
+ * Setting the max_hw_sectors to an odd value of 8kibyte here.
|
||||
+ * This triggers a max_bio_size message upon first attach or
|
||||
+ * connect.
|
||||
+ */
|
||||
+ .max_hw_sectors = DRBD_MAX_BIO_SIZE_SAFE >> 8,
|
||||
+ };
|
||||
+ return blk_alloc_disk(&lim, node);
|
||||
}
|
||||
diff -Nupr a/drbd/drbd_int.h b/drbd/drbd_int.h
|
||||
--- a/drbd/drbd_int.h 2024-06-19 15:33:16.756027168 +0800
|
||||
+++ b/drbd/drbd_int.h 2024-06-19 15:32:58.459276389 +0800
|
||||
@@ -700,9 +700,9 @@ struct drbd_md {
|
||||
|
||||
struct drbd_backing_dev {
|
||||
struct block_device *backing_bdev;
|
||||
- struct bdev_handle *backing_bdev_handle;
|
||||
+ struct file *backing_bdev_file;
|
||||
struct block_device *md_bdev;
|
||||
- struct bdev_handle *md_bdev_handle;
|
||||
+ struct file *md_bdev_file;
|
||||
struct drbd_md md;
|
||||
struct disk_conf __rcu *disk_conf; /* RCU, for updates: resource->conf_update */
|
||||
sector_t known_size; /* last known size of that backing device */
|
||||
diff -Nupr a/drbd/drbd_main.c b/drbd/drbd_main.c
|
||||
--- a/drbd/drbd_main.c 2024-06-19 11:41:59.409367593 +0800
|
||||
+++ b/drbd/drbd_main.c 2024-06-19 11:41:40.052600574 +0800
|
||||
@@ -3752,6 +3752,7 @@ static int init_submitter(struct drbd_de
|
||||
return 0;
|
||||
}
|
||||
|
||||
+#define DRBD_MAX_BIO_SIZE_SAFE (1U << 12) /* Works always = 4k */
|
||||
enum drbd_ret_code drbd_create_device(struct drbd_config_context *adm_ctx, unsigned int minor,
|
||||
struct device_conf *device_conf, struct drbd_device **p_device)
|
||||
{
|
||||
@@ -3767,6 +3768,15 @@ enum drbd_ret_code drbd_create_device(st
|
||||
enum drbd_ret_code err = ERR_NOMEM;
|
||||
bool locked = false;
|
||||
|
||||
+ struct queue_limits lim = {
|
||||
+ /*
|
||||
+ * Setting the max_hw_sectors to an odd value of 8kibyte here.
|
||||
+ * This triggers a max_bio_size message upon first attach or
|
||||
+ * connect.
|
||||
+ */
|
||||
+ .max_hw_sectors = DRBD_MAX_BIO_SIZE_SAFE >> 8,
|
||||
+ };
|
||||
+
|
||||
lockdep_assert_held(&resource->conf_update);
|
||||
|
||||
device = minor_to_device(minor);
|
||||
@@ -3824,7 +3834,7 @@ enum drbd_ret_code drbd_create_device(st
|
||||
|
||||
init_rwsem(&device->uuid_sem);
|
||||
|
||||
- disk = blk_alloc_disk(NUMA_NO_NODE);
|
||||
+ disk = blk_alloc_disk(&lim, NUMA_NO_NODE);
|
||||
if (!disk)
|
||||
goto out_no_disk;
|
||||
|
||||
diff -Nupr a/drbd/drbd_nl.c b/drbd/drbd_nl.c
|
||||
--- a/drbd/drbd_nl.c 2024-06-19 15:16:28.118044330 +0800
|
||||
+++ b/drbd/drbd_nl.c 2024-06-19 15:32:49.535902019 +0800
|
||||
@@ -2536,13 +2536,13 @@ bool want_bitmap(struct drbd_peer_device
|
||||
}
|
||||
|
||||
static void close_backing_dev(struct drbd_device *device,
|
||||
- struct bdev_handle *handle, bool do_bd_unlink)
|
||||
+ struct file *bdev_file, bool do_bd_unlink)
|
||||
{
|
||||
- if (!handle)
|
||||
+ if (!bdev_file)
|
||||
return;
|
||||
if (do_bd_unlink)
|
||||
- bd_unlink_disk_holder(handle->bdev, device->vdisk);
|
||||
- bdev_release(handle);
|
||||
+ bd_unlink_disk_holder(file_bdev(bdev_file), device->vdisk);
|
||||
+ fput(bdev_file);
|
||||
}
|
||||
|
||||
void drbd_backing_dev_free(struct drbd_device *device, struct drbd_backing_dev *ldev)
|
||||
@@ -2553,33 +2553,34 @@ void drbd_backing_dev_free(struct drbd_d
|
||||
drbd_dax_close(ldev);
|
||||
|
||||
close_backing_dev(device,
|
||||
- ldev->md_bdev_handle,
|
||||
+ ldev->md_bdev_file,
|
||||
ldev->md_bdev != ldev->backing_bdev);
|
||||
- close_backing_dev(device, ldev->backing_bdev_handle, true);
|
||||
+ close_backing_dev(device, ldev->backing_bdev_file, true);
|
||||
|
||||
kfree(ldev->disk_conf);
|
||||
kfree(ldev);
|
||||
}
|
||||
|
||||
-static struct bdev_handle *open_backing_dev(struct drbd_device *device,
|
||||
+static struct file *open_backing_dev(struct drbd_device *device,
|
||||
const char *bdev_path, void *claim_ptr)
|
||||
{
|
||||
- struct bdev_handle *handle = bdev_open_by_path(bdev_path,
|
||||
- BLK_OPEN_READ | BLK_OPEN_WRITE,
|
||||
- claim_ptr, NULL);
|
||||
- if (IS_ERR(handle)) {
|
||||
+ struct file *file;
|
||||
+
|
||||
+ file = bdev_file_open_by_path(bdev_path, BLK_OPEN_READ | BLK_OPEN_WRITE,
|
||||
+ claim_ptr, NULL);
|
||||
+ if (IS_ERR(file)) {
|
||||
drbd_err(device, "open(\"%s\") failed with %ld\n",
|
||||
- bdev_path, PTR_ERR(handle));
|
||||
+ bdev_path, PTR_ERR(file));
|
||||
}
|
||||
- return handle;
|
||||
+ return file;
|
||||
}
|
||||
|
||||
static int link_backing_dev(struct drbd_device *device,
|
||||
- const char *bdev_path, struct bdev_handle *handle)
|
||||
+ const char *bdev_path, struct file *file)
|
||||
{
|
||||
- int err = bd_link_disk_holder(handle->bdev, device->vdisk);
|
||||
+ int err = bd_link_disk_holder(file_bdev(file), device->vdisk);
|
||||
if (err) {
|
||||
- bdev_release(handle);
|
||||
+ fput(file);
|
||||
drbd_err(device, "bd_link_disk_holder(\"%s\", ...) failed with %d\n",
|
||||
bdev_path, err);
|
||||
}
|
||||
@@ -2590,22 +2591,22 @@ static int open_backing_devices(struct d
|
||||
struct disk_conf *new_disk_conf,
|
||||
struct drbd_backing_dev *nbc)
|
||||
{
|
||||
- struct bdev_handle *handle;
|
||||
+ struct file *file;
|
||||
void *meta_claim_ptr;
|
||||
int err;
|
||||
|
||||
- handle = open_backing_dev(device, new_disk_conf->backing_dev, device);
|
||||
- if (IS_ERR(handle))
|
||||
+ file = open_backing_dev(device, new_disk_conf->backing_dev, device);
|
||||
+ if (IS_ERR(file))
|
||||
return ERR_OPEN_DISK;
|
||||
|
||||
- err = link_backing_dev(device, new_disk_conf->backing_dev, handle);
|
||||
+ err = link_backing_dev(device, new_disk_conf->backing_dev, file);
|
||||
if (err) {
|
||||
/* close without unlinking; otherwise error path will try to unlink */
|
||||
- close_backing_dev(device, handle, false);
|
||||
+ close_backing_dev(device, file, false);
|
||||
return ERR_OPEN_DISK;
|
||||
}
|
||||
- nbc->backing_bdev = handle->bdev;
|
||||
- nbc->backing_bdev_handle = handle;
|
||||
+ nbc->backing_bdev = file_bdev(file);
|
||||
+ nbc->backing_bdev_file = file;
|
||||
|
||||
/* meta_claim_ptr: device, if claimed exclusively; shared drbd_m_holder,
|
||||
* if potentially shared with other drbd minors
|
||||
@@ -2620,23 +2621,23 @@ static int open_backing_devices(struct d
|
||||
* should check it for you already; but if you don't, or
|
||||
* someone fooled it, we need to double check here)
|
||||
*/
|
||||
- handle = open_backing_dev(device, new_disk_conf->meta_dev, meta_claim_ptr);
|
||||
- if (IS_ERR(handle))
|
||||
+ file = open_backing_dev(device, new_disk_conf->meta_dev, meta_claim_ptr);
|
||||
+ if (IS_ERR(file))
|
||||
return ERR_OPEN_MD_DISK;
|
||||
|
||||
/* avoid double bd_claim_by_disk() for the same (source,target) tuple,
|
||||
* as would happen with internal metadata. */
|
||||
- if (handle != nbc->backing_bdev_handle) {
|
||||
- err = link_backing_dev(device, new_disk_conf->meta_dev, handle);
|
||||
+ if (file != nbc->backing_bdev_file) {
|
||||
+ err = link_backing_dev(device, new_disk_conf->meta_dev, file);
|
||||
if (err) {
|
||||
/* close without unlinking; otherwise error path will try to unlink */
|
||||
- close_backing_dev(device, handle, false);
|
||||
+ close_backing_dev(device, file, false);
|
||||
return ERR_OPEN_MD_DISK;
|
||||
}
|
||||
}
|
||||
|
||||
- nbc->md_bdev = handle->bdev;
|
||||
- nbc->md_bdev_handle = handle;
|
||||
+ nbc->md_bdev = file_bdev(file);
|
||||
+ nbc->md_bdev_file = file;
|
||||
return NO_ERROR;
|
||||
}
|
||||
|
BIN
drbd-9.1.16.tar.gz
(Stored with Git LFS)
Normal file
BIN
drbd-9.1.16.tar.gz
(Stored with Git LFS)
Normal file
Binary file not shown.
@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:27273c96d68d6399bdc0f9a21581c4ebe67fb387206e55f8727d05595baf1cae
|
||||
size 1481356
|
273
drbd.changes
273
drbd.changes
@ -1,276 +1,3 @@
|
||||
-------------------------------------------------------------------
|
||||
Wed Jan 8 07:08:00 UTC 2025 - Heming Zhao <heming.zhao@suse.com>
|
||||
|
||||
- fix the warning of blk_validate_limits when running drbdadm down (boo#1235399)
|
||||
* add patch
|
||||
boo1235399-fix_the_warning_of_blk_validate_limits.patch
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Fri Dec 11 02:35:00 UTC 2024 - Heming Zhao <heming.zhao@suse.com>
|
||||
|
||||
- Update DRBD version from 9.1.22 to 9.1.23 (boo#1234849)
|
||||
|
||||
* Changelog from Linbit:
|
||||
|
||||
9.1.23 (api:genl2/proto:86-101,118-121/transport:18)
|
||||
--------
|
||||
* Fix a corner case that can happen when DRBD establishes multiple
|
||||
connections in parallel, which could lead one connection to end up in
|
||||
an inconsistent replication state of WFBitMapT/Established
|
||||
* Fix a corner case in which a reconciliation resync ends up in
|
||||
WFBitMapT/Established
|
||||
* Restrict protocol compatibility to the most recent 8.4 and 9.0 releases
|
||||
* Fix a corner case causing a module ref leak on drbd_transport_tcp;
|
||||
if it hits, you can not rmmod it
|
||||
* rate-limit resync progress while resync is paused
|
||||
* resync-target inherits history UUIDs when resync finishes,
|
||||
this can prevent unexpected "unrelared data" events later
|
||||
* Updated compatibility code for Linux 6.11 and 6.12
|
||||
|
||||
* remove patches which already included in the new version:
|
||||
0001-drbd-properly-rate-limit-resync-progress-reports.patch
|
||||
0002-drbd-inherit-history-UUIDs-from-sync-source-when-res.patch
|
||||
0003-build-compat-fix-line-offset-in-annotation-pragmas-p.patch
|
||||
0004-drbd-fix-exposed_uuid-going-backward.patch
|
||||
0005-drbd-Proper-locking-around-new_current_uuid-on-a-dis.patch
|
||||
0006-build-CycloneDX-fix-bom-ref-add-purl.patch
|
||||
0007-build-Another-update-to-the-spdx-files.patch
|
||||
0008-build-generate-spdx.json-not-tag-value-format.patch
|
||||
0009-compat-fix-gen_patch_names-for-bdev_file_open_by_pat.patch
|
||||
0010-compat-fix-nla_nest_start_noflag-test.patch
|
||||
0011-compat-fix-blk_alloc_disk-rule.patch
|
||||
0012-drbd-remove-const-from-function-return-type.patch
|
||||
0013-drbd-don-t-set-max_write_zeroes_sectors-in-decide_on.patch
|
||||
0014-drbd-split-out-a-drbd_discard_supported-helper.patch
|
||||
0015-drbd-atomically-update-queue-limits-in-drbd_reconsid.patch
|
||||
0016-compat-test-and-patch-for-queue_limits_start_update.patch
|
||||
0017-compat-specify-which-essential-change-was-not-made.patch
|
||||
0018-gen_patch_names-reorder-blk_mode_t.patch
|
||||
0019-compat-fix-blk_queue_update_readahead-patch.patch
|
||||
0020-compat-test-and-patch-for-que_limits-max_hw_discard_.patch
|
||||
0021-compat-fixup-write_zeroes__no_capable.patch
|
||||
0022-compat-fixup-queue_flag_discard__yes_present.patch
|
||||
0023-drbd-move-flags-to-queue_limits.patch
|
||||
0024-compat-test-and-patch-for-queue_limits.features.patch
|
||||
0025-drbd-Annotate-struct-fifo_buffer-with-__counted_by.patch
|
||||
0026-compat-test-and-patch-for-__counted_by.patch
|
||||
0027-drbd-fix-function-cast-warnings-in-state-machine.patch
|
||||
0028-Add-missing-documentation-of-peer_device-parameter-t.patch
|
||||
0030-drbd-kref_put-path-when-kernel_accept-fails.patch
|
||||
0031-build-fix-typo-in-Makefile.spatch.patch
|
||||
0032-drbd-open-do-not-delay-open-if-already-Primary.patch
|
||||
|
||||
* removed patch which is not needed anymore:
|
||||
boo1231290_fix_drbd_build_error_against_kernel_v6.11.0.patch
|
||||
boo1233222_fix_drbd_build_error_against_kernel_v6.11.6.patch
|
||||
|
||||
* update:
|
||||
drbd_git_revision
|
||||
drbd.spec
|
||||
|
||||
* add upstream patches to align commit d64ebe7eb7df:
|
||||
0001-drbd-Fix-memory-leak.patch
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Mon Nov 11 12:23:17 UTC 2024 - Glass Su <glass.su@suse.com>
|
||||
|
||||
- drbd: fix build error against kernel v6.11.6 (boo#1233222)
|
||||
* add patch
|
||||
+ boo1233222_fix_drbd_build_error_against_kernel_v6.11.6.patch
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Fri Oct 11 03:30:00 UTC 2024 - heming zhao <heming.zhao@suse.com>
|
||||
|
||||
- Update DRBD version from 9.1.16 to 9.1.22
|
||||
|
||||
* Changelog from Linbit:
|
||||
|
||||
9.1.22 (api:genl2/proto:86-121/transport:18)
|
||||
--------
|
||||
* Upgrade from partial resync to a full resync if necessary when the
|
||||
user manually resolves a split-brain situation
|
||||
* Fix a potential NULL deref when a disk fails while doing a
|
||||
forget-peer operation.
|
||||
* Fix a rcu_read_lock()/rcu_read_unlock() imbalance
|
||||
* Restart the open() syscall when a process auto promoting a drbd device gets
|
||||
interrupted by a signal
|
||||
* Remove a deadlock that caused DRBD to connect sometimes
|
||||
exceptionally slow
|
||||
* Make detach operations interruptible
|
||||
* Added dev_is_open to events2 status information
|
||||
* Improve log readability for 2PC state changes and drbd-threads
|
||||
* Updated compability code for Linux 6.9
|
||||
|
||||
9.1.21 (api:genl2/proto:86-121/transport:18)
|
||||
--------
|
||||
* fix a deadlock that can trigger when deleting a connection and
|
||||
another connection going down in parallel. This is a regression of
|
||||
9.1.20
|
||||
* Fix an out-of-bounds access when scanning the bitmap. It leads to a
|
||||
crash when the bitmap ends on a page boundary, and this is also a
|
||||
regression in 9.1.20.
|
||||
|
||||
9.1.20 (api:genl2/proto:86-121/transport:18)
|
||||
--------
|
||||
* Fix a kernel crash that is sometimes triggered when downing drbd
|
||||
resources in a specific, unusual order (was triggered by the
|
||||
Kubernetes CSI driver)
|
||||
* Fix a rarely triggering kernel crash upon adding paths to a
|
||||
connection by rehauling the path lists' locking
|
||||
* Fix the continuation of an interrupted initial resync
|
||||
* Fix the state engine so that an incapable primary does not outdate
|
||||
indirectly reachable secondary nodes
|
||||
* Fix a logic bug that caused drbd to pretend that a peer's disk is
|
||||
outdated when doing a manual disconnect on a down connection; with
|
||||
that cured impact on fencing and quorum.
|
||||
* Fix forceful demotion of suspended devices
|
||||
* Rehaul of the build system to apply compatibility patches out of
|
||||
place that allows one to build for different target kernels from a
|
||||
single drbd source tree
|
||||
* Updated compability code for Linux 6.8
|
||||
|
||||
9.1.19 (api:genl2/proto:86-121/transport:18)
|
||||
--------
|
||||
* Fix a resync decision case where drbd wrongly decided to do a full
|
||||
resync, where a partial resync was sufficient; that happened in a
|
||||
specific connect order when all nodes were on the same data
|
||||
generation (UUID)
|
||||
* Fix the online resize code to obey cached size information about
|
||||
temporal unreachable nodes
|
||||
* Fix a rare corner case in which DRBD on a diskless primary node
|
||||
failed to re-issue a read request to another node with a backing
|
||||
disk upon connection loss on the connection where it shipped the
|
||||
read request initially
|
||||
* Make timeout during promotion attempts interruptible
|
||||
* No longer write activity-log updates on the secondary node in a
|
||||
cluster with precisely two nodes with backing disk; this is a
|
||||
performance optimization
|
||||
* Reduce CPU usage of acknowledgment processing
|
||||
|
||||
9.1.18 (api:genl2/proto:86-121/transport:18)
|
||||
--------
|
||||
* Fixed connecting nodes with differently sized backing disks,
|
||||
specifically when the smaller node is primary, before establishing
|
||||
the connections
|
||||
* Fixed thawing a device that has I/O frozen after loss of quorum
|
||||
when a configuration change eases its quorum requirements
|
||||
* Properly fail TLS if requested (only available in drbd-9.2)
|
||||
* Fixed a race condition that can cause auto-demote to trigger right
|
||||
after an explicit promote
|
||||
* Fixed a rare race condition that could mess up the handshake result
|
||||
before it is committed to the replication state.
|
||||
* Preserve "tiebreaker quorum" over a reboot of the last node (3-node
|
||||
clusters only)
|
||||
* Update compatibility code for Linux 6.6
|
||||
|
||||
9.1.17 (api:genl2/proto:86-121/transport:18)
|
||||
--------
|
||||
* fix a potential crash when configuring drbd to bind to a
|
||||
non-existent local IP address (this is a regression of drbd-9.1.8)
|
||||
* Cure a very seldom triggering race condition bug during
|
||||
establishing connections; when you triggered it, you got an OOPS
|
||||
hinting to list corruption
|
||||
* fix a race condition regarding operations on the bitmap while
|
||||
forgetting a bitmap slot and a pointless warning
|
||||
* Fix handling of unexpected (on a resource in secondary role) write
|
||||
requests
|
||||
* Fix a corner case that can cause a process to hang when closing the
|
||||
DRBD device, while a connection gets re-established
|
||||
* Correctly block signal delivery during auto-demote
|
||||
* Improve the reliability of establishing connections
|
||||
* Do not clear the transport with `net-options --set-defaults`. This
|
||||
fix avoids unexpected disconnect/connect cycles upon an `adjust`
|
||||
when using the 'lb-tcp' or 'rdma' transports in drbd-9.2.
|
||||
* New netlink packet to report path status to drbdsetup
|
||||
* Improvements to the content and rate-limiting of many log messages
|
||||
* Update compatibility code and follow Linux upstream development
|
||||
until Linux 6.5
|
||||
|
||||
* remove patches which already included in the new version:
|
||||
0001-drbd-allow-transports-to-take-additional-krefs-on-a-.patch
|
||||
0002-drbd-improve-decision-about-marking-a-failed-disk-Ou.patch
|
||||
0003-drbd-fix-error-path-in-drbd_get_listener.patch
|
||||
0004-drbd-build-fix-spurious-re-build-attempt-of-compat.p.patch
|
||||
0005-drbd-log-error-code-when-thread-fails-to-start.patch
|
||||
0006-drbd-log-numeric-value-of-drbd_state_rv-as-well-as-s.patch
|
||||
0007-drbd-stop-defining-__KERNEL_SYSCALLS__.patch
|
||||
0008-compat-block-introduce-holder-ops.patch
|
||||
0009-drbd-reduce-net_ee-not-empty-info-to-a-dynamic-debug.patch
|
||||
0010-drbd-do-not-send-P_CURRENT_UUID-to-DRBD-8-peer-when-.patch
|
||||
0011-compat-block-pass-a-gendisk-to-open.patch
|
||||
0012-drbd-Restore-DATA_CORKED-and-CONTROL_CORKED-bits.patch
|
||||
0013-drbd-remove-unused-extern-for-conn_try_outdate_peer.patch
|
||||
0014-drbd-include-source-of-state-change-in-log.patch
|
||||
0015-compat-block-use-the-holder-as-indication-for-exclus.patch
|
||||
0016-drbd-Fix-net-options-set-defaults-to-not-clear-the-t.patch
|
||||
0017-drbd-propagate-exposed-UUIDs-only-into-established-c.patch
|
||||
0018-drbd-rework-autopromote.patch
|
||||
0019-compat-block-remove-the-unused-mode-argument-to-rele.patch
|
||||
0020-drbd-do-not-allow-auto-demote-to-be-interrupted-by-s.patch
|
||||
0021-compat-sock-Remove-sendpage-in-favour-of-sendmsg-MSG.patch
|
||||
0022-compat-block-replace-fmode_t-with-a-block-specific-t.patch
|
||||
0023-compat-genetlink-remove-userhdr-from-struct-genl_inf.patch
|
||||
0024-compat-fixup-FMODE_READ-FMODE_WRITE-usage.patch
|
||||
0025-compat-drdb-Convert-to-use-bdev_open_by_path.patch
|
||||
0026-compat-gate-blkdev_-patches-behind-bdev_open_by_path.patch
|
||||
boo1230635_01-compat-fix-nla_nest_start_noflag-test.patch
|
||||
boo1230635_02-drbd-port-block-device-access-to-file.patch
|
||||
|
||||
* removed patches which are not needed anymore:
|
||||
boo1229062-re-enable-blk_queue_max_hw_sectors.patch
|
||||
bsc1226510-fix-build-err-against-6.9.3.patch
|
||||
|
||||
* update:
|
||||
drbd_git_revision
|
||||
suse-coccinelle.patch
|
||||
drbd.spec
|
||||
|
||||
* add upstream patches to align commit 13ada1be201e:
|
||||
0001-drbd-properly-rate-limit-resync-progress-reports.patch
|
||||
0002-drbd-inherit-history-UUIDs-from-sync-source-when-res.patch
|
||||
0003-build-compat-fix-line-offset-in-annotation-pragmas-p.patch
|
||||
0004-drbd-fix-exposed_uuid-going-backward.patch
|
||||
0005-drbd-Proper-locking-around-new_current_uuid-on-a-dis.patch
|
||||
0006-build-CycloneDX-fix-bom-ref-add-purl.patch
|
||||
0007-build-Another-update-to-the-spdx-files.patch
|
||||
0008-build-generate-spdx.json-not-tag-value-format.patch
|
||||
0009-compat-fix-gen_patch_names-for-bdev_file_open_by_pat.patch
|
||||
0010-compat-fix-nla_nest_start_noflag-test.patch
|
||||
0011-compat-fix-blk_alloc_disk-rule.patch
|
||||
0012-drbd-remove-const-from-function-return-type.patch
|
||||
0013-drbd-don-t-set-max_write_zeroes_sectors-in-decide_on.patch
|
||||
0014-drbd-split-out-a-drbd_discard_supported-helper.patch
|
||||
0015-drbd-atomically-update-queue-limits-in-drbd_reconsid.patch
|
||||
0016-compat-test-and-patch-for-queue_limits_start_update.patch
|
||||
0017-compat-specify-which-essential-change-was-not-made.patch
|
||||
0018-gen_patch_names-reorder-blk_mode_t.patch
|
||||
0019-compat-fix-blk_queue_update_readahead-patch.patch
|
||||
0020-compat-test-and-patch-for-que_limits-max_hw_discard_.patch
|
||||
0021-compat-fixup-write_zeroes__no_capable.patch
|
||||
0022-compat-fixup-queue_flag_discard__yes_present.patch
|
||||
0023-drbd-move-flags-to-queue_limits.patch
|
||||
0024-compat-test-and-patch-for-queue_limits.features.patch
|
||||
0025-drbd-Annotate-struct-fifo_buffer-with-__counted_by.patch
|
||||
0026-compat-test-and-patch-for-__counted_by.patch
|
||||
0027-drbd-fix-function-cast-warnings-in-state-machine.patch
|
||||
0028-Add-missing-documentation-of-peer_device-parameter-t.patch
|
||||
0030-drbd-kref_put-path-when-kernel_accept-fails.patch
|
||||
0031-build-fix-typo-in-Makefile.spatch.patch
|
||||
0032-drbd-open-do-not-delay-open-if-already-Primary.patch
|
||||
|
||||
* add patch to fix kernel imcompatibility issue (boo#1231290):
|
||||
boo1231290_fix_drbd_build_error_against_kernel_v6.11.0.patch
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Tue Sep 17 11:38:00 UTC 2024 - heming zhao <heming.zhao@suse.com>
|
||||
|
||||
- drbdadm down fails to remove sysfs holder file (boo#1230635)
|
||||
* add patch
|
||||
+ boo1230635_01-compat-fix-nla_nest_start_noflag-test.patch
|
||||
+ boo1230635_02-drbd-port-block-device-access-to-file.patch
|
||||
* update patch
|
||||
+ bsc1226510-fix-build-err-against-6.9.3.patch
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Mon Aug 12 07:37:42 UTC 2024 - heming zhao <heming.zhao@suse.com>
|
||||
|
||||
|
61
drbd.spec
61
drbd.spec
@ -24,11 +24,11 @@
|
||||
%endif
|
||||
%endif
|
||||
Name: drbd
|
||||
Version: 9.1.23
|
||||
Version: 9.1.16
|
||||
Release: 0
|
||||
Summary: Linux driver for the "Distributed Replicated Block Device"
|
||||
License: GPL-2.0-or-later
|
||||
URL: https://pkg.linbit.com/
|
||||
URL: https://drbd.linbit.com/
|
||||
Source: %{name}-%{version}.tar.gz
|
||||
Source1: preamble
|
||||
Source2: Module.supported
|
||||
@ -36,12 +36,37 @@ Source3: drbd_git_revision
|
||||
|
||||
########################
|
||||
# upstream patch
|
||||
Patch0001: 0001-drbd-Fix-memory-leak.patch
|
||||
|
||||
Patch0001: 0001-drbd-allow-transports-to-take-additional-krefs-on-a-.patch
|
||||
Patch0002: 0002-drbd-improve-decision-about-marking-a-failed-disk-Ou.patch
|
||||
Patch0003: 0003-drbd-fix-error-path-in-drbd_get_listener.patch
|
||||
Patch0004: 0004-drbd-build-fix-spurious-re-build-attempt-of-compat.p.patch
|
||||
Patch0005: 0005-drbd-log-error-code-when-thread-fails-to-start.patch
|
||||
Patch0006: 0006-drbd-log-numeric-value-of-drbd_state_rv-as-well-as-s.patch
|
||||
Patch0007: 0007-drbd-stop-defining-__KERNEL_SYSCALLS__.patch
|
||||
Patch0008: 0008-compat-block-introduce-holder-ops.patch
|
||||
Patch0009: 0009-drbd-reduce-net_ee-not-empty-info-to-a-dynamic-debug.patch
|
||||
Patch0010: 0010-drbd-do-not-send-P_CURRENT_UUID-to-DRBD-8-peer-when-.patch
|
||||
Patch0011: 0011-compat-block-pass-a-gendisk-to-open.patch
|
||||
Patch0012: 0012-drbd-Restore-DATA_CORKED-and-CONTROL_CORKED-bits.patch
|
||||
Patch0013: 0013-drbd-remove-unused-extern-for-conn_try_outdate_peer.patch
|
||||
Patch0014: 0014-drbd-include-source-of-state-change-in-log.patch
|
||||
Patch0015: 0015-compat-block-use-the-holder-as-indication-for-exclus.patch
|
||||
Patch0016: 0016-drbd-Fix-net-options-set-defaults-to-not-clear-the-t.patch
|
||||
Patch0017: 0017-drbd-propagate-exposed-UUIDs-only-into-established-c.patch
|
||||
Patch0018: 0018-drbd-rework-autopromote.patch
|
||||
Patch0019: 0019-compat-block-remove-the-unused-mode-argument-to-rele.patch
|
||||
Patch0020: 0020-drbd-do-not-allow-auto-demote-to-be-interrupted-by-s.patch
|
||||
Patch0021: 0021-compat-sock-Remove-sendpage-in-favour-of-sendmsg-MSG.patch
|
||||
Patch0022: 0022-compat-block-replace-fmode_t-with-a-block-specific-t.patch
|
||||
Patch0023: 0023-compat-genetlink-remove-userhdr-from-struct-genl_inf.patch
|
||||
Patch0024: 0024-compat-fixup-FMODE_READ-FMODE_WRITE-usage.patch
|
||||
Patch0025: 0025-compat-drdb-Convert-to-use-bdev_open_by_path.patch
|
||||
Patch0026: 0026-compat-gate-blkdev_-patches-behind-bdev_open_by_path.patch
|
||||
# suse special patch
|
||||
Patch1001: bsc-1025089_fix-resync-finished-with-syncs-have-bits-set.patch
|
||||
Patch1002: suse-coccinelle.patch
|
||||
Patch1003: boo1235399-fix_the_warning_of_blk_validate_limits.patch
|
||||
Patch1001: bsc-1025089_fix-resync-finished-with-syncs-have-bits-set.patch
|
||||
Patch1002: suse-coccinelle.patch
|
||||
Patch1003: bsc1226510-fix-build-err-against-6.9.3.patch
|
||||
Patch1004: boo1229062-re-enable-blk_queue_max_hw_sectors.patch
|
||||
########################
|
||||
|
||||
#https://github.com/openSUSE/rpmlint-checks/blob/master/KMPPolicyCheck.py
|
||||
@ -50,7 +75,6 @@ BuildRequires: kernel-source
|
||||
BuildRequires: kernel-syms
|
||||
BuildRequires: libelf-devel
|
||||
BuildRequires: modutils
|
||||
BuildRequires: perl
|
||||
BuildRequires: %kernel_module_package_buildreqs
|
||||
Requires: drbd-utils >= 9.3.0
|
||||
Supplements: drbd-utils >= 9.3.0
|
||||
@ -79,6 +103,10 @@ installed kernel.
|
||||
%prep
|
||||
%autosetup -p1 -n drbd-%{version}
|
||||
|
||||
mkdir source
|
||||
cp -a drbd/. source/. || :
|
||||
cp $RPM_SOURCE_DIR/drbd_git_revision source/.drbd_git_revision
|
||||
|
||||
%build
|
||||
rm -rf obj
|
||||
mkdir obj
|
||||
@ -93,29 +121,22 @@ export SPAAS='false'
|
||||
|
||||
for flavor in %{flavors_to_build}; do
|
||||
rm -rf $flavor
|
||||
cp -a -r drbd $flavor
|
||||
cp $RPM_SOURCE_DIR/drbd_git_revision ${flavor}/.drbd_git_revision
|
||||
|
||||
cp -a -r source $flavor
|
||||
cp -a %{_sourcedir}/Module.supported $flavor
|
||||
export DRBDSRC="$PWD/obj/$flavor"
|
||||
# bsc#1160194, check the coccicheck work.
|
||||
#make coccicheck
|
||||
|
||||
# call make prep to generate drbd build dir
|
||||
make %{?_smp_mflags} -C $flavor KDIR=%{kernel_source $flavor} prep SPAAS=${SPAAS}
|
||||
|
||||
cp -a %{_sourcedir}/Module.supported ${flavor}/build-current
|
||||
|
||||
make %{?_smp_mflags} -C %{kernel_source $flavor} modules M=$PWD/$flavor/build-current SPAAS=${SPAAS}
|
||||
make %{?_smp_mflags} -C %{kernel_source $flavor} modules M=$PWD/$flavor SPAAS=${SPAAS}
|
||||
|
||||
# Check the compat result
|
||||
cat $PWD/${flavor}/build-current/compat.h
|
||||
cat $PWD/$flavor/compat.h
|
||||
done
|
||||
|
||||
%install
|
||||
export INSTALL_MOD_PATH=%{buildroot}
|
||||
export INSTALL_MOD_DIR=updates
|
||||
for flavor in %{flavors_to_build}; do
|
||||
make -C %{kernel_source $flavor} modules_install M=$PWD/$flavor/build-current
|
||||
make -C %{kernel_source $flavor} modules_install M=$PWD/$flavor
|
||||
done
|
||||
|
||||
mkdir -p %{buildroot}/%{_sbindir}
|
||||
|
@ -1 +1 @@
|
||||
GIT-hash: d64ebe7eb7df8c622b20bca38f3d7f4c7bb033c9
|
||||
GIT-hash: 288abda1fb8c93e385960af01ab28729fefdaa38
|
||||
|
@ -1,71 +1,76 @@
|
||||
diff -Nupr a/drbd/drbd-kernel-compat/gen_compat_patch.sh b/drbd/drbd-kernel-compat/gen_compat_patch.sh
|
||||
--- a/drbd/drbd-kernel-compat/gen_compat_patch.sh 2024-09-16 10:24:47.044861735 +0800
|
||||
+++ b/drbd/drbd-kernel-compat/gen_compat_patch.sh 2024-09-16 10:32:03.256040980 +0800
|
||||
@@ -43,9 +43,19 @@ fi
|
||||
diff -Naur drbd-9.0.29~0+git.9a7bc817.orig/drbd/drbd-kernel-compat/gen_compat_patch.sh drbd-9.0.29~0+git.9a7bc817/drbd/drbd-kernel-compat/gen_compat_patch.sh
|
||||
--- drbd-9.0.29~0+git.9a7bc817.orig/drbd/drbd-kernel-compat/gen_compat_patch.sh 2021-05-07 11:24:44.877547149 +0800
|
||||
+++ drbd-9.0.29~0+git.9a7bc817/drbd/drbd-kernel-compat/gen_compat_patch.sh 2021-05-07 12:30:58.385703306 +0800
|
||||
@@ -44,9 +44,19 @@
|
||||
|
||||
if hash spatch && spatch_is_recent; then
|
||||
K=$(cat $incdir/kernelrelease.txt || echo unknown kernel release)
|
||||
K=$(cat $incdir/kernelrelease.txt)
|
||||
+
|
||||
+ echo " compat.h content ";
|
||||
+ cat $incdir/compat.h;
|
||||
+ echo " ------------------- ";
|
||||
+ echo " compat.h content ";
|
||||
+ cat $incdir/compat.h;
|
||||
+ echo " ------------------- ";
|
||||
+
|
||||
echo " GENPATCHNAMES "$K
|
||||
gcc -I $incdir -o $incdir/gen_patch_names -std=c99 drbd-kernel-compat/gen_patch_names.c
|
||||
$incdir/gen_patch_names > $incdir/applied_cocci_files.txt
|
||||
echo " GENPATCHNAMES "$K
|
||||
gcc -I $incdir -o $incdir/gen_patch_names -std=c99 drbd-kernel-compat/gen_patch_names.c
|
||||
$incdir/gen_patch_names > $incdir/applied_cocci_files.txt
|
||||
+
|
||||
+ echo " APPLIED_COCCI_FILES ";
|
||||
+ cat $incdir/applied_cocci_files.txt;
|
||||
+ echo " ------------------- ";
|
||||
+ echo " APPLIED_COCCI_FILES ";
|
||||
+ cat $incdir/applied_cocci_files.txt;
|
||||
+ echo " ------------------- ";
|
||||
+
|
||||
rm $incdir/gen_patch_names
|
||||
# truncat them all
|
||||
: > $incdir/.compat.cocci
|
||||
@@ -72,15 +82,28 @@ if hash spatch && spatch_is_recent; then
|
||||
>> $incdir/.compat.cocci.tmp
|
||||
done
|
||||
rm $incdir/gen_patch_names
|
||||
rm -f $incdir/.compat.cocci
|
||||
rm -f $incdir/.compat.patch
|
||||
@@ -67,7 +77,15 @@
|
||||
< drbd-kernel-compat/cocci/debugfs_compat_template.cocci.in \
|
||||
>> $incdir/.compat.cocci
|
||||
done
|
||||
+
|
||||
+ coccilibpath=$(rpm -ql coccinelle|grep standard.h|xargs dirname);
|
||||
+ echo " SPATCH_SOURCES: "$*;
|
||||
+ echo " COCCI_LIBPATH: "$coccilibpath;
|
||||
+
|
||||
if [ -e $incdir/.compat.cocci ]; then
|
||||
+ echo " GENCOCCIRULES .compat.cocci";
|
||||
+ cat $incdir/.compat.cocci;
|
||||
+
|
||||
echo " SPATCH $chksum "$K
|
||||
# Note: $* (or $@) is NOT make magic variable now, this is a shell script
|
||||
# make $@, the target file, was passed as $1, and is now $compat_patch
|
||||
@@ -77,8 +95,14 @@
|
||||
# we know we don't have white-space in the argument list
|
||||
|
||||
+ coccilibpath=$(rpm -ql coccinelle|grep standard.h|xargs dirname);
|
||||
+ echo " SPATCH_SOURCES: "$*;
|
||||
+ echo " COCCI_LIBPATH: "$coccilibpath;
|
||||
set +e
|
||||
+
|
||||
mv $incdir/.compat.cocci.tmp $incdir/.compat.cocci
|
||||
mv $incdir/.compat.patch.tmp $incdir/.compat.patch
|
||||
|
||||
if [ -s $incdir/.compat.cocci ]; then
|
||||
+ echo " GENCOCCIRULES .compat.cocci";
|
||||
+ cat $incdir/.compat.cocci;
|
||||
+ command="spatch --sp-file $incdir/.compat.cocci $@ --macro-file drbd-kernel-compat/cocci_macros.h --macro-file-builtins $coccilibpath/standard.h --iso-file $coccilibpath/standard.iso --very-quiet --all-includes > $compat_patch.tmp 2> $incdir/.spatch.stderr"
|
||||
+ echo " SPATCH COMMAND $command ";
|
||||
+
|
||||
# sources=( ... ) passed in via environment
|
||||
echo " SPATCH $chksum "$K
|
||||
set +e
|
||||
spatch --sp-file "$incdir/.compat.cocci" "$@" \
|
||||
--macro-file drbd-kernel-compat/cocci_macros.h \
|
||||
+ --macro-file-builtins $coccilibpath/standard.h \
|
||||
+ --iso-file $coccilibpath/standard.iso \
|
||||
--very-quiet \
|
||||
--all-includes \
|
||||
> "$compat_patch.tmp" \
|
||||
@@ -94,9 +118,21 @@
|
||||
echo " SPATCH $chksum "$K" - nothing to do"
|
||||
touch $compat_patch.tmp
|
||||
fi
|
||||
+
|
||||
+ command="spatch --sp-file $incdir/.compat.cocci $@ --macro-file drbd-kernel-compat/cocci_macros.h --macro-file-builtins $coccilibpath/standard.h --iso-file $coccilibpath/standard.iso --very-quiet --all-includes > $compat_patch.tmp 2> $incdir/.spatch.stderr"
|
||||
+ echo " SPATCH COMMAND $command ";
|
||||
+ echo " GENSPATCHFILE $compat_patch.tmp ";
|
||||
+ cat $compat_patch.tmp;
|
||||
+
|
||||
spatch --sp-file "$incdir/.compat.cocci" "${sources[@]}" \
|
||||
--macro-file drbd-kernel-compat/cocci_macros.h \
|
||||
+ --macro-file-builtins $coccilibpath/standard.h \
|
||||
+ --iso-file $coccilibpath/standard.iso \
|
||||
--very-quiet \
|
||||
--all-includes \
|
||||
${SPATCH_DEBUG:+ --debug} \
|
||||
@@ -101,8 +124,18 @@ if hash spatch && spatch_is_recent; then
|
||||
echo " SPATCH $chksum "$K" - nothing to do"
|
||||
fi
|
||||
|
||||
+ echo " GENSPATCHFILE $compat_patch.tmp ";
|
||||
if [ -e $incdir/.compat.patch ]; then
|
||||
+ echo " EXIST $incdir/.compat.patch ";
|
||||
cat $incdir/.compat.patch >> $compat_patch.tmp
|
||||
+ cat $compat_patch.tmp;
|
||||
fi
|
||||
+
|
||||
if [ -s $incdir/.compat.patch ]; then
|
||||
+ echo " EXIST $incdir/.compat.patch ";
|
||||
cat $incdir/.compat.patch >> $compat_patch.tmp
|
||||
+ cat $compat_patch.tmp;
|
||||
+ fi
|
||||
+ if [ -e $incdir/.spatch.stderr ]; then
|
||||
+ echo " GENSPATCHERR .spatch.stderr";
|
||||
+ cat $incdir/.spatch.stderr;
|
||||
+ fi
|
||||
+
|
||||
+ if [ -e $incdir/.spatch.stderr ]; then
|
||||
+ echo " GENSPATCHERR .spatch.stderr";
|
||||
+ cat $incdir/.spatch.stderr;
|
||||
fi
|
||||
|
||||
if [ -s $compat_patch.tmp ]; then
|
||||
mv $compat_patch.tmp $compat_patch
|
||||
# keep it around
|
||||
# to better be able to match the "stderr" warnings to their source files
|
||||
|
Loading…
Reference in New Issue
Block a user