Compare commits
197 Commits
Author | SHA256 | Date | |
---|---|---|---|
|
67e828e1bd | ||
|
06370a1980 | ||
|
6ee9ba5898 | ||
|
2bae9bc8c5 | ||
|
0eb684eb1f | ||
|
38a24befea | ||
|
d377bc2ee5 | ||
|
6c06a89906 | ||
|
bd99eea891 | ||
|
a156897b31 | ||
|
08bd6c9da5 | ||
|
3351498905 | ||
|
4a4a040191 | ||
|
7e221f084c | ||
|
60ef287345 | ||
|
f87dc60bd9 | ||
|
3e11cfbc83 | ||
|
0259244ea7 | ||
|
172292f7b4 | ||
|
d09a2c7cea | ||
|
e7b40eeaea | ||
|
cadc9519cc | ||
|
90d03da070 | ||
|
b04dc19e5e | ||
|
d4c87ee5c1 | ||
|
1ec504acc4 | ||
|
44b98926cd | ||
|
f809287682 | ||
|
4e5f7cbf78 | ||
|
160fe7f38c | ||
|
039faa1c60 | ||
|
94ea40b926 | ||
|
fb29c7bf26 | ||
|
93a0dc4712 | ||
|
8cb897e5f9 | ||
|
7846ec924a | ||
|
a1185e0865 | ||
|
1eb6b25c2a | ||
|
9b83b250ff | ||
|
43a00e1438 | ||
|
f23e374dc5 | ||
|
132c70a03d | ||
|
3a50233a65 | ||
|
b04b5ff4a3 | ||
|
fd35c13bdf | ||
|
c4415b9ea2 | ||
|
8d622e7b70 | ||
|
84e35e06ef | ||
|
0ea57caa91 | ||
|
d772d01cc7 | ||
|
7cbf74c985 | ||
|
a670e5fa44 | ||
|
c42d1c5129 | ||
|
8a631cf560 | ||
|
9994a59163 | ||
|
e26ad2500c | ||
|
9bc1fec7f4 | ||
|
eea075f12a | ||
|
466f0dcd56 | ||
|
86d3ab9e4c | ||
|
58761eddfc | ||
|
856d411622 | ||
|
29fb152658 | ||
|
1ff640cbd6 | ||
|
72ad06bdad | ||
|
9c489f3ad3 | ||
|
f105a5ae38 | ||
|
7e21277260 | ||
|
8ae83885b1 | ||
|
5c20ec9cab | ||
|
d8f747e343 | ||
|
4fdf38b6cd | ||
|
789c220c0e | ||
|
285a9425d5 | ||
|
034035f261 | ||
|
d3e71354f1 | ||
|
f89793bafe | ||
|
a2b450528a | ||
|
0498b863bb | ||
|
76c68b5619 | ||
|
48e7e51612 | ||
|
841aa96012 | ||
|
94234e2412 | ||
|
8c3fc622bb | ||
|
6ef3f2b5b0 | ||
|
e77111e87e | ||
|
6e60e2a4f7 | ||
|
50f1945649 | ||
|
4ac2a13ce4 | ||
|
7ac1c13843 | ||
|
b5889d912c | ||
|
f1ad3894c8 | ||
|
db253bee42 | ||
|
b9487d99fe | ||
|
2120f01a81 | ||
|
70bd7e2f0c | ||
|
912bc9ed41 | ||
|
b893dd4bdf | ||
|
5c71beace2 | ||
|
901b9fce17 | ||
|
4cafd9f9e4 | ||
|
26b9fe3ec9 | ||
|
50c4f7c809 | ||
|
68a5ac4522 | ||
|
31a5d6a79d | ||
|
f578ce008b | ||
|
2da0b071cc | ||
|
79847ac9e4 | ||
|
2dedcb784d | ||
|
201d6f194e | ||
|
fdb9bee090 | ||
|
d6faf29d73 | ||
|
2e332ac2b6 | ||
|
2f644f3dcc | ||
|
6ede445195 | ||
|
4663d95645 | ||
|
26cfd8f798 | ||
|
7723960b4f | ||
|
dc163d72b4 | ||
|
2a365161c3 | ||
|
563be55218 | ||
|
4f01e647ba | ||
|
760895e2d0 | ||
|
bd45d7ba45 | ||
|
984d8f8306 | ||
|
c3b1cc4105 | ||
|
ce85cb0ff7 | ||
|
5d7f6b839f | ||
|
7ff6cdb1ce | ||
|
283d692841 | ||
|
72f62bf326 | ||
|
143b09ce28 | ||
|
97165c6dae | ||
|
c59849f504 | ||
|
9459466ff0 | ||
|
8d94f3de52 | ||
|
e712a12b7e | ||
|
453d3ebd86 | ||
|
cc3b3800d1 | ||
|
40e122744f | ||
|
73a7d7f261 | ||
|
583bb11686 | ||
|
524400d0e7 | ||
|
f5a3400700 | ||
|
18bba12a8c | ||
|
f9dc362b8e | ||
|
efc1155223 | ||
|
6a9bae1c9e | ||
|
46b07bd4dc | ||
|
6b5e46704b | ||
|
b91e658262 | ||
|
543d9db109 | ||
|
bc955caa4a | ||
|
0e028f6e19 | ||
|
c6df818c4c | ||
|
c59288e1c5 | ||
|
f489baa90f | ||
|
b91458c9bb | ||
|
bcdfb8b628 | ||
|
428f2cbe4b | ||
|
cffb3f96c9 | ||
|
e327903f6c | ||
|
7e1e97ef29 | ||
|
7e4c01e0c9 | ||
|
66ad1cdeb8 | ||
|
8b1ddb6695 | ||
|
4bb004e99c | ||
|
07c0802440 | ||
|
ba6eb8da46 | ||
|
4d5f3d6227 | ||
|
b090ba1522 | ||
|
f4cdf5fa08 | ||
|
1e0191cb11 | ||
|
267ac243e6 | ||
|
cb631d75e5 | ||
|
e9a533f199 | ||
|
e6120ecd85 | ||
|
84b91368c6 | ||
|
f611f503ea | ||
|
36ca4a242f | ||
|
48cd784266 | ||
|
8a0ee48501 | ||
|
2071e3b20c | ||
|
1db16c94d5 | ||
|
26278b6a17 | ||
|
e81599df6b | ||
|
076660183a | ||
|
33c0e4de42 | ||
|
e276857a62 | ||
|
cb75e831ed | ||
|
baae30a30d | ||
|
3e4cc222d1 | ||
|
44c2da2968 | ||
|
8b947bef08 | ||
|
ce5c551480 | ||
|
ab7625a8b0 | ||
|
2650be5163 |
@ -1,37 +0,0 @@
|
||||
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
|
||||
|
@ -1,119 +0,0 @@
|
||||
From aab03bfc73a62f95011316545a5c0fbb4817741b Mon Sep 17 00:00:00 2001
|
||||
From: Lars Ellenberg <lars.ellenberg@linbit.com>
|
||||
Date: Wed, 14 Aug 2024 11:49:42 +0200
|
||||
Subject: [PATCH 01/32] drbd: properly rate-limit resync progress reports
|
||||
|
||||
A peer_device in "paused" sync would have flooded the "drbd events2"
|
||||
generic netlink broadcast with "resync progress reports",
|
||||
if it cleared significant out-of-sync bits,
|
||||
as is the case with application writes,
|
||||
or several peers syncing from the same sync source
|
||||
and having a "paused sync" replication state between themselves.
|
||||
|
||||
If you have "many" such resources, this storm may even overflow receive buffers.
|
||||
At most one progress report every three seconds should be enough,
|
||||
and is what was intended.
|
||||
|
||||
Use a new "last progress report time stamp" to throttle
|
||||
advancing resync progress marks and progress report broadcasts.
|
||||
---
|
||||
drbd/drbd_actlog.c | 35 +++++++++++++++++++++++------------
|
||||
drbd/drbd_int.h | 1 +
|
||||
drbd/drbd_receiver.c | 1 +
|
||||
drbd/drbd_state.c | 2 ++
|
||||
4 files changed, 27 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/drbd/drbd_actlog.c b/drbd/drbd_actlog.c
|
||||
index b96560843878..646dcb29e1d9 100644
|
||||
--- a/drbd/drbd_actlog.c
|
||||
+++ b/drbd/drbd_actlog.c
|
||||
@@ -1020,19 +1020,30 @@ static bool update_rs_extent(struct drbd_peer_device *peer_device,
|
||||
|
||||
void drbd_advance_rs_marks(struct drbd_peer_device *peer_device, unsigned long still_to_go)
|
||||
{
|
||||
- unsigned long now = jiffies;
|
||||
- unsigned long last = peer_device->rs_mark_time[peer_device->rs_last_mark];
|
||||
- int next = (peer_device->rs_last_mark + 1) % DRBD_SYNC_MARKS;
|
||||
- if (time_after_eq(now, last + DRBD_SYNC_MARK_STEP)) {
|
||||
- if (peer_device->rs_mark_left[peer_device->rs_last_mark] != still_to_go &&
|
||||
- peer_device->repl_state[NOW] != L_PAUSED_SYNC_T &&
|
||||
- peer_device->repl_state[NOW] != L_PAUSED_SYNC_S) {
|
||||
- peer_device->rs_mark_time[next] = now;
|
||||
- peer_device->rs_mark_left[next] = still_to_go;
|
||||
- peer_device->rs_last_mark = next;
|
||||
- }
|
||||
- drbd_peer_device_post_work(peer_device, RS_PROGRESS);
|
||||
+ unsigned long now;
|
||||
+ int next;
|
||||
+
|
||||
+ /* report progress and advance marks only if we made progress */
|
||||
+ if (peer_device->rs_mark_left[peer_device->rs_last_mark] == still_to_go)
|
||||
+ return;
|
||||
+
|
||||
+ /* report progress and advance marks at most once every DRBD_SYNC_MARK_STEP (3 seconds) */
|
||||
+ now = jiffies;
|
||||
+ if (!time_after_eq(now, peer_device->rs_last_progress_report_ts + DRBD_SYNC_MARK_STEP))
|
||||
+ return;
|
||||
+
|
||||
+ /* Do not advance marks if we are "paused" */
|
||||
+ if (peer_device->repl_state[NOW] != L_PAUSED_SYNC_T &&
|
||||
+ peer_device->repl_state[NOW] != L_PAUSED_SYNC_S) {
|
||||
+ next = (peer_device->rs_last_mark + 1) % DRBD_SYNC_MARKS;
|
||||
+ peer_device->rs_mark_time[next] = now;
|
||||
+ peer_device->rs_mark_left[next] = still_to_go;
|
||||
+ peer_device->rs_last_mark = next;
|
||||
}
|
||||
+
|
||||
+ /* But still report progress even if paused. */
|
||||
+ peer_device->rs_last_progress_report_ts = now;
|
||||
+ drbd_peer_device_post_work(peer_device, RS_PROGRESS);
|
||||
}
|
||||
|
||||
/* It is called lazy update, so don't do write-out too often. */
|
||||
diff --git a/drbd/drbd_int.h b/drbd/drbd_int.h
|
||||
index 49bd7b0c407c..c18407899f59 100644
|
||||
--- a/drbd/drbd_int.h
|
||||
+++ b/drbd/drbd_int.h
|
||||
@@ -1285,6 +1285,7 @@ struct drbd_peer_device {
|
||||
unsigned long rs_paused;
|
||||
/* skipped because csum was equal [unit BM_BLOCK_SIZE] */
|
||||
unsigned long rs_same_csum;
|
||||
+ unsigned long rs_last_progress_report_ts;
|
||||
#define DRBD_SYNC_MARKS 8
|
||||
#define DRBD_SYNC_MARK_STEP (3*HZ)
|
||||
/* block not up-to-date at mark [unit BM_BLOCK_SIZE] */
|
||||
diff --git a/drbd/drbd_receiver.c b/drbd/drbd_receiver.c
|
||||
index 19634f6423bd..ee54cf3ac116 100644
|
||||
--- a/drbd/drbd_receiver.c
|
||||
+++ b/drbd/drbd_receiver.c
|
||||
@@ -3409,6 +3409,7 @@ static int receive_DataRequest(struct drbd_connection *connection, struct packet
|
||||
peer_device->ov_skipped = 0;
|
||||
peer_device->rs_total = ov_left;
|
||||
peer_device->rs_last_writeout = now;
|
||||
+ peer_device->rs_last_progress_report_ts = now;
|
||||
for (i = 0; i < DRBD_SYNC_MARKS; i++) {
|
||||
peer_device->rs_mark_left[i] = ov_left;
|
||||
peer_device->rs_mark_time[i] = now;
|
||||
diff --git a/drbd/drbd_state.c b/drbd/drbd_state.c
|
||||
index be1de8f0653b..44f55ee5c939 100644
|
||||
--- a/drbd/drbd_state.c
|
||||
+++ b/drbd/drbd_state.c
|
||||
@@ -2483,6 +2483,7 @@ static void initialize_resync_progress_marks(struct drbd_peer_device *peer_devic
|
||||
unsigned long now = jiffies;
|
||||
int i;
|
||||
|
||||
+ peer_device->rs_last_progress_report_ts = now;
|
||||
for (i = 0; i < DRBD_SYNC_MARKS; i++) {
|
||||
peer_device->rs_mark_left[i] = tw;
|
||||
peer_device->rs_mark_time[i] = now;
|
||||
@@ -2730,6 +2731,7 @@ static void finish_state_change(struct drbd_resource *resource, const char *tag)
|
||||
peer_device->ov_last_skipped_size = 0;
|
||||
peer_device->ov_last_skipped_start = 0;
|
||||
peer_device->rs_last_writeout = now;
|
||||
+ peer_device->rs_last_progress_report_ts = now;
|
||||
for (i = 0; i < DRBD_SYNC_MARKS; i++) {
|
||||
peer_device->rs_mark_left[i] = peer_device->rs_total;
|
||||
peer_device->rs_mark_time[i] = now;
|
||||
--
|
||||
2.35.3
|
||||
|
@ -1,65 +0,0 @@
|
||||
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
|
||||
|
@ -1,60 +0,0 @@
|
||||
From f6613104a37c1d43cb50fd619afccba370db47a0 Mon Sep 17 00:00:00 2001
|
||||
From: Joel Colledge <joel.colledge@linbit.com>
|
||||
Date: Tue, 20 Aug 2024 12:28:09 +0100
|
||||
Subject: [PATCH 02/32] drbd: inherit history UUIDs from sync source when
|
||||
resync finishes
|
||||
|
||||
This prevents unexpected "unrelated data" or "split-brain" situations
|
||||
from occurring later. For example with nodes A, B and C:
|
||||
* A diskless, B, C with disk, all connected, on UUID X
|
||||
* Down B
|
||||
* Write on C, new UUID Y generated
|
||||
* Add disk on A, resyncs from C
|
||||
* Down C
|
||||
* Up B, connects to A, should resync from A
|
||||
|
||||
Without this change, "unrelated data" or "split-brain" occurs between A
|
||||
and B.
|
||||
Node A has current UUID Y, but knows nothing about X.
|
||||
Node B has current UUID X, but knows nothing about Y.
|
||||
|
||||
This scenario is also possible with "quorum majority".
|
||||
|
||||
Fix this by adding the history and bitmap UUIDs from the sync source
|
||||
into the history on the sync target when a resync finishes. In the above
|
||||
scenario, this adds the UUID X into the history on A and so has the
|
||||
effect that a full sync from A to B occurs in the final step.
|
||||
---
|
||||
drbd/drbd_main.c | 11 +++++++++++
|
||||
1 file changed, 11 insertions(+)
|
||||
|
||||
diff --git a/drbd/drbd_main.c b/drbd/drbd_main.c
|
||||
index 7968be7c4c3f..862438885f35 100644
|
||||
--- a/drbd/drbd_main.c
|
||||
+++ b/drbd/drbd_main.c
|
||||
@@ -5030,11 +5030,22 @@ u64 drbd_uuid_resync_finished(struct drbd_peer_device *peer_device) __must_hold(
|
||||
{
|
||||
struct drbd_device *device = peer_device->device;
|
||||
unsigned long flags;
|
||||
+ int i;
|
||||
u64 ss_nz_bm; /* sync_source has non zero bitmap for. expressed as nodemask */
|
||||
u64 pwcu; /* peers with current uuid */
|
||||
u64 newer;
|
||||
|
||||
spin_lock_irqsave(&device->ldev->md.uuid_lock, flags);
|
||||
+ // Inherit history from the sync source
|
||||
+ for (i = 0; i < ARRAY_SIZE(peer_device->history_uuids); i++)
|
||||
+ _drbd_uuid_push_history(device, peer_device->history_uuids[i] & ~UUID_PRIMARY);
|
||||
+
|
||||
+ // Inherit history in bitmap UUIDs from the sync source
|
||||
+ for (i = 0; i < DRBD_PEERS_MAX; i++)
|
||||
+ if (peer_device->bitmap_uuids[i] != -1)
|
||||
+ _drbd_uuid_push_history(device,
|
||||
+ peer_device->bitmap_uuids[i] & ~UUID_PRIMARY);
|
||||
+
|
||||
ss_nz_bm = __test_bitmap_slots_of_peer(peer_device);
|
||||
pwcu = peers_with_current_uuid(device, peer_device->current_uuid);
|
||||
|
||||
--
|
||||
2.35.3
|
||||
|
@ -1,36 +0,0 @@
|
||||
From d6f2b71109f6a589fbc3d5c571c840a6bd142943 Mon Sep 17 00:00:00 2001
|
||||
From: Lars Ellenberg <lars.ellenberg@linbit.com>
|
||||
Date: Thu, 22 Aug 2024 16:05:25 +0200
|
||||
Subject: [PATCH 03/32] build,compat: fix line offset in annotation pragmas
|
||||
pointing to patched sources
|
||||
|
||||
I forgot to update the "new position" by the two output pragma lines
|
||||
for each non-context to context line transition per chunk.
|
||||
|
||||
Offsets would accumultate within the chunk, but reset with the next chunk.
|
||||
|
||||
Pragmas pointing into the "patched" file would be off by two lines
|
||||
(per such transition within a chunk), pointing to some line 2 (4,6,8) lines
|
||||
above the actual offending line.
|
||||
|
||||
Noticed during recent compat work when the backward compat cocci rules
|
||||
where still incomplete.
|
||||
---
|
||||
.../annotate-diff-with-original-file-position-pragmas.pl | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/drbd/drbd-kernel-compat/annotate-diff-with-original-file-position-pragmas.pl b/drbd/drbd-kernel-compat/annotate-diff-with-original-file-position-pragmas.pl
|
||||
index c28265e6dd9d..de95689a6ef0 100644
|
||||
--- a/drbd/drbd-kernel-compat/annotate-diff-with-original-file-position-pragmas.pl
|
||||
+++ b/drbd/drbd-kernel-compat/annotate-diff-with-original-file-position-pragmas.pl
|
||||
@@ -91,6 +91,7 @@ m{^--- (?:\./)?(\S+)$} and do {
|
||||
$chunk .= qq{+# $. "$patch_name"\n};
|
||||
$chunk .= qq{+# $o_pos "$ABS_NAME"\n};
|
||||
$n_count += 2;
|
||||
+ $n_pos += 2;
|
||||
$extra_ncount += 2;
|
||||
$file_line_context_points_to_orig = 1;
|
||||
$state = ' ';
|
||||
--
|
||||
2.35.3
|
||||
|
@ -1,32 +0,0 @@
|
||||
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
|
||||
|
@ -1,47 +0,0 @@
|
||||
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
|
||||
|
@ -1,57 +0,0 @@
|
||||
From 2f464b8e8235efe2c5d972cf8054dcc2010b100e Mon Sep 17 00:00:00 2001
|
||||
From: Philipp Reisner <philipp.reisner@linbit.com>
|
||||
Date: Wed, 14 Aug 2024 17:42:44 +0200
|
||||
Subject: [PATCH 04/32] drbd: fix exposed_uuid going backward
|
||||
|
||||
When a diskless node in the primary role creates a new current UUID,
|
||||
it sends it all its UpToDate peers and sets it as its own exposed
|
||||
UUID. If there is only one UpToDate node in the secondary role and it
|
||||
sends its current UUID to the diskless primary at about the same time,
|
||||
then with the following state change, through the function
|
||||
ensure_expose_data_uuid(), the diskless primary sets its exposed_uuid
|
||||
back to the previous one.
|
||||
|
||||
Avoid this problem by not accepting a current_uuid update from a peer
|
||||
when I am primary (authoritative), and I have told the peer the latest
|
||||
update, and that peer is already on that latest (authoritative) value.
|
||||
---
|
||||
drbd/drbd_main.c | 1 +
|
||||
drbd/drbd_receiver.c | 10 +++++++++-
|
||||
2 files changed, 10 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drbd/drbd_main.c b/drbd/drbd_main.c
|
||||
index 862438885f35..bc3283b045c9 100644
|
||||
--- a/drbd/drbd_main.c
|
||||
+++ b/drbd/drbd_main.c
|
||||
@@ -1484,6 +1484,7 @@ int drbd_send_current_uuid(struct drbd_peer_device *peer_device, u64 current_uui
|
||||
if (!p)
|
||||
return -EIO;
|
||||
|
||||
+ peer_device->comm_current_uuid = current_uuid;
|
||||
p->uuid = cpu_to_be64(current_uuid);
|
||||
p->weak_nodes = cpu_to_be64(weak_nodes);
|
||||
return drbd_send_command(peer_device, P_CURRENT_UUID, DATA_STREAM);
|
||||
diff --git a/drbd/drbd_receiver.c b/drbd/drbd_receiver.c
|
||||
index ee54cf3ac116..985fac8e69b3 100644
|
||||
--- a/drbd/drbd_receiver.c
|
||||
+++ b/drbd/drbd_receiver.c
|
||||
@@ -5815,7 +5815,15 @@ static int receive_uuids110(struct drbd_connection *connection, struct packet_in
|
||||
peer_md = device->ldev->md.peers;
|
||||
spin_lock_irq(&device->ldev->md.uuid_lock);
|
||||
}
|
||||
- peer_device->current_uuid = be64_to_cpu(p->current_uuid);
|
||||
+
|
||||
+ if (device->resource->role[NOW] != R_PRIMARY ||
|
||||
+ device->disk_state[NOW] != D_DISKLESS ||
|
||||
+ (peer_device->current_uuid & ~UUID_PRIMARY) !=
|
||||
+ (device->exposed_data_uuid & ~UUID_PRIMARY) ||
|
||||
+ (peer_device->comm_current_uuid & ~UUID_PRIMARY) !=
|
||||
+ (device->exposed_data_uuid & ~UUID_PRIMARY))
|
||||
+ peer_device->current_uuid = be64_to_cpu(p->current_uuid);
|
||||
+
|
||||
peer_device->dirty_bits = be64_to_cpu(p->dirty_bits);
|
||||
peer_device->uuid_flags = be64_to_cpu(p->uuid_flags);
|
||||
if (peer_device->uuid_flags & UUID_FLAG_HAS_UNALLOC) {
|
||||
--
|
||||
2.35.3
|
||||
|
@ -1,39 +0,0 @@
|
||||
From c7384276634be7c5b49ef0b8d7fa064927a207f8 Mon Sep 17 00:00:00 2001
|
||||
From: Philipp Reisner <philipp.reisner@linbit.com>
|
||||
Date: Wed, 14 Aug 2024 19:42:40 +0200
|
||||
Subject: [PATCH 05/32] drbd: Proper locking around new_current_uuid on a
|
||||
diskless
|
||||
|
||||
Like the current UUID of a diskful node, changing the exposed_uuid of
|
||||
a diskless node needs to be serialized with the UUID exchange when
|
||||
establishing new connections.
|
||||
---
|
||||
drbd/drbd_main.c | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
diff --git a/drbd/drbd_main.c b/drbd/drbd_main.c
|
||||
index bc3283b045c9..2792b9896271 100644
|
||||
--- a/drbd/drbd_main.c
|
||||
+++ b/drbd/drbd_main.c
|
||||
@@ -4827,7 +4827,10 @@ void drbd_uuid_new_current(struct drbd_device *device, bool forced)
|
||||
current_uuid |= UUID_PRIMARY;
|
||||
else
|
||||
current_uuid &= ~UUID_PRIMARY;
|
||||
+
|
||||
+ down_write(&device->uuid_sem);
|
||||
drbd_uuid_set_exposed(device, current_uuid, false);
|
||||
+ downgrade_write(&device->uuid_sem);
|
||||
drbd_info(device, "sending new current UUID: %016llX\n", current_uuid);
|
||||
|
||||
weak_nodes = drbd_weak_nodes_device(device);
|
||||
@@ -4837,6 +4840,7 @@ void drbd_uuid_new_current(struct drbd_device *device, bool forced)
|
||||
peer_device->current_uuid = current_uuid;
|
||||
}
|
||||
}
|
||||
+ up_read(&device->uuid_sem);
|
||||
}
|
||||
}
|
||||
|
||||
--
|
||||
2.35.3
|
||||
|
@ -1,28 +0,0 @@
|
||||
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
|
||||
|
@ -1,43 +0,0 @@
|
||||
From 18795749745baa4b8b37cb56eb12a57a7bd55da7 Mon Sep 17 00:00:00 2001
|
||||
From: Roland Kammerer <roland.kammerer@linbit.com>
|
||||
Date: Tue, 27 Aug 2024 09:08:31 +0200
|
||||
Subject: [PATCH 06/32] build: CycloneDX: fix bom-ref, add purl
|
||||
|
||||
---
|
||||
Makefile | 4 ++--
|
||||
drbd-kmod.cdx.json.in | 1 +
|
||||
2 files changed, 3 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/Makefile b/Makefile
|
||||
index 83a2ed8a42f7..3f58568cc138 100644
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -238,11 +238,11 @@ drbd-kmod_rhel.spdx drbd-kmod_sles.spdx:
|
||||
# only call this wrapper from drbd-kmod.cdx.json
|
||||
.PHONY: cdx-sub
|
||||
cdx-sub:
|
||||
- cat $(CDX_FILE).in | jq --args '.metadata.timestamp = "$(CDX_DATE)" | .metadata.component.version = "$(FDIST_VERSION)" | .metadata.component."bom-ref" = "https://github.com/LINBIT/drbd/releases/tag/drbd-$(FDIST_VERSION)"' > $(CDX_FILE)
|
||||
+ cat $(CDX_FILE).in | jq --args '.metadata.timestamp = "$(CDX_DATE)" | .metadata.component.version = "$(FDIST_VERSION)" | .metadata.component."bom-ref" = "$(PURL)" | .metadata.component.purl = "$(PURL)"' > $(CDX_FILE)
|
||||
|
||||
.PHONY: drbd-kmod.cdx.json
|
||||
drbd-kmod.cdx.json:
|
||||
- $(MAKE) -s cdx-sub CDX_DATE="$$(date --utc +%FT%TZ)" CDX_FILE="$@"
|
||||
+ $(MAKE) -s cdx-sub CDX_DATE="$$(date --utc +%FT%TZ)" PURL="pkg:github/LINBIT/drbd@drbd-$(FDIST_VERSION)" CDX_FILE="$@"
|
||||
! grep -q __PLACEHOLDER__ $@
|
||||
|
||||
# update of .filelist is forced:
|
||||
diff --git a/drbd-kmod.cdx.json.in b/drbd-kmod.cdx.json.in
|
||||
index f7a4c4a46aa6..ab4e05a43187 100644
|
||||
--- a/drbd-kmod.cdx.json.in
|
||||
+++ b/drbd-kmod.cdx.json.in
|
||||
@@ -18,6 +18,7 @@
|
||||
"name": "kmod-drbd",
|
||||
"version": "__PLACEHOLDER__",
|
||||
"bom-ref": "__PLACEHOLDER__",
|
||||
+ "purl": "__PLACEHOLDER__",
|
||||
"licenses": [
|
||||
{
|
||||
"licenses": {
|
||||
--
|
||||
2.35.3
|
||||
|
@ -1,82 +0,0 @@
|
||||
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
|
||||
|
@ -1,51 +0,0 @@
|
||||
From c4dd27cc69b99e13d4117fa348f968cf2199db6b Mon Sep 17 00:00:00 2001
|
||||
From: Philipp Reisner <philipp.reisner@linbit.com>
|
||||
Date: Wed, 28 Aug 2024 18:43:31 +0200
|
||||
Subject: [PATCH 07/32] build: Another update to the spdx files
|
||||
|
||||
Some enterprise customers require these files to contain a
|
||||
"PackageCopyrightText" tag. Apart from that they require the
|
||||
SPDX in JSON format. That will come in another commit.
|
||||
---
|
||||
Makefile | 7 ++++++-
|
||||
1 file changed, 6 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/Makefile b/Makefile
|
||||
index 3f58568cc138..80c20d24ab54 100644
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -205,6 +205,8 @@ PackageSupplier: Organization: LINBIT HA-Solutions GmbH
|
||||
PackageDownloadLocation: https://github.com/LINBIT/drbd
|
||||
FilesAnalyzed: false
|
||||
PackageLicenseDeclared: GPL-2.0-only
|
||||
+PackageCopyrightText: <text>2001-2008, LINBIT Information Technologies GmbH
|
||||
+2008-$(SPDX_YEAR), LINBIT HA-Solutions GmbH</text>
|
||||
Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-Package-$(SPDX_PKG_NAME)
|
||||
endef
|
||||
|
||||
@@ -219,6 +221,7 @@ drbd-kmod_rhel.spdx drbd-kmod_sles.spdx:
|
||||
SPDX_DATE="$$(date --utc +%FT%TZ)"; \
|
||||
SPDX_UUID="$$(cat /proc/sys/kernel/random/uuid)"; \
|
||||
SPDX_VERSION="$(REL_VERSION)"; \
|
||||
+ SPDX_YEAR="$$(date --utc +%Y)"; \
|
||||
case "$@" in \
|
||||
drbd-kmod_rhel.spdx) SPDX_PKG_NAME=kmod-drbd;; \
|
||||
drbd-kmod_sles.spdx) SPDX_PKG_NAME=drbd-kmp-default;; \
|
||||
@@ -228,11 +231,13 @@ drbd-kmod_rhel.spdx drbd-kmod_sles.spdx:
|
||||
test -n "$$SPDX_DATE"; \
|
||||
test -n "$$SPDX_UUID"; \
|
||||
test -n "$$SPDX_VERSION"; \
|
||||
+ test -n "$$SPDX_YEAR"; \
|
||||
$(MAKE) spdx-file SPDX_UUID="$$SPDX_UUID" \
|
||||
SPDX_DATE="$$SPDX_DATE" \
|
||||
SPDX_FILE_TMP="$@.tmp" \
|
||||
SPDX_PKG_NAME="$$SPDX_PKG_NAME" \
|
||||
- SPDX_VERSION="$$SPDX_VERSION"; \
|
||||
+ SPDX_VERSION="$$SPDX_VERSION" \
|
||||
+ SPDX_YEAR="$$SPDX_YEAR"; \
|
||||
mv $@.tmp $@; )
|
||||
|
||||
# only call this wrapper from drbd-kmod.cdx.json
|
||||
--
|
||||
2.35.3
|
||||
|
@ -1,45 +0,0 @@
|
||||
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
|
||||
|
@ -1,235 +0,0 @@
|
||||
From ca3589743378a7750b9e6a8e19b904d57986cce4 Mon Sep 17 00:00:00 2001
|
||||
From: Lars Ellenberg <lars.ellenberg@linbit.com>
|
||||
Date: Wed, 28 Aug 2024 20:00:36 +0200
|
||||
Subject: [PATCH 08/32] build: generate spdx.json, not "tag value" format
|
||||
|
||||
Generates .spdx.json files in SPDX-json format instead of tag/value.
|
||||
This appears to be more machine friendly.
|
||||
|
||||
Use jq with "null" input and \(env.<environment-variable-name>) string interpolation in templates.
|
||||
|
||||
Move all this to a new ./sbom/ subdirectory.
|
||||
---
|
||||
Makefile | 74 ++-----------------
|
||||
sbom/Makefile | 24 ++++++
|
||||
.../drbd-kmod.cdx.json.in | 8 +-
|
||||
sbom/drbd-kmod.spdx.json.in | 32 ++++++++
|
||||
4 files changed, 68 insertions(+), 70 deletions(-)
|
||||
create mode 100644 sbom/Makefile
|
||||
rename drbd-kmod.cdx.json.in => sbom/drbd-kmod.cdx.json.in (84%)
|
||||
create mode 100644 sbom/drbd-kmod.spdx.json.in
|
||||
|
||||
diff --git a/Makefile b/Makefile
|
||||
index 80c20d24ab54..37ffcd777d09 100644
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -92,6 +92,8 @@ ifndef FDIST_VERSION
|
||||
FDIST_VERSION := $(DIST_VERSION)
|
||||
endif
|
||||
|
||||
+export REL_VERSION FDIST_VERSION
|
||||
+
|
||||
all: module tools
|
||||
|
||||
.PHONY: all tools module
|
||||
@@ -189,76 +191,15 @@ drbd/.drbd_git_revision: FORCE
|
||||
@echo >&2 "Need a git checkout to regenerate $@"; test -s $@
|
||||
endif
|
||||
|
||||
-export define SPDX_TEMPLATE
|
||||
-SPDXVersion: SPDX-2.3
|
||||
-DataLicense: CC0-1.0
|
||||
-SPDXID: SPDXRef-DOCUMENT
|
||||
-DocumentName: drbd kernel module SBOM (software bill of materials)
|
||||
-DocumentNamespace: https://linbit.org/spdx-docs/drbd-kmod-$(SPDX_VERSION)-$(SPDX_UUID)
|
||||
-Creator: Person: Philipp Reisner (philipp.reisner@linbit.com)
|
||||
-Created: $(SPDX_DATE)
|
||||
-
|
||||
-PackageName: $(SPDX_PKG_NAME)
|
||||
-SPDXID: SPDXRef-Package-$(SPDX_PKG_NAME)
|
||||
-PackageVersion: $(SPDX_VERSION)
|
||||
-PackageSupplier: Organization: LINBIT HA-Solutions GmbH
|
||||
-PackageDownloadLocation: https://github.com/LINBIT/drbd
|
||||
-FilesAnalyzed: false
|
||||
-PackageLicenseDeclared: GPL-2.0-only
|
||||
-PackageCopyrightText: <text>2001-2008, LINBIT Information Technologies GmbH
|
||||
-2008-$(SPDX_YEAR), LINBIT HA-Solutions GmbH</text>
|
||||
-Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-Package-$(SPDX_PKG_NAME)
|
||||
-endef
|
||||
-
|
||||
-# only call this wrapper from drbd-kmod_{sles,rhel}.spdx
|
||||
-.PHONY: spdx-file
|
||||
-spdx-file:
|
||||
- @echo "$$SPDX_TEMPLATE" > $(SPDX_FILE_TMP)
|
||||
-
|
||||
-.PHONY: drbd-kmod_rhel.spdx drbd-kmod_sles.spdx
|
||||
-drbd-kmod_rhel.spdx drbd-kmod_sles.spdx:
|
||||
- @set -e; ( truncate -s0 $@.tmp; \
|
||||
- SPDX_DATE="$$(date --utc +%FT%TZ)"; \
|
||||
- SPDX_UUID="$$(cat /proc/sys/kernel/random/uuid)"; \
|
||||
- SPDX_VERSION="$(REL_VERSION)"; \
|
||||
- SPDX_YEAR="$$(date --utc +%Y)"; \
|
||||
- case "$@" in \
|
||||
- drbd-kmod_rhel.spdx) SPDX_PKG_NAME=kmod-drbd;; \
|
||||
- drbd-kmod_sles.spdx) SPDX_PKG_NAME=drbd-kmp-default;; \
|
||||
- *) false;; \
|
||||
- esac; \
|
||||
- test -n "$$SPDX_TEMPLATE"; \
|
||||
- test -n "$$SPDX_DATE"; \
|
||||
- test -n "$$SPDX_UUID"; \
|
||||
- test -n "$$SPDX_VERSION"; \
|
||||
- test -n "$$SPDX_YEAR"; \
|
||||
- $(MAKE) spdx-file SPDX_UUID="$$SPDX_UUID" \
|
||||
- SPDX_DATE="$$SPDX_DATE" \
|
||||
- SPDX_FILE_TMP="$@.tmp" \
|
||||
- SPDX_PKG_NAME="$$SPDX_PKG_NAME" \
|
||||
- SPDX_VERSION="$$SPDX_VERSION" \
|
||||
- SPDX_YEAR="$$SPDX_YEAR"; \
|
||||
- mv $@.tmp $@; )
|
||||
-
|
||||
-# only call this wrapper from drbd-kmod.cdx.json
|
||||
-.PHONY: cdx-sub
|
||||
-cdx-sub:
|
||||
- cat $(CDX_FILE).in | jq --args '.metadata.timestamp = "$(CDX_DATE)" | .metadata.component.version = "$(FDIST_VERSION)" | .metadata.component."bom-ref" = "$(PURL)" | .metadata.component.purl = "$(PURL)"' > $(CDX_FILE)
|
||||
-
|
||||
-.PHONY: drbd-kmod.cdx.json
|
||||
-drbd-kmod.cdx.json:
|
||||
- $(MAKE) -s cdx-sub CDX_DATE="$$(date --utc +%FT%TZ)" PURL="pkg:github/LINBIT/drbd@drbd-$(FDIST_VERSION)" CDX_FILE="$@"
|
||||
- ! grep -q __PLACEHOLDER__ $@
|
||||
-
|
||||
# update of .filelist is forced:
|
||||
.fdist_version: FORCE
|
||||
@test -s $@ && test "$$(cat $@)" = "$(FDIST_VERSION)" || echo "$(FDIST_VERSION)" > $@
|
||||
|
||||
.filelist: .fdist_version FORCE
|
||||
@$(GIT) ls-files --recurse -- ':!:.git*' $(if $(PRESERVE_DEBIAN),,':!:debian') > $@.new
|
||||
+ @test -s $@.new # assert there is something in .filelist.new now
|
||||
@mkdir -p drbd/drbd-kernel-compat/cocci_cache/
|
||||
@find drbd/drbd-kernel-compat/cocci_cache/ -type f -not -path '*/\.*' >> $@.new
|
||||
- @test -s $@.new # assert there is something in .filelist.new now
|
||||
@mv $@.new $@
|
||||
@echo "./.filelist updated."
|
||||
|
||||
@@ -273,9 +214,10 @@ drbd-kmod.cdx.json:
|
||||
comma := ,
|
||||
backslash_comma := \,
|
||||
escape_comma = $(subst $(comma),$(backslash_comma),$(1))
|
||||
-tgz-extra-files := \
|
||||
- .fdist_version drbd/.drbd_git_revision .filelist \
|
||||
- drbd-kmod_rhel.spdx drbd-kmod_sles.spdx drbd-kmod.cdx.json
|
||||
+tgz-extra-files := .fdist_version drbd/.drbd_git_revision .filelist
|
||||
+tgz-extra-files += sbom/drbd-kmod_rhel.spdx.json
|
||||
+tgz-extra-files += sbom/drbd-kmod_sles.spdx.json
|
||||
+tgz-extra-files += sbom/drbd-kmod.cdx.json
|
||||
tgz:
|
||||
test -s .filelist # .filelist must be present
|
||||
test -n "$(FDIST_VERSION)" # FDIST_VERSION must be known
|
||||
@@ -318,7 +260,7 @@ debrelease:
|
||||
tarball:
|
||||
$(MAKE) distclean
|
||||
$(MAKE) check-submods check_all_committed drbd/.drbd_git_revision
|
||||
- $(MAKE) drbd-kmod_rhel.spdx drbd-kmod_sles.spdx drbd-kmod.cdx.json
|
||||
+ $(MAKE) -C sbom drbd-kmod_rhel.spdx.json drbd-kmod_sles.spdx.json drbd-kmod.cdx.json
|
||||
$(MAKE) .filelist
|
||||
$(MAKE) tgz
|
||||
|
||||
diff --git a/sbom/Makefile b/sbom/Makefile
|
||||
new file mode 100644
|
||||
index 000000000000..757f57e4db60
|
||||
--- /dev/null
|
||||
+++ b/sbom/Makefile
|
||||
@@ -0,0 +1,24 @@
|
||||
+
|
||||
+# we inherit some variables from our "parent" Makefile
|
||||
+THIS_MAKEFILE := $(lastword $(MAKEFILE_LIST))
|
||||
+$(foreach v,REL_VERSION FDIST_VERSION,$(if $($(v)),,$(error "Do not use this Makefile ($(THIS_MAKEFILE)) directly! ($(v) missing))))
|
||||
+
|
||||
+all: drbd-kmod.cdx.json drbd-kmod_rhel.spdx.json drbd-kmod_sles.spdx.json
|
||||
+
|
||||
+export SPDX_VERSION SPDX_DATE SPDX_YEAR SPDX_UUID SPDX_PKG_NAME
|
||||
+SPDX_VERSION:=$(REL_VERSION)
|
||||
+SPDX_DATE:=$(shell date --utc +%FT%TZ)
|
||||
+SPDX_YEAR:=$(firstword $(subst -, ,$(SPDX_DATE)))
|
||||
+drbd-kmod_rhel.spdx.json drbd-kmod_sles.spdx.json: SPDX_UUID:=$(shell cat /proc/sys/kernel/random/uuid)
|
||||
+drbd-kmod_rhel.spdx.json: SPDX_PKG_NAME:=kmod-drbd
|
||||
+drbd-kmod_sles.spdx.json: SPDX_PKG_NAME:=drbd-kmp-default
|
||||
+drbd-kmod_rhel.spdx.json drbd-kmod_sles.spdx.json: FORCE
|
||||
+ @rm -f $@; jq -n -f drbd-kmod.spdx.json.in > $@.tmp && mv $@.tmp $@
|
||||
+
|
||||
+# uses:
|
||||
+# SPDX_DATE from above and FDIST_VERSION from parent Makefile
|
||||
+drbd-kmod.cdx.json: FORCE
|
||||
+ @rm -f $@; jq -n -f drbd-kmod.cdx.json.in > $@.tmp && mv $@.tmp $@
|
||||
+
|
||||
+.PHONY: FORCE
|
||||
+FORCE:
|
||||
diff --git a/drbd-kmod.cdx.json.in b/sbom/drbd-kmod.cdx.json.in
|
||||
similarity index 84%
|
||||
rename from drbd-kmod.cdx.json.in
|
||||
rename to sbom/drbd-kmod.cdx.json.in
|
||||
index ab4e05a43187..99858e8b9b43 100644
|
||||
--- a/drbd-kmod.cdx.json.in
|
||||
+++ b/sbom/drbd-kmod.cdx.json.in
|
||||
@@ -2,7 +2,7 @@
|
||||
"bomFormat": "CycloneDX",
|
||||
"specVersion": "1.5",
|
||||
"metadata": {
|
||||
- "timestamp": "__PLACEHOLDER__",
|
||||
+ "timestamp": "\(env.SPDX_DATE)",
|
||||
"authors": [
|
||||
{
|
||||
"name": "Philipp Reisner",
|
||||
@@ -16,9 +16,9 @@
|
||||
"component": {
|
||||
"type": "application",
|
||||
"name": "kmod-drbd",
|
||||
- "version": "__PLACEHOLDER__",
|
||||
- "bom-ref": "__PLACEHOLDER__",
|
||||
- "purl": "__PLACEHOLDER__",
|
||||
+ "version": "\(env.FDIST_VERSION)",
|
||||
+ "bom-ref": "pkg:github/LINBIT/drbd@drbd-\(env.FDIST_VERSION)",
|
||||
+ "purl": "pkg:github/LINBIT/drbd@drbd-\(env.FDIST_VERSION)",
|
||||
"licenses": [
|
||||
{
|
||||
"licenses": {
|
||||
diff --git a/sbom/drbd-kmod.spdx.json.in b/sbom/drbd-kmod.spdx.json.in
|
||||
new file mode 100644
|
||||
index 000000000000..07c1003f8834
|
||||
--- /dev/null
|
||||
+++ b/sbom/drbd-kmod.spdx.json.in
|
||||
@@ -0,0 +1,32 @@
|
||||
+{
|
||||
+ "SPDXID": "SPDXRef-DOCUMENT",
|
||||
+ "spdxVersion": "SPDX-2.3",
|
||||
+ "creationInfo": {
|
||||
+ "created": "\(env.SPDX_DATE)",
|
||||
+ "creators": [
|
||||
+ "Person: Philipp Reisner (philipp.reisner@linbit.com)"
|
||||
+ ]
|
||||
+ },
|
||||
+ "name": "drbd kernel module SBOM (software bill of materials)",
|
||||
+ "dataLicense": "CC0-1.0",
|
||||
+ "documentNamespace": "https://linbit.org/spdx-docs/drbd-kmod-\(env.SPDX_VERSION)-\(env.SPDX_UUID)",
|
||||
+ "packages": [
|
||||
+ {
|
||||
+ "SPDXID": "SPDXRef-Package-\(env.SPDX_PKG_NAME)",
|
||||
+ "copyrightText": "2001-2008, LINBIT Information Technologies GmbH\n2008-\(env.SPDX_YEAR), LINBIT HA-Solutions GmbH",
|
||||
+ "downloadLocation": "https://github.com/LINBIT/drbd",
|
||||
+ "filesAnalyzed": false,
|
||||
+ "licenseDeclared": "GPL-2.0-only",
|
||||
+ "name": "\(env.SPDX_PKG_NAME)",
|
||||
+ "supplier": "Organization: LINBIT HA-Solutions GmbH",
|
||||
+ "versionInfo": "\(env.SPDX_VERSION)"
|
||||
+ }
|
||||
+ ],
|
||||
+ "relationships": [
|
||||
+ {
|
||||
+ "spdxElementId": "SPDXRef-DOCUMENT",
|
||||
+ "relationshipType": "DESCRIBES",
|
||||
+ "relatedSpdxElement": "SPDXRef-Package-\(env.SPDX_PKG_NAME)"
|
||||
+ }
|
||||
+ ]
|
||||
+}
|
||||
--
|
||||
2.35.3
|
||||
|
@ -1,80 +0,0 @@
|
||||
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
|
||||
|
@ -1,49 +0,0 @@
|
||||
From 98325293e7d64ffae0e5e70620c5040ab0c76179 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Christoph=20B=C3=B6hmwalder?=
|
||||
<christoph.boehmwalder@linbit.com>
|
||||
Date: Tue, 13 Aug 2024 12:23:52 +0200
|
||||
Subject: [PATCH 09/32] compat: fix gen_patch_names for bdev_file_open_by_path
|
||||
|
||||
---
|
||||
drbd/drbd-kernel-compat/gen_patch_names.c | 12 +++++-------
|
||||
1 file changed, 5 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/drbd/drbd-kernel-compat/gen_patch_names.c b/drbd/drbd-kernel-compat/gen_patch_names.c
|
||||
index a9781bbd04e5..7549ee39afb7 100644
|
||||
--- a/drbd/drbd-kernel-compat/gen_patch_names.c
|
||||
+++ b/drbd/drbd-kernel-compat/gen_patch_names.c
|
||||
@@ -564,14 +564,17 @@ int main(int argc, char **argv)
|
||||
patch(1, "__bio_add_page", true, false,
|
||||
COMPAT_HAVE___BIO_ADD_PAGE, "present");
|
||||
|
||||
+ /* blkdev_put is oldest, then bdev_open_by_path, then bdev_file_open_by_path */
|
||||
patch(1, "bdev_file_open_by_path", true, false,
|
||||
COMPAT_HAVE_BDEV_FILE_OPEN_BY_PATH, "present");
|
||||
-
|
||||
#if !defined(COMPAT_HAVE_BDEV_FILE_OPEN_BY_PATH)
|
||||
+ /* middle ground: bdev_open_by_path */
|
||||
patch(1, "bdev_open_by_path", true, false,
|
||||
COMPAT_HAVE_BDEV_OPEN_BY_PATH, "present");
|
||||
-
|
||||
# if !defined(COMPAT_HAVE_BDEV_OPEN_BY_PATH)
|
||||
+ /* old: blkdev_get_by_* and blkdev_put */
|
||||
+ patch(1, "blkdev_put", true, false,
|
||||
+ COMPAT_BLKDEV_PUT_HAS_HOLDER, "has_holder");
|
||||
patch(1, "blkdev_get_by_path", true, false,
|
||||
COMPAT_BLKDEV_GET_BY_PATH_HAS_HOLDER_OPS, "has_holder_ops");
|
||||
# endif
|
||||
@@ -586,11 +589,6 @@ 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.35.3
|
||||
|
@ -1,45 +0,0 @@
|
||||
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
|
||||
|
@ -1,35 +0,0 @@
|
||||
From f6078aa51ed5b776eb2f646553872d576c404c60 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Christoph=20B=C3=B6hmwalder?=
|
||||
<christoph.boehmwalder@linbit.com>
|
||||
Date: Tue, 13 Aug 2024 12:40:27 +0200
|
||||
Subject: [PATCH 10/32] compat: fix nla_nest_start_noflag test
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
GCC complains:
|
||||
|
||||
returning ‘struct nlattr *’ from a function with return type ‘int’ makes
|
||||
integer from pointer without a cast
|
||||
|
||||
Return the proper type from this function.
|
||||
---
|
||||
drbd/drbd-kernel-compat/tests/have_nla_nest_start_noflag.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drbd/drbd-kernel-compat/tests/have_nla_nest_start_noflag.c b/drbd/drbd-kernel-compat/tests/have_nla_nest_start_noflag.c
|
||||
index 1d8037c397c5..62ab06c563b7 100644
|
||||
--- a/drbd/drbd-kernel-compat/tests/have_nla_nest_start_noflag.c
|
||||
+++ b/drbd/drbd-kernel-compat/tests/have_nla_nest_start_noflag.c
|
||||
@@ -1,7 +1,7 @@
|
||||
/* {"version": "5.1-rc7", "commit": "ae0be8de9a53cda3505865c11826d8ff0640237c", "comment": "nla_nest_start was renamed to _noflag, and the original version became a wrapper adding a flag", "author": "Michal Kubecek <mkubecek@suse.cz>", "date": "Fri Apr 26 11:13:06 2019 +0200"} */
|
||||
#include <net/netlink.h>
|
||||
|
||||
-int dummy(struct sk_buff *skb, int attrtype)
|
||||
+static struct nlattr *dummy(struct sk_buff *skb, int attrtype)
|
||||
{
|
||||
return nla_nest_start_noflag(skb, attrtype);
|
||||
}
|
||||
--
|
||||
2.35.3
|
||||
|
@ -1,37 +0,0 @@
|
||||
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
|
||||
|
@ -1,129 +0,0 @@
|
||||
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
|
||||
|
@ -1,29 +0,0 @@
|
||||
From 32b84f7b4d071312e5e812eab6b26e4aad2899e4 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Christoph=20B=C3=B6hmwalder?=
|
||||
<christoph.boehmwalder@linbit.com>
|
||||
Date: Mon, 19 Aug 2024 16:19:47 +0200
|
||||
Subject: [PATCH 11/32] compat: fix blk_alloc_disk rule
|
||||
|
||||
---
|
||||
drbd/drbd-kernel-compat/gen_patch_names.c | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drbd/drbd-kernel-compat/gen_patch_names.c b/drbd/drbd-kernel-compat/gen_patch_names.c
|
||||
index 7549ee39afb7..c21a43b39488 100644
|
||||
--- a/drbd/drbd-kernel-compat/gen_patch_names.c
|
||||
+++ b/drbd/drbd-kernel-compat/gen_patch_names.c
|
||||
@@ -155,9 +155,10 @@ int main(int argc, char **argv)
|
||||
|
||||
patch(1, "blk_alloc_disk", true, false,
|
||||
COMPAT_BLK_ALLOC_DISK_TAKES_QUEUE_LIMITS, "takes_queue_limits");
|
||||
-
|
||||
+#if !defined(COMPAT_BLK_ALLOC_DISK_TAKES_QUEUE_LIMITS)
|
||||
patch(1, "blk_alloc_disk", true, false,
|
||||
COMPAT_HAVE_BLK_ALLOC_DISK, "present");
|
||||
+#endif
|
||||
|
||||
/*******************************************************************************/
|
||||
/*
|
||||
--
|
||||
2.35.3
|
||||
|
@ -1,67 +0,0 @@
|
||||
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
|
||||
|
@ -1,29 +0,0 @@
|
||||
From 392743b95ab0aaff13d5c91eaaab5ae24388384f Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Christoph=20B=C3=B6hmwalder?=
|
||||
<christoph.boehmwalder@linbit.com>
|
||||
Date: Tue, 13 Aug 2024 12:29:35 +0200
|
||||
Subject: [PATCH 12/32] drbd: remove const from function return type
|
||||
|
||||
Linux 6.10 enables some compiler flag that errors out with:
|
||||
|
||||
error: type qualifiers ignored on function return type
|
||||
---
|
||||
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 985fac8e69b3..1b9f80de6f41 100644
|
||||
--- a/drbd/drbd_receiver.c
|
||||
+++ b/drbd/drbd_receiver.c
|
||||
@@ -272,7 +272,7 @@ static const char *drbd_sync_rule_str(enum sync_rule rule)
|
||||
return sync_rule_names[rule];
|
||||
}
|
||||
|
||||
-static const struct sync_descriptor strategy_descriptor(enum sync_strategy strategy)
|
||||
+static struct sync_descriptor strategy_descriptor(enum sync_strategy strategy)
|
||||
{
|
||||
if (strategy < 0 || strategy > ARRAY_SIZE(sync_descriptors)) {
|
||||
WARN_ON(true);
|
||||
--
|
||||
2.35.3
|
||||
|
@ -1,39 +0,0 @@
|
||||
From 3672388dc75cbcdb5f3821b5f4354b55333004f5 Mon Sep 17 00:00:00 2001
|
||||
From: Christoph Hellwig <hch@lst.de>
|
||||
Date: Wed, 6 Mar 2024 15:03:30 +0100
|
||||
Subject: [PATCH 13/32] drbd: don't set max_write_zeroes_sectors in
|
||||
decide_on_discard_support
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
fixup_write_zeroes always overrides the max_write_zeroes_sectors value
|
||||
a little further down the callchain, so don't bother to setup a limit
|
||||
in decide_on_discard_support.
|
||||
|
||||
Signed-off-by: Christoph Hellwig <hch@lst.de>
|
||||
Reviewed-by: Philipp Reisner <philipp.reisner@linbit.com>
|
||||
Reviewed-by: Lars Ellenberg <lars.ellenberg@linbit.com>
|
||||
Tested-by: Christoph Böhmwalder <christoph.boehmwalder@linbit.com>
|
||||
Link: https://lore.kernel.org/r/20240306140332.623759-6-philipp.reisner@linbit.com
|
||||
Signed-off-by: Jens Axboe <axboe@kernel.dk>
|
||||
Signed-off-by: Christoph Böhmwalder <christoph.boehmwalder@linbit.com>
|
||||
---
|
||||
drbd/drbd_nl.c | 1 -
|
||||
1 file changed, 1 deletion(-)
|
||||
|
||||
diff --git a/drbd/drbd_nl.c b/drbd/drbd_nl.c
|
||||
index ef315e02f437..a0c3534d8996 100644
|
||||
--- a/drbd/drbd_nl.c
|
||||
+++ b/drbd/drbd_nl.c
|
||||
@@ -2070,7 +2070,6 @@ static void decide_on_discard_support(struct drbd_device *device,
|
||||
blk_queue_discard_granularity(q, 512);
|
||||
max_discard_sectors = drbd_max_discard_sectors(device->resource);
|
||||
blk_queue_max_discard_sectors(q, max_discard_sectors);
|
||||
- blk_queue_max_write_zeroes_sectors(q, max_discard_sectors);
|
||||
return;
|
||||
|
||||
not_supported:
|
||||
--
|
||||
2.35.3
|
||||
|
@ -1,38 +0,0 @@
|
||||
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
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,73 +0,0 @@
|
||||
From 78d5d462c2bdac350921c114caca588c606d7c0b Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Christoph=20B=C3=B6hmwalder?=
|
||||
<christoph.boehmwalder@linbit.com>
|
||||
Date: Mon, 1 Jul 2024 17:56:08 +0200
|
||||
Subject: [PATCH 14/32] drbd: split out a drbd_discard_supported helper
|
||||
|
||||
Add a helper to check if discard is supported for a given connection /
|
||||
backing device combination.
|
||||
|
||||
Similar idea to upstream kernel commit 5eaee6e9c8f9
|
||||
("drbd: split out a drbd_discard_supported helper"), but also get rid of
|
||||
the goto.
|
||||
---
|
||||
drbd/drbd_nl.c | 29 ++++++++++++++++++-----------
|
||||
1 file changed, 18 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/drbd/drbd_nl.c b/drbd/drbd_nl.c
|
||||
index a0c3534d8996..e3f508cd0421 100644
|
||||
--- a/drbd/drbd_nl.c
|
||||
+++ b/drbd/drbd_nl.c
|
||||
@@ -2044,19 +2044,31 @@ static unsigned int drbd_max_discard_sectors(struct drbd_resource *resource)
|
||||
return s;
|
||||
}
|
||||
|
||||
-static void decide_on_discard_support(struct drbd_device *device,
|
||||
+static bool drbd_discard_supported(struct drbd_device *device,
|
||||
struct drbd_backing_dev *bdev)
|
||||
{
|
||||
- struct request_queue *q = device->rq_queue;
|
||||
- unsigned int max_discard_sectors;
|
||||
-
|
||||
if (bdev && !bdev_max_discard_sectors(bdev->backing_bdev))
|
||||
- goto not_supported;
|
||||
+ return false;
|
||||
|
||||
if (!(common_connection_features(device->resource) & DRBD_FF_TRIM)) {
|
||||
drbd_info(device,
|
||||
"peer DRBD too old, does not support TRIM: disabling discards\n");
|
||||
- goto not_supported;
|
||||
+ return false;
|
||||
+ }
|
||||
+
|
||||
+ return true;
|
||||
+}
|
||||
+
|
||||
+static void decide_on_discard_support(struct drbd_device *device,
|
||||
+ struct drbd_backing_dev *bdev)
|
||||
+{
|
||||
+ struct request_queue *q = device->rq_queue;
|
||||
+ unsigned int max_discard_sectors;
|
||||
+
|
||||
+ if (!drbd_discard_supported(device, bdev)) {
|
||||
+ blk_queue_discard_granularity(q, 0);
|
||||
+ blk_queue_max_discard_sectors(q, 0);
|
||||
+ return;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -2070,11 +2082,6 @@ static void decide_on_discard_support(struct drbd_device *device,
|
||||
blk_queue_discard_granularity(q, 512);
|
||||
max_discard_sectors = drbd_max_discard_sectors(device->resource);
|
||||
blk_queue_max_discard_sectors(q, max_discard_sectors);
|
||||
- return;
|
||||
-
|
||||
-not_supported:
|
||||
- blk_queue_discard_granularity(q, 0);
|
||||
- blk_queue_max_discard_sectors(q, 0);
|
||||
}
|
||||
|
||||
static void fixup_write_zeroes(struct drbd_device *device, struct request_queue *q)
|
||||
--
|
||||
2.35.3
|
||||
|
@ -1,202 +0,0 @@
|
||||
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
|
||||
|
@ -1,194 +0,0 @@
|
||||
From 5931286cb71114c0f34e51fc7f357dceec139ca1 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Christoph=20B=C3=B6hmwalder?=
|
||||
<christoph.boehmwalder@linbit.com>
|
||||
Date: Tue, 13 Aug 2024 12:26:02 +0200
|
||||
Subject: [PATCH 15/32] drbd: atomically update queue limits in
|
||||
drbd_reconsider_queue_parameters
|
||||
|
||||
Switch drbd_reconsider_queue_parameters to set up the queue parameters
|
||||
in an on-stack queue_limits structure and apply the limits atomically.
|
||||
Remove various helpers that have become so trivial that they can be
|
||||
folded into drbd_reconsider_queue_parameters.
|
||||
|
||||
Same idea as upstream kernel commit e6dfe748f09e ("drbd: atomically
|
||||
update queue limits in drbd_reconsider_queue_parameters"), but with some
|
||||
adaptations to DRBD 9.
|
||||
---
|
||||
drbd/drbd_nl.c | 136 ++++++++++++++++++++++---------------------------
|
||||
1 file changed, 60 insertions(+), 76 deletions(-)
|
||||
|
||||
diff --git a/drbd/drbd_nl.c b/drbd/drbd_nl.c
|
||||
index e3f508cd0421..7193ba0c77e3 100644
|
||||
--- a/drbd/drbd_nl.c
|
||||
+++ b/drbd/drbd_nl.c
|
||||
@@ -2018,11 +2018,6 @@ static u32 common_connection_features(struct drbd_resource *resource)
|
||||
return features;
|
||||
}
|
||||
|
||||
-static void blk_queue_discard_granularity(struct request_queue *q, unsigned int granularity)
|
||||
-{
|
||||
- q->limits.discard_granularity = granularity;
|
||||
-}
|
||||
-
|
||||
static unsigned int drbd_max_discard_sectors(struct drbd_resource *resource)
|
||||
{
|
||||
struct drbd_connection *connection;
|
||||
@@ -2059,73 +2054,20 @@ static bool drbd_discard_supported(struct drbd_device *device,
|
||||
return true;
|
||||
}
|
||||
|
||||
-static void decide_on_discard_support(struct drbd_device *device,
|
||||
- struct drbd_backing_dev *bdev)
|
||||
-{
|
||||
- struct request_queue *q = device->rq_queue;
|
||||
- unsigned int max_discard_sectors;
|
||||
-
|
||||
- if (!drbd_discard_supported(device, bdev)) {
|
||||
- blk_queue_discard_granularity(q, 0);
|
||||
- blk_queue_max_discard_sectors(q, 0);
|
||||
- return;
|
||||
- }
|
||||
-
|
||||
- /*
|
||||
- * We don't care for the granularity, really.
|
||||
- *
|
||||
- * Stacking limits below should fix it for the local device. Whether or
|
||||
- * not it is a suitable granularity on the remote device is not our
|
||||
- * problem, really. If you care, you need to use devices with similar
|
||||
- * topology on all peers.
|
||||
- */
|
||||
- blk_queue_discard_granularity(q, 512);
|
||||
- max_discard_sectors = drbd_max_discard_sectors(device->resource);
|
||||
- blk_queue_max_discard_sectors(q, max_discard_sectors);
|
||||
-}
|
||||
-
|
||||
-static void fixup_write_zeroes(struct drbd_device *device, struct request_queue *q)
|
||||
-{
|
||||
- /* Fixup max_write_zeroes_sectors after blk_stack_limits():
|
||||
- * if we can handle "zeroes" efficiently on the protocol,
|
||||
- * we want to do that, even if our backend does not announce
|
||||
- * max_write_zeroes_sectors itself. */
|
||||
-
|
||||
- /* If all peers announce WZEROES support, use it. Otherwise, rather
|
||||
- * send explicit zeroes than rely on some discard-zeroes-data magic. */
|
||||
- if (common_connection_features(device->resource) & DRBD_FF_WZEROES)
|
||||
- q->limits.max_write_zeroes_sectors = DRBD_MAX_BBIO_SECTORS;
|
||||
- else
|
||||
- q->limits.max_write_zeroes_sectors = 0;
|
||||
-}
|
||||
-
|
||||
-static void fixup_discard_support(struct drbd_device *device, struct request_queue *q)
|
||||
-{
|
||||
- unsigned int max_discard = device->rq_queue->limits.max_discard_sectors;
|
||||
- unsigned int discard_granularity = device->rq_queue->limits.discard_granularity >> SECTOR_SHIFT;
|
||||
-
|
||||
- if (discard_granularity > max_discard) {
|
||||
- blk_queue_discard_granularity(q, 0);
|
||||
- blk_queue_max_discard_sectors(q, 0);
|
||||
- }
|
||||
-}
|
||||
-
|
||||
-void drbd_reconsider_queue_parameters(struct drbd_device *device, struct drbd_backing_dev *bdev)
|
||||
+static void get_common_queue_limits(struct queue_limits *common_limits,
|
||||
+ struct drbd_device *device)
|
||||
{
|
||||
- struct request_queue * const q = device->rq_queue;
|
||||
- struct queue_limits common_limits = { 0 }; /* sizeof(struct queue_limits) ~ 110 bytes */
|
||||
- struct queue_limits peer_limits = { 0 };
|
||||
struct drbd_peer_device *peer_device;
|
||||
- struct request_queue *b = NULL;
|
||||
+ struct queue_limits peer_limits = { 0 };
|
||||
|
||||
- blk_set_stacking_limits(&common_limits);
|
||||
+ blk_set_stacking_limits(common_limits);
|
||||
/* This is the workaround for "bio would need to, but cannot, be split" */
|
||||
- common_limits.seg_boundary_mask = PAGE_SIZE - 1;
|
||||
- common_limits.max_hw_sectors = device->device_conf.max_bio_size >> SECTOR_SHIFT;
|
||||
- common_limits.max_sectors = device->device_conf.max_bio_size >> SECTOR_SHIFT;
|
||||
- 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;
|
||||
+ common_limits->seg_boundary_mask = PAGE_SIZE - 1;
|
||||
+ common_limits->max_hw_sectors = device->device_conf.max_bio_size >> SECTOR_SHIFT;
|
||||
+ common_limits->max_sectors = device->device_conf.max_bio_size >> SECTOR_SHIFT;
|
||||
+ 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;
|
||||
|
||||
rcu_read_lock();
|
||||
for_each_peer_device_rcu(peer_device, device) {
|
||||
@@ -2140,21 +2082,63 @@ void drbd_reconsider_queue_parameters(struct drbd_device *device, struct drbd_ba
|
||||
peer_limits.io_opt = peer_device->q_limits.io_opt;
|
||||
peer_limits.max_hw_sectors = peer_device->q_limits.max_bio_size >> SECTOR_SHIFT;
|
||||
peer_limits.max_sectors = peer_device->q_limits.max_bio_size >> SECTOR_SHIFT;
|
||||
- blk_stack_limits(&common_limits, &peer_limits, 0);
|
||||
+ blk_stack_limits(common_limits, &peer_limits, 0);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
+}
|
||||
+
|
||||
+void drbd_reconsider_queue_parameters(struct drbd_device *device, struct drbd_backing_dev *bdev)
|
||||
+{
|
||||
+ struct request_queue * const q = device->rq_queue;
|
||||
+ struct queue_limits lim;
|
||||
+ struct request_queue *b = NULL;
|
||||
+
|
||||
+ lim = queue_limits_start_update(q);
|
||||
+ get_common_queue_limits(&lim, device);
|
||||
+
|
||||
+ /*
|
||||
+ * We don't care for the granularity, really.
|
||||
+ * Stacking limits below should fix it for the local device. Whether or
|
||||
+ * not it is a suitable granularity on the remote device is not our
|
||||
+ * problem, really. If you care, you need to use devices with similar
|
||||
+ * topology on all peers.
|
||||
+ */
|
||||
+ if (drbd_discard_supported(device, bdev)) {
|
||||
+ lim.discard_granularity = 512;
|
||||
+ lim.max_hw_discard_sectors = drbd_max_discard_sectors(device->resource);
|
||||
+ } else {
|
||||
+ lim.discard_granularity = 0;
|
||||
+ lim.max_hw_discard_sectors = 0;
|
||||
+ }
|
||||
|
||||
if (bdev) {
|
||||
b = bdev->backing_bdev->bd_disk->queue;
|
||||
- blk_stack_limits(&common_limits, &b->limits, 0);
|
||||
- disk_update_readahead(device->vdisk);
|
||||
+ blk_stack_limits(&lim, &b->limits, 0);
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
+ * If we can handle "zeroes" efficiently on the protocol,
|
||||
+ * we want to do that, even if our backend does not announce
|
||||
+ * max_write_zeroes_sectors itself.
|
||||
+ */
|
||||
+ if (common_connection_features(device->resource) & DRBD_FF_WZEROES)
|
||||
+ lim.max_write_zeroes_sectors = DRBD_MAX_BBIO_SECTORS;
|
||||
+ else
|
||||
+ lim.max_write_zeroes_sectors = 0;
|
||||
+
|
||||
+ if ((lim.discard_granularity >> SECTOR_SHIFT) >
|
||||
+ lim.max_hw_discard_sectors) {
|
||||
+ /*
|
||||
+ * discard_granularity is the smallest supported unit of a
|
||||
+ * discard. If that is larger than the maximum supported discard
|
||||
+ * size, we need to disable discards altogether.
|
||||
+ */
|
||||
+ lim.discard_granularity = 0;
|
||||
+ lim.max_hw_discard_sectors = 0;
|
||||
}
|
||||
- q->limits = common_limits;
|
||||
- blk_queue_max_hw_sectors(q, common_limits.max_hw_sectors);
|
||||
- decide_on_discard_support(device, bdev);
|
||||
|
||||
- fixup_write_zeroes(device, q);
|
||||
- fixup_discard_support(device, q);
|
||||
+ if (queue_limits_commit_update(q, &lim))
|
||||
+ drbd_err(device, "setting new queue limits failed\n");
|
||||
}
|
||||
|
||||
/* Make sure IO is suspended before calling this function(). */
|
||||
--
|
||||
2.35.3
|
||||
|
@ -1,71 +0,0 @@
|
||||
From fef08ee4fac426f5dfbec124bd2bd58fbd390cb2 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Christoph=20B=C3=B6hmwalder?=
|
||||
<christoph.boehmwalder@linbit.com>
|
||||
Date: Thu, 22 Aug 2024 12:09:42 +0200
|
||||
Subject: [PATCH 16/32] compat: test and patch for queue_limits_start_update
|
||||
|
||||
---
|
||||
...ueue_limits_start_update__no_present.cocci | 20 +++++++++++++++++++
|
||||
drbd/drbd-kernel-compat/gen_patch_names.c | 3 +++
|
||||
.../tests/have_queue_limits_start_update.c | 8 ++++++++
|
||||
3 files changed, 31 insertions(+)
|
||||
create mode 100644 drbd/drbd-kernel-compat/cocci/queue_limits_start_update__no_present.cocci
|
||||
create mode 100644 drbd/drbd-kernel-compat/tests/have_queue_limits_start_update.c
|
||||
|
||||
diff --git a/drbd/drbd-kernel-compat/cocci/queue_limits_start_update__no_present.cocci b/drbd/drbd-kernel-compat/cocci/queue_limits_start_update__no_present.cocci
|
||||
new file mode 100644
|
||||
index 000000000000..4e34f5887181
|
||||
--- /dev/null
|
||||
+++ b/drbd/drbd-kernel-compat/cocci/queue_limits_start_update__no_present.cocci
|
||||
@@ -0,0 +1,20 @@
|
||||
+@@
|
||||
+identifier lim;
|
||||
+identifier q;
|
||||
+identifier device;
|
||||
+identifier bdev;
|
||||
+@@
|
||||
+void drbd_reconsider_queue_parameters(struct drbd_device *device, struct drbd_backing_dev *bdev)
|
||||
+{
|
||||
+...
|
||||
+ lim =
|
||||
+- queue_limits_start_update(q);
|
||||
++ q->limits;
|
||||
+...
|
||||
+- if (queue_limits_commit_update(q, &lim)) { ... }
|
||||
++ blk_queue_max_hw_sectors(q, lim.max_hw_sectors);
|
||||
++ q->limits = lim;
|
||||
++ if (bdev)
|
||||
++ disk_update_readahead(device->vdisk);
|
||||
+...
|
||||
+}
|
||||
diff --git a/drbd/drbd-kernel-compat/gen_patch_names.c b/drbd/drbd-kernel-compat/gen_patch_names.c
|
||||
index c21a43b39488..13aec5c8bd5f 100644
|
||||
--- a/drbd/drbd-kernel-compat/gen_patch_names.c
|
||||
+++ b/drbd/drbd-kernel-compat/gen_patch_names.c
|
||||
@@ -393,6 +393,9 @@ int main(int argc, char **argv)
|
||||
COMPAT_HAVE_WB_CONGESTED_ENUM, "present");
|
||||
#endif
|
||||
|
||||
+ patch(1, "queue_limits_start_update", true, false,
|
||||
+ COMPAT_HAVE_QUEUE_LIMITS_START_UPDATE, "present");
|
||||
+
|
||||
patch(1, "disk_update_readahead", true, false,
|
||||
COMPAT_HAVE_DISK_UPDATE_READAHEAD, "present");
|
||||
|
||||
diff --git a/drbd/drbd-kernel-compat/tests/have_queue_limits_start_update.c b/drbd/drbd-kernel-compat/tests/have_queue_limits_start_update.c
|
||||
new file mode 100644
|
||||
index 000000000000..a867d1675218
|
||||
--- /dev/null
|
||||
+++ b/drbd/drbd-kernel-compat/tests/have_queue_limits_start_update.c
|
||||
@@ -0,0 +1,8 @@
|
||||
+/* { "version": "v6.9-rc1", "commit": "d690cb8ae14bd377d422b7905b6959c7e7a45b95", "comment": "block: add an API to atomically update queue limits", "author": "Christoph Hellwig <hch@lst.de>", "date": "Tue Feb 13 08:34:14 2024 +0100" } */
|
||||
+
|
||||
+#include <linux/blkdev.h>
|
||||
+
|
||||
+static struct queue_limits foo(struct request_queue *q)
|
||||
+{
|
||||
+ return queue_limits_start_update(q);
|
||||
+}
|
||||
--
|
||||
2.35.3
|
||||
|
@ -1,33 +0,0 @@
|
||||
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
|
||||
|
@ -1,54 +0,0 @@
|
||||
From 4352ece8e85da43090be171276a0d45d83c55a00 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Christoph=20B=C3=B6hmwalder?=
|
||||
<christoph.boehmwalder@linbit.com>
|
||||
Date: Thu, 22 Aug 2024 12:25:39 +0200
|
||||
Subject: [PATCH 17/32] compat: specify which essential change was not made
|
||||
|
||||
---
|
||||
drbd/drbd-kernel-compat/cocci/bdi_congested__yes_present.cocci | 2 +-
|
||||
drbd/drbd-kernel-compat/cocci/bio_op_shift__yes_present.cocci | 2 +-
|
||||
.../cocci/blk_queue_max_write_same_sectors__yes_present.cocci | 2 +-
|
||||
3 files changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/drbd/drbd-kernel-compat/cocci/bdi_congested__yes_present.cocci b/drbd/drbd-kernel-compat/cocci/bdi_congested__yes_present.cocci
|
||||
index 8a0260321ab5..fdf6afc8355f 100644
|
||||
--- a/drbd/drbd-kernel-compat/cocci/bdi_congested__yes_present.cocci
|
||||
+++ b/drbd/drbd-kernel-compat/cocci/bdi_congested__yes_present.cocci
|
||||
@@ -21,7 +21,7 @@ struct device_statistics *s;
|
||||
@ script:python depends on !(add_bdi_read_congested_congested_remote && add_bdi_read_congested_device_to_statistics) @
|
||||
@@
|
||||
import sys
|
||||
-print('ERROR: A rule making an essential change was not executed!', file=sys.stderr)
|
||||
+print('ERROR: A rule making an essential change was not executed! (bdi_read_congested)', file=sys.stderr)
|
||||
print('ERROR: This would not show up as a compiler error, but would still break DRBD.', file=sys.stderr)
|
||||
print('ERROR: Check bdi_congested__yes_present.cocci', file=sys.stderr)
|
||||
print('ERROR: As a precaution, the build will be aborted here.', file=sys.stderr)
|
||||
diff --git a/drbd/drbd-kernel-compat/cocci/bio_op_shift__yes_present.cocci b/drbd/drbd-kernel-compat/cocci/bio_op_shift__yes_present.cocci
|
||||
index cc02f5b91c2e..3225291f7dbd 100644
|
||||
--- a/drbd/drbd-kernel-compat/cocci/bio_op_shift__yes_present.cocci
|
||||
+++ b/drbd/drbd-kernel-compat/cocci/bio_op_shift__yes_present.cocci
|
||||
@@ -57,7 +57,7 @@ combine_opf(wire_flags_to_bio_op(dpf),
|
||||
@ script:python depends on !combine_wire_flags @
|
||||
@@
|
||||
import sys
|
||||
-print('ERROR: A rule making an essential change was not executed!', file=sys.stderr)
|
||||
+print('ERROR: A rule making an essential change was not executed! (combine_opf)', file=sys.stderr)
|
||||
print('ERROR: This would not show up as a compiler error, but would still break DRBD.', file=sys.stderr)
|
||||
print('ERROR: As a precaution, the build will be aborted here.', file=sys.stderr)
|
||||
sys.exit(1)
|
||||
diff --git a/drbd/drbd-kernel-compat/cocci/blk_queue_max_write_same_sectors__yes_present.cocci b/drbd/drbd-kernel-compat/cocci/blk_queue_max_write_same_sectors__yes_present.cocci
|
||||
index 8eb4eef7dfd5..9202ee9c2dc4 100644
|
||||
--- a/drbd/drbd-kernel-compat/cocci/blk_queue_max_write_same_sectors__yes_present.cocci
|
||||
+++ b/drbd/drbd-kernel-compat/cocci/blk_queue_max_write_same_sectors__yes_present.cocci
|
||||
@@ -7,7 +7,7 @@ blk_queue_max_hw_sectors(q, ...);
|
||||
@ script:python depends on !add_blk_queue_max_write_same_sectors @
|
||||
@@
|
||||
import sys
|
||||
-print('ERROR: A rule making an essential change was not executed!', file=sys.stderr)
|
||||
+print('ERROR: A rule making an essential change was not executed! (blk_queue_max_write_same_sectors)', file=sys.stderr)
|
||||
print('ERROR: This would not show up as a compiler error, but would still break DRBD.', file=sys.stderr)
|
||||
print('ERROR: Check blk_queue_max_write_same_sectors_yes_present.cocci', file=sys.stderr)
|
||||
print('ERROR: As a precaution, the build will be aborted here.', file=sys.stderr)
|
||||
--
|
||||
2.35.3
|
||||
|
@ -1,35 +0,0 @@
|
||||
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
|
||||
|
@ -1,185 +0,0 @@
|
||||
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
|
||||
|
@ -1,57 +0,0 @@
|
||||
From b340c96d60065f08397d14360e7f045005c587e8 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Christoph=20B=C3=B6hmwalder?=
|
||||
<christoph.boehmwalder@linbit.com>
|
||||
Date: Fri, 23 Aug 2024 12:30:45 +0200
|
||||
Subject: [PATCH 18/32] gen_patch_names: reorder blk_mode_t
|
||||
|
||||
And match against bdev_file_open_by_path.
|
||||
---
|
||||
drbd/drbd-kernel-compat/cocci/blk_mode_t__no_present.cocci | 7 +------
|
||||
drbd/drbd-kernel-compat/gen_patch_names.c | 6 +++---
|
||||
2 files changed, 4 insertions(+), 9 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 d1312a093ffe..cde4430478e5 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
|
||||
@@ -22,12 +22,7 @@ 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
|
||||
-)
|
||||
+bdev_file_open_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 13aec5c8bd5f..6f62ea5827b7 100644
|
||||
--- a/drbd/drbd-kernel-compat/gen_patch_names.c
|
||||
+++ b/drbd/drbd-kernel-compat/gen_patch_names.c
|
||||
@@ -568,6 +568,9 @@ int main(int argc, char **argv)
|
||||
patch(1, "__bio_add_page", true, false,
|
||||
COMPAT_HAVE___BIO_ADD_PAGE, "present");
|
||||
|
||||
+ patch(1, "blk_mode_t", true, false,
|
||||
+ COMPAT_HAVE_BLK_MODE_T, "present");
|
||||
+
|
||||
/* blkdev_put is oldest, then bdev_open_by_path, then bdev_file_open_by_path */
|
||||
patch(1, "bdev_file_open_by_path", true, false,
|
||||
COMPAT_HAVE_BDEV_FILE_OPEN_BY_PATH, "present");
|
||||
@@ -590,9 +593,6 @@ 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");
|
||||
-
|
||||
patch(1, "genl_info_userhdr", true, false,
|
||||
COMPAT_HAVE_GENL_INFO_USERHDR, "present");
|
||||
|
||||
--
|
||||
2.35.3
|
||||
|
@ -1,107 +0,0 @@
|
||||
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
|
||||
|
@ -1,38 +0,0 @@
|
||||
From 37edd6c75cccba9b151e8b834c83832ae0382484 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Christoph=20B=C3=B6hmwalder?=
|
||||
<christoph.boehmwalder@linbit.com>
|
||||
Date: Thu, 29 Aug 2024 13:27:31 +0200
|
||||
Subject: [PATCH 19/32] compat: fix blk_queue_update_readahead patch
|
||||
|
||||
Did not match anymore
|
||||
---
|
||||
.../cocci/blk_queue_update_readahead__no_present.cocci | 9 ++++++---
|
||||
1 file changed, 6 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/drbd/drbd-kernel-compat/cocci/blk_queue_update_readahead__no_present.cocci b/drbd/drbd-kernel-compat/cocci/blk_queue_update_readahead__no_present.cocci
|
||||
index ed62a3426ad6..2e78f626261d 100644
|
||||
--- a/drbd/drbd-kernel-compat/cocci/blk_queue_update_readahead__no_present.cocci
|
||||
+++ b/drbd/drbd-kernel-compat/cocci/blk_queue_update_readahead__no_present.cocci
|
||||
@@ -1,8 +1,10 @@
|
||||
@@
|
||||
-expression e;
|
||||
-struct request_queue *q, b;
|
||||
+identifier q, b;
|
||||
@@
|
||||
-blk_stack_limits(e, &b->limits, 0);
|
||||
+struct request_queue *q;
|
||||
+...
|
||||
+struct request_queue *b;
|
||||
+<...
|
||||
- blk_queue_update_readahead(q);
|
||||
+ if (q->backing_dev_info->ra_pages !=
|
||||
+ b->backing_dev_info->ra_pages) {
|
||||
@@ -12,3 +14,4 @@ blk_stack_limits(e, &b->limits, 0);
|
||||
+ q->backing_dev_info->ra_pages =
|
||||
+ b->backing_dev_info->ra_pages;
|
||||
+ }
|
||||
+...>
|
||||
\ No newline at end of file
|
||||
--
|
||||
2.35.3
|
||||
|
@ -1,57 +0,0 @@
|
||||
From f2a779276e7b0918c8592da8254a044c291f1778 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Christoph=20B=C3=B6hmwalder?=
|
||||
<christoph.boehmwalder@linbit.com>
|
||||
Date: Thu, 29 Aug 2024 16:15:27 +0200
|
||||
Subject: [PATCH 20/32] compat: test and patch for
|
||||
que_limits->max_hw_discard_sectors
|
||||
|
||||
---
|
||||
.../queue_limits__no_has_max_hw_discard_sectors.cocci | 5 +++++
|
||||
drbd/drbd-kernel-compat/gen_patch_names.c | 3 +++
|
||||
.../tests/queue_limits_has_max_hw_discard_sectors.c | 8 ++++++++
|
||||
3 files changed, 16 insertions(+)
|
||||
create mode 100644 drbd/drbd-kernel-compat/cocci/queue_limits__no_has_max_hw_discard_sectors.cocci
|
||||
create mode 100644 drbd/drbd-kernel-compat/tests/queue_limits_has_max_hw_discard_sectors.c
|
||||
|
||||
diff --git a/drbd/drbd-kernel-compat/cocci/queue_limits__no_has_max_hw_discard_sectors.cocci b/drbd/drbd-kernel-compat/cocci/queue_limits__no_has_max_hw_discard_sectors.cocci
|
||||
new file mode 100644
|
||||
index 000000000000..bf96b80a003d
|
||||
--- /dev/null
|
||||
+++ b/drbd/drbd-kernel-compat/cocci/queue_limits__no_has_max_hw_discard_sectors.cocci
|
||||
@@ -0,0 +1,5 @@
|
||||
+@@
|
||||
+struct queue_limits lim;
|
||||
+@@
|
||||
+- lim.max_hw_discard_sectors
|
||||
++ lim.max_discard_sectors
|
||||
diff --git a/drbd/drbd-kernel-compat/gen_patch_names.c b/drbd/drbd-kernel-compat/gen_patch_names.c
|
||||
index 6f62ea5827b7..5abc32725daf 100644
|
||||
--- a/drbd/drbd-kernel-compat/gen_patch_names.c
|
||||
+++ b/drbd/drbd-kernel-compat/gen_patch_names.c
|
||||
@@ -296,6 +296,9 @@ int main(int argc, char **argv)
|
||||
patch(1, "write_zeroes", true, false,
|
||||
COMPAT_HAVE_REQ_OP_WRITE_ZEROES, "capable");
|
||||
|
||||
+ patch(1, "queue_limits", true, false,
|
||||
+ COMPAT_QUEUE_LIMITS_HAS_MAX_HW_DISCARD_SECTORS, "has_max_hw_discard_sectors");
|
||||
+
|
||||
patch(1, "bio_bi_opf", true, false,
|
||||
COMPAT_HAVE_BIO_BI_OPF, "present");
|
||||
|
||||
diff --git a/drbd/drbd-kernel-compat/tests/queue_limits_has_max_hw_discard_sectors.c b/drbd/drbd-kernel-compat/tests/queue_limits_has_max_hw_discard_sectors.c
|
||||
new file mode 100644
|
||||
index 000000000000..5dcf9c48667b
|
||||
--- /dev/null
|
||||
+++ b/drbd/drbd-kernel-compat/tests/queue_limits_has_max_hw_discard_sectors.c
|
||||
@@ -0,0 +1,8 @@
|
||||
+/* { "version": "v6.9-rc1", "commit": "4f563a64732dabb2677c7d1232a8f714a18b41b3", "comment": "lim.max_hw_discard_sectors was added", "author": "Christoph Hellwig <hch@lst.de>", "date": "Tue Feb 13 08:34:16 2024 +0100" } */
|
||||
+
|
||||
+#include <linux/blkdev.h>
|
||||
+
|
||||
+int foo(struct queue_limits *lim)
|
||||
+{
|
||||
+ return lim->max_hw_discard_sectors;
|
||||
+}
|
||||
--
|
||||
2.35.3
|
||||
|
@ -1,66 +0,0 @@
|
||||
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
|
||||
|
@ -1,26 +0,0 @@
|
||||
From 4578726d3b0e5b7c699659c1ecd26194060e7be7 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Christoph=20B=C3=B6hmwalder?=
|
||||
<christoph.boehmwalder@linbit.com>
|
||||
Date: Thu, 29 Aug 2024 16:15:47 +0200
|
||||
Subject: [PATCH 21/32] compat: fixup write_zeroes__no_capable
|
||||
|
||||
We now access the field directly instead of using this helper
|
||||
---
|
||||
drbd/drbd-kernel-compat/cocci/write_zeroes__no_capable.cocci | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drbd/drbd-kernel-compat/cocci/write_zeroes__no_capable.cocci b/drbd/drbd-kernel-compat/cocci/write_zeroes__no_capable.cocci
|
||||
index 4fa6d9e249d7..2b060e2abd16 100644
|
||||
--- a/drbd/drbd-kernel-compat/cocci/write_zeroes__no_capable.cocci
|
||||
+++ b/drbd/drbd-kernel-compat/cocci/write_zeroes__no_capable.cocci
|
||||
@@ -30,5 +30,6 @@ expression e;
|
||||
+WARN_ON_ONCE(e); /* WRITE_ZEROES not supported on this kernel */
|
||||
|
||||
@@
|
||||
+struct queue_limits lim;
|
||||
@@
|
||||
-- blk_queue_max_write_zeroes_sectors(...);
|
||||
+- lim.max_write_zeroes_sectors = ...;
|
||||
--
|
||||
2.35.3
|
||||
|
@ -1,107 +0,0 @@
|
||||
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
|
||||
|
@ -1,183 +0,0 @@
|
||||
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
|
||||
|
@ -1,77 +0,0 @@
|
||||
From ce06250eb289e98bf97940104c92751282704783 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Christoph=20B=C3=B6hmwalder?=
|
||||
<christoph.boehmwalder@linbit.com>
|
||||
Date: Wed, 4 Sep 2024 19:05:06 +0200
|
||||
Subject: [PATCH 22/32] compat: fixup queue_flag_discard__yes_present
|
||||
|
||||
blk_queue_discard_granularity does not exist anymore, just use the field
|
||||
in queue_limits.
|
||||
Match directly do drbd_reconsider_queue_parameters instead of trying to
|
||||
guess the right function.
|
||||
---
|
||||
.../queue_flag_discard__yes_present.cocci | 30 ++++++-------------
|
||||
1 file changed, 9 insertions(+), 21 deletions(-)
|
||||
|
||||
diff --git a/drbd/drbd-kernel-compat/cocci/queue_flag_discard__yes_present.cocci b/drbd/drbd-kernel-compat/cocci/queue_flag_discard__yes_present.cocci
|
||||
index cc28c3d02d82..e0ecc697b10a 100644
|
||||
--- a/drbd/drbd-kernel-compat/cocci/queue_flag_discard__yes_present.cocci
|
||||
+++ b/drbd/drbd-kernel-compat/cocci/queue_flag_discard__yes_present.cocci
|
||||
@@ -1,27 +1,19 @@
|
||||
@@
|
||||
-struct request_queue *q;
|
||||
-@@
|
||||
-(
|
||||
-q->limits.max_discard_sectors = 0;
|
||||
-+ blk_queue_flag_clear(QUEUE_FLAG_DISCARD, q);
|
||||
-|
|
||||
-q->limits.max_discard_sectors = ...;
|
||||
-+ blk_queue_flag_set(QUEUE_FLAG_DISCARD, q);
|
||||
-)
|
||||
-
|
||||
-@@
|
||||
-struct request_queue *q;
|
||||
+struct queue_limits lim;
|
||||
+identifier q;
|
||||
@@
|
||||
+struct request_queue *q = device->rq_queue;
|
||||
+...
|
||||
(
|
||||
-blk_queue_discard_granularity(q, 0);
|
||||
+lim.max_hw_discard_sectors = 0;
|
||||
+ blk_queue_flag_clear(QUEUE_FLAG_DISCARD, q);
|
||||
|
|
||||
-blk_queue_discard_granularity(q, 512);
|
||||
+lim.max_hw_discard_sectors = ...;
|
||||
+ blk_queue_flag_set(QUEUE_FLAG_DISCARD, q);
|
||||
)
|
||||
|
||||
@@
|
||||
-identifier q, device, fn;
|
||||
+identifier q, device;
|
||||
@@
|
||||
+static void fixup_discard_if_not_supported(struct request_queue *q)
|
||||
+{
|
||||
@@ -31,18 +23,14 @@ identifier q, device, fn;
|
||||
+ * */
|
||||
+ if (!blk_queue_discard(q)) {
|
||||
+ blk_queue_max_discard_sectors(q, 0);
|
||||
-+ blk_queue_discard_granularity(q, 0);
|
||||
++ q->limits.discard_granularity = 0;
|
||||
+ }
|
||||
+}
|
||||
|
||||
-fn (struct drbd_device *device, ...)
|
||||
+void drbd_reconsider_queue_parameters(struct drbd_device *device, ...)
|
||||
{
|
||||
...
|
||||
struct request_queue *q = device->rq_queue;
|
||||
...
|
||||
-decide_on_discard_support(...);
|
||||
-<+...
|
||||
-blk_stack_limits(...);
|
||||
-...+>
|
||||
+ fixup_discard_if_not_supported(q);
|
||||
}
|
||||
--
|
||||
2.35.3
|
||||
|
@ -1,96 +0,0 @@
|
||||
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
|
||||
|
@ -1,53 +0,0 @@
|
||||
From ac4e2f85066d2da306ec0e3fed8db4e945be6f6d Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Christoph=20B=C3=B6hmwalder?=
|
||||
<christoph.boehmwalder@linbit.com>
|
||||
Date: Thu, 5 Sep 2024 13:03:07 +0200
|
||||
Subject: [PATCH 23/32] drbd: move flags to queue_limits
|
||||
|
||||
Roughly equivalent to the following commits from upstream Linux:
|
||||
|
||||
1122c0c1 block: move cache control settings out of queue->flags
|
||||
bd4a633b block: move the nonrot flag to queue_limits
|
||||
1a02f3a7 block: move the stable_writes flag to queue_limits
|
||||
---
|
||||
drbd/drbd_main.c | 10 ++++++----
|
||||
1 file changed, 6 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/drbd/drbd_main.c b/drbd/drbd_main.c
|
||||
index 2792b9896271..407b0a1d1773 100644
|
||||
--- a/drbd/drbd_main.c
|
||||
+++ b/drbd/drbd_main.c
|
||||
@@ -3886,6 +3886,11 @@ enum drbd_ret_code drbd_create_device(struct drbd_config_context *adm_ctx, unsig
|
||||
int vnr = adm_ctx->volume;
|
||||
enum drbd_ret_code err = ERR_NOMEM;
|
||||
bool locked = false;
|
||||
+ struct queue_limits lim = {
|
||||
+ .features = BLK_FEAT_WRITE_CACHE | BLK_FEAT_FUA |
|
||||
+ BLK_FEAT_ROTATIONAL |
|
||||
+ BLK_FEAT_STABLE_WRITES,
|
||||
+ };
|
||||
|
||||
lockdep_assert_held(&resource->conf_update);
|
||||
|
||||
@@ -3948,7 +3953,7 @@ enum drbd_ret_code drbd_create_device(struct drbd_config_context *adm_ctx, unsig
|
||||
|
||||
init_rwsem(&device->uuid_sem);
|
||||
|
||||
- disk = blk_alloc_disk(NULL, NUMA_NO_NODE);
|
||||
+ disk = blk_alloc_disk(&lim, NUMA_NO_NODE);
|
||||
if (IS_ERR(disk)) {
|
||||
err = PTR_ERR(disk);
|
||||
goto out_no_disk;
|
||||
@@ -3967,9 +3972,6 @@ enum drbd_ret_code drbd_create_device(struct drbd_config_context *adm_ctx, unsig
|
||||
sprintf(disk->disk_name, "drbd%d", minor);
|
||||
disk->private_data = device;
|
||||
|
||||
- blk_queue_flag_set(QUEUE_FLAG_STABLE_WRITES, disk->queue);
|
||||
- blk_queue_write_cache(disk->queue, true, true);
|
||||
-
|
||||
device->md_io.page = alloc_page(GFP_KERNEL);
|
||||
if (!device->md_io.page)
|
||||
goto out_no_io_page;
|
||||
--
|
||||
2.35.3
|
||||
|
@ -1,75 +0,0 @@
|
||||
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
|
||||
|
@ -1,191 +0,0 @@
|
||||
From 3c18af1a3e8d67833e3ea8a2d38408501c9ee6be Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Christoph=20B=C3=B6hmwalder?=
|
||||
<christoph.boehmwalder@linbit.com>
|
||||
Date: Thu, 5 Sep 2024 13:05:59 +0200
|
||||
Subject: [PATCH 24/32] compat: test and patch for queue_limits.features
|
||||
|
||||
And fixup compat patches that rely on blk_queue_write_cache being there.
|
||||
Match to disk->private_data = ... instead.
|
||||
---
|
||||
.../blk_queue_make_request__yes_present.cocci | 3 ++-
|
||||
.../blk_queue_merge_bvec__yes_present.cocci | 21 +++++++++++-----
|
||||
.../cocci/congested_fn__yes_present.cocci | 3 ++-
|
||||
.../queue_limits_features__no_present.cocci | 25 +++++++++++++++++++
|
||||
drbd/drbd-kernel-compat/gen_patch_names.c | 15 ++++++-----
|
||||
.../tests/queue_limits_has_features.c | 8 ++++++
|
||||
6 files changed, 61 insertions(+), 14 deletions(-)
|
||||
create mode 100644 drbd/drbd-kernel-compat/cocci/queue_limits_features__no_present.cocci
|
||||
create mode 100644 drbd/drbd-kernel-compat/tests/queue_limits_has_features.c
|
||||
|
||||
diff --git a/drbd/drbd-kernel-compat/cocci/blk_queue_make_request__yes_present.cocci b/drbd/drbd-kernel-compat/cocci/blk_queue_make_request__yes_present.cocci
|
||||
index 63c65d21cb32..665e10cbaa1a 100644
|
||||
--- a/drbd/drbd-kernel-compat/cocci/blk_queue_make_request__yes_present.cocci
|
||||
+++ b/drbd/drbd-kernel-compat/cocci/blk_queue_make_request__yes_present.cocci
|
||||
@@ -5,12 +5,13 @@ identifier make_request_fn;
|
||||
+ blk_alloc_queue(GFP_KERNEL)
|
||||
|
||||
@@
|
||||
+struct gendisk *disk;
|
||||
identifier rm_blk_alloc_queue.make_request_fn;
|
||||
@@
|
||||
drbd_create_device(...)
|
||||
{
|
||||
...
|
||||
+ disk->private_data = ...;
|
||||
+ blk_queue_make_request(q, make_request_fn);
|
||||
- blk_queue_write_cache(...);
|
||||
...
|
||||
}
|
||||
diff --git a/drbd/drbd-kernel-compat/cocci/blk_queue_merge_bvec__yes_present.cocci b/drbd/drbd-kernel-compat/cocci/blk_queue_merge_bvec__yes_present.cocci
|
||||
index d4c0d85810e8..bedb09f8b375 100644
|
||||
--- a/drbd/drbd-kernel-compat/cocci/blk_queue_merge_bvec__yes_present.cocci
|
||||
+++ b/drbd/drbd-kernel-compat/cocci/blk_queue_merge_bvec__yes_present.cocci
|
||||
@@ -1,10 +1,10 @@
|
||||
-@@
|
||||
+@ add_drbd_merge_bvec_definition @
|
||||
identifier ws;
|
||||
@@
|
||||
+extern int drbd_merge_bvec(struct request_queue *, struct bvec_merge_data *, struct bio_vec *);
|
||||
extern void do_submit(struct work_struct *ws);
|
||||
|
||||
-@@
|
||||
+@ add_drbd_merge_bvec @
|
||||
@@
|
||||
+/* This is called by bio_add_page().
|
||||
+ *
|
||||
@@ -44,9 +44,10 @@ extern void do_submit(struct work_struct *ws);
|
||||
do_submit(...)
|
||||
{ ... }
|
||||
|
||||
-@@
|
||||
+@ add_blk_queue_merge_bvec @
|
||||
symbol true;
|
||||
identifier q, resource, dev;
|
||||
+struct gendisk *disk;
|
||||
@@
|
||||
drbd_create_device(...)
|
||||
{
|
||||
@@ -68,9 +69,17 @@ struct request_queue *q;
|
||||
// also want to store it in queuedata for the compat.
|
||||
dev->rq_queue = q;
|
||||
+ q->queuedata = dev;
|
||||
-<...
|
||||
-blk_queue_write_cache(q, true, true);
|
||||
+...
|
||||
+disk->private_data = ...;
|
||||
+ blk_queue_merge_bvec(q, drbd_merge_bvec);
|
||||
-...>
|
||||
+...
|
||||
}
|
||||
|
||||
+@ script:python depends on !(add_drbd_merge_bvec_definition && add_drbd_merge_bvec && add_blk_queue_merge_bvec) @
|
||||
+@@
|
||||
+import sys
|
||||
+print('ERROR: A rule making an essential change was not executed! (blk_queue_merge_bvec)', file=sys.stderr)
|
||||
+print('ERROR: This would not show up as a compiler error, but would still break DRBD.', file=sys.stderr)
|
||||
+print('ERROR: As a precaution, the build will be aborted here.', file=sys.stderr)
|
||||
+sys.exit(1)
|
||||
+
|
||||
diff --git a/drbd/drbd-kernel-compat/cocci/congested_fn__yes_present.cocci b/drbd/drbd-kernel-compat/cocci/congested_fn__yes_present.cocci
|
||||
index d0b55c3dffbf..a697311af6bd 100644
|
||||
--- a/drbd/drbd-kernel-compat/cocci/congested_fn__yes_present.cocci
|
||||
+++ b/drbd/drbd-kernel-compat/cocci/congested_fn__yes_present.cocci
|
||||
@@ -63,14 +63,15 @@ drbd_cleanup(...)
|
||||
|
||||
@@
|
||||
identifier dev;
|
||||
+struct gendisk *disk;
|
||||
@@
|
||||
drbd_create_device(...)
|
||||
{
|
||||
...
|
||||
struct drbd_device *dev;
|
||||
...
|
||||
+ disk->private_data = ...;
|
||||
+ q->backing_dev_info->congested_fn = drbd_congested;
|
||||
+ q->backing_dev_info->congested_data = dev;
|
||||
- blk_queue_write_cache(...);
|
||||
...
|
||||
}
|
||||
diff --git a/drbd/drbd-kernel-compat/cocci/queue_limits_features__no_present.cocci b/drbd/drbd-kernel-compat/cocci/queue_limits_features__no_present.cocci
|
||||
new file mode 100644
|
||||
index 000000000000..b9017351302b
|
||||
--- /dev/null
|
||||
+++ b/drbd/drbd-kernel-compat/cocci/queue_limits_features__no_present.cocci
|
||||
@@ -0,0 +1,25 @@
|
||||
+// NOTE this actually encompasses three patches:
|
||||
+// 1122c0c1 block: move cache control settings out of queue->flags
|
||||
+// bd4a633b block: move the nonrot flag to queue_limits
|
||||
+// 1a02f3a7 block: move the stable_writes flag to queue_limits
|
||||
+//
|
||||
+// They add "BLK_FEAT_WRITE_CACHE | BLK_FEAT_FUA", "BLK_FEAT_ROTATIONAL", and
|
||||
+// "BLK_FEAT_STABLE_WRITES", respectively.
|
||||
+// Since these commits are all from the same series, just patch them together.
|
||||
+@@
|
||||
+expression e;
|
||||
+struct gendisk *disk;
|
||||
+identifier lim;
|
||||
+@@
|
||||
+-struct queue_limits lim = {
|
||||
+- .features = e,
|
||||
+-};
|
||||
+...
|
||||
+blk_alloc_disk(
|
||||
+- &lim
|
||||
++ NULL
|
||||
+ , ...)
|
||||
+...
|
||||
+disk->private_data = ...;
|
||||
++ blk_queue_flag_set(QUEUE_FLAG_STABLE_WRITES, disk->queue);
|
||||
++ blk_queue_write_cache(disk->queue, true, true);
|
||||
diff --git a/drbd/drbd-kernel-compat/gen_patch_names.c b/drbd/drbd-kernel-compat/gen_patch_names.c
|
||||
index 5abc32725daf..cc3bad2d84e4 100644
|
||||
--- a/drbd/drbd-kernel-compat/gen_patch_names.c
|
||||
+++ b/drbd/drbd-kernel-compat/gen_patch_names.c
|
||||
@@ -153,6 +153,9 @@ int main(int argc, char **argv)
|
||||
patch(1, "blk_cleanup_disk", false, true,
|
||||
COMPAT_HAVE_BLK_CLEANUP_DISK, "present");
|
||||
|
||||
+ patch(1, "queue_limits_features", true, false,
|
||||
+ COMPAT_QUEUE_LIMITS_HAS_FEATURES, "present");
|
||||
+
|
||||
patch(1, "blk_alloc_disk", true, false,
|
||||
COMPAT_BLK_ALLOC_DISK_TAKES_QUEUE_LIMITS, "takes_queue_limits");
|
||||
#if !defined(COMPAT_BLK_ALLOC_DISK_TAKES_QUEUE_LIMITS)
|
||||
@@ -267,13 +270,13 @@ int main(int argc, char **argv)
|
||||
patch(1, "security_netlink_recv", false, true,
|
||||
COMPAT_HAVE_SECURITY_NETLINK_RECV, "present");
|
||||
|
||||
-#if defined(COMPAT_HAVE_QUEUE_FLAG_STABLE_WRITES)
|
||||
- /* in versions >=5.9, there is QUEUE_FLAG_STABLE_WRITES */
|
||||
-#else
|
||||
- /* for <5.9 but >=3.9, fall back to BDI_CAP_STABLE_WRITES */
|
||||
+ /*
|
||||
+ * >= 6.10: BLK_FEAT_STABLE_WRITES
|
||||
+ * 5.9-6.10: QUEUE_FLAG_STABLE_WRITES
|
||||
+ * <5.9: BDI_CAP_STABLE_WRITES
|
||||
+ */
|
||||
patch(1, "queue_flag_stable_writes", true, false,
|
||||
- NO, "present");
|
||||
-#endif
|
||||
+ COMPAT_HAVE_QUEUE_FLAG_STABLE_WRITES, "present");
|
||||
|
||||
patch(1, "queue_flag_discard", false, true,
|
||||
COMPAT_HAVE_QUEUE_FLAG_DISCARD, "present");
|
||||
diff --git a/drbd/drbd-kernel-compat/tests/queue_limits_has_features.c b/drbd/drbd-kernel-compat/tests/queue_limits_has_features.c
|
||||
new file mode 100644
|
||||
index 000000000000..e566a34bdda6
|
||||
--- /dev/null
|
||||
+++ b/drbd/drbd-kernel-compat/tests/queue_limits_has_features.c
|
||||
@@ -0,0 +1,8 @@
|
||||
+/* { "version": "v6.10", "commit": "1122c0c1cc71f740fa4d5f14f239194e06a1d5e7", "comment": "features field was introduced", "author": "Christoph Hellwig <hch@lst.de>", "date": "Mon Jun 17 08:04:40 2024 +0200" } */
|
||||
+
|
||||
+#include <linux/blkdev.h>
|
||||
+
|
||||
+unsigned int foo(struct queue_limits lim)
|
||||
+{
|
||||
+ return lim.features;
|
||||
+}
|
||||
--
|
||||
2.35.3
|
||||
|
@ -1,379 +0,0 @@
|
||||
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
|
||||
|
@ -1,47 +0,0 @@
|
||||
From 85afbf893a6c7cd55e04407731e52d495b6f228f Mon Sep 17 00:00:00 2001
|
||||
From: Kees Cook <keescook@chromium.org>
|
||||
Date: Fri, 15 Sep 2023 13:03:16 -0700
|
||||
Subject: [PATCH 25/32] drbd: Annotate struct fifo_buffer with __counted_by
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Prepare for the coming implementation by GCC and Clang of the __counted_by
|
||||
attribute. Flexible array members annotated with __counted_by can have
|
||||
their accesses bounds-checked at run-time checking via CONFIG_UBSAN_BOUNDS
|
||||
(for array indexing) and CONFIG_FORTIFY_SOURCE (for strcpy/memcpy-family
|
||||
functions).
|
||||
|
||||
As found with Coccinelle[1], add __counted_by for struct fifo_buffer.
|
||||
|
||||
[1] https://github.com/kees/kernel-tools/blob/trunk/coccinelle/examples/counted_by.cocci
|
||||
|
||||
Cc: Philipp Reisner <philipp.reisner@linbit.com>
|
||||
Cc: Lars Ellenberg <lars.ellenberg@linbit.com>
|
||||
Cc: Christoph Böhmwalder <christoph.boehmwalder@linbit.com>
|
||||
Cc: Jens Axboe <axboe@kernel.dk>
|
||||
Cc: drbd-dev@lists.linbit.com
|
||||
Cc: linux-block@vger.kernel.org
|
||||
Reviewed-by: "Gustavo A. R. Silva" <gustavoars@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20230915200316.never.707-kees@kernel.org
|
||||
Signed-off-by: Kees Cook <keescook@chromium.org>
|
||||
---
|
||||
drbd/drbd_int.h | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drbd/drbd_int.h b/drbd/drbd_int.h
|
||||
index c18407899f59..182593257c6a 100644
|
||||
--- a/drbd/drbd_int.h
|
||||
+++ b/drbd/drbd_int.h
|
||||
@@ -746,7 +746,7 @@ struct fifo_buffer {
|
||||
unsigned int head_index;
|
||||
unsigned int size;
|
||||
int total; /* sum of all values */
|
||||
- int values[];
|
||||
+ int values[] __counted_by(size);
|
||||
};
|
||||
extern struct fifo_buffer *fifo_alloc(unsigned int fifo_size);
|
||||
|
||||
--
|
||||
2.35.3
|
||||
|
@ -1,41 +0,0 @@
|
||||
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
|
||||
|
@ -1,94 +0,0 @@
|
||||
From 3a1d6d3e2bd0e1506995e316b183cef8abc0034b Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Christoph=20B=C3=B6hmwalder?=
|
||||
<christoph.boehmwalder@linbit.com>
|
||||
Date: Fri, 6 Sep 2024 11:14:43 +0200
|
||||
Subject: [PATCH 26/32] compat: test and patch for __counted_by
|
||||
|
||||
Unfortunately, the "attribute name" variable type only works with very
|
||||
recent coccinelle versions (>=1.1.1). So add a hint about that in the
|
||||
README.
|
||||
---
|
||||
README.md | 9 ++++-----
|
||||
.../cocci/counted_by__no_present.cocci | 12 ++++++++++++
|
||||
drbd/drbd-kernel-compat/gen_patch_names.c | 3 +++
|
||||
drbd/drbd-kernel-compat/tests/have_counted_by.c | 8 ++++++++
|
||||
4 files changed, 27 insertions(+), 5 deletions(-)
|
||||
create mode 100644 drbd/drbd-kernel-compat/cocci/counted_by__no_present.cocci
|
||||
create mode 100644 drbd/drbd-kernel-compat/tests/have_counted_by.c
|
||||
|
||||
diff --git a/README.md b/README.md
|
||||
index ec513d19438e..b63286db0113 100644
|
||||
--- a/README.md
|
||||
+++ b/README.md
|
||||
@@ -38,7 +38,7 @@ Since version 9.0.20, DRBD has been using a kernel backwards compatibility syste
|
||||
based on [Coccinelle](https://github.com/coccinelle/coccinelle) semantic patches.
|
||||
While this has many advantages, it also makes it a little harder for "casual"
|
||||
developers to build DRBD from the git sources. The problem is that we require a
|
||||
-very recent version of `spatch` (at least 1.0.8 at time of writing), and most
|
||||
+very recent version of `spatch` (at least 1.1.1 at time of writing), and most
|
||||
distributions only have relatively old versions in their repositories.
|
||||
|
||||
## From git
|
||||
@@ -48,10 +48,9 @@ For users wishing to build DRBD from its git sources, here are a few options:
|
||||
chances are you won't even have to use any of the compat features, which
|
||||
means you won't require compatibility patches and in turn don't need spatch
|
||||
installed.
|
||||
-2. On Ubuntu 18.04 and newer, use a recent spatch version from the
|
||||
- [Coccinelle PPA](https://launchpad.net/~npalix/+archive/ubuntu/coccinelle).
|
||||
- This provides (at time of writing) version 1.0.8, which is recent enough to
|
||||
- build DRBD.
|
||||
+2. Fedora >=39 packages Coccinelle 1.1.1, which is recent enough to build DRBD. **Warning**: while
|
||||
+ Ubuntu also ships Coccinelle with supposedly the same version number (1.1.1), this version
|
||||
+ is *not* able to build DRBD.
|
||||
3. Build and install spatch from source. This will also give you a version that
|
||||
is recent enough to build DRBD.
|
||||
|
||||
diff --git a/drbd/drbd-kernel-compat/cocci/counted_by__no_present.cocci b/drbd/drbd-kernel-compat/cocci/counted_by__no_present.cocci
|
||||
new file mode 100644
|
||||
index 000000000000..40db31bece0c
|
||||
--- /dev/null
|
||||
+++ b/drbd/drbd-kernel-compat/cocci/counted_by__no_present.cocci
|
||||
@@ -0,0 +1,12 @@
|
||||
+@@
|
||||
+type T;
|
||||
+identifier s, x;
|
||||
+attribute name __counted_by;
|
||||
+@@
|
||||
+struct s {
|
||||
+...
|
||||
+ T x
|
||||
+- __counted_by(...)
|
||||
+ ;
|
||||
+...
|
||||
+};
|
||||
diff --git a/drbd/drbd-kernel-compat/gen_patch_names.c b/drbd/drbd-kernel-compat/gen_patch_names.c
|
||||
index cc3bad2d84e4..72c1e25512ea 100644
|
||||
--- a/drbd/drbd-kernel-compat/gen_patch_names.c
|
||||
+++ b/drbd/drbd-kernel-compat/gen_patch_names.c
|
||||
@@ -605,6 +605,9 @@ int main(int argc, char **argv)
|
||||
patch(1, "need_recalc_sigpending", false, true,
|
||||
COMPAT_NEED_RECALC_SIGPENDING, "need");
|
||||
|
||||
+ patch(1, "counted_by", true, false,
|
||||
+ COMPAT_HAVE_COUNTED_BY, "present");
|
||||
+
|
||||
/* #define BLKDEV_ISSUE_ZEROOUT_EXPORTED */
|
||||
/* #define BLKDEV_ZERO_NOUNMAP */
|
||||
|
||||
diff --git a/drbd/drbd-kernel-compat/tests/have_counted_by.c b/drbd/drbd-kernel-compat/tests/have_counted_by.c
|
||||
new file mode 100644
|
||||
index 000000000000..07fac32aad16
|
||||
--- /dev/null
|
||||
+++ b/drbd/drbd-kernel-compat/tests/have_counted_by.c
|
||||
@@ -0,0 +1,8 @@
|
||||
+/* { "version": "v6.4", "commit": "dd06e72e68bcb4070ef211be100d2896e236c8fb", "comment": "add __counted_by macro", "author": "Kees Cook <keescook@chromium.org>", "date": "Wed May 17 12:08:44 2023 -0700" } */
|
||||
+
|
||||
+#include <linux/compiler_attributes.h>
|
||||
+
|
||||
+struct foo {
|
||||
+ int a;
|
||||
+ int b[] __counted_by(a);
|
||||
+};
|
||||
--
|
||||
2.35.3
|
||||
|
@ -1,100 +0,0 @@
|
||||
From fa5329fb2c7e089cbe712acecb2c75ba8887754e Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Christoph=20B=C3=B6hmwalder?=
|
||||
<christoph.boehmwalder@linbit.com>
|
||||
Date: Fri, 6 Sep 2024 15:16:49 +0200
|
||||
Subject: [PATCH 27/32] drbd: fix function cast warnings in state machine
|
||||
|
||||
Equivalent to upstream commit fe0b1e9a ("drbd: fix function cast
|
||||
warnings in state machine").
|
||||
---
|
||||
drbd/drbd_state.c | 16 ++++++++++------
|
||||
drbd/drbd_state_change.h | 8 ++++----
|
||||
2 files changed, 14 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/drbd/drbd_state.c b/drbd/drbd_state.c
|
||||
index 44f55ee5c939..100e32ba037f 100644
|
||||
--- a/drbd/drbd_state.c
|
||||
+++ b/drbd/drbd_state.c
|
||||
@@ -3212,10 +3212,11 @@ static union drbd_state state_change_word(struct drbd_state_change *state_change
|
||||
|
||||
int notify_resource_state_change(struct sk_buff *skb,
|
||||
unsigned int seq,
|
||||
- struct drbd_state_change *state_change,
|
||||
+ void *state_change,
|
||||
enum drbd_notification_type type)
|
||||
{
|
||||
- struct drbd_resource_state_change *resource_state_change = state_change->resource;
|
||||
+ struct drbd_resource_state_change *resource_state_change =
|
||||
+ ((struct drbd_state_change *)state_change)->resource;
|
||||
struct drbd_resource *resource = resource_state_change->resource;
|
||||
struct resource_info resource_info = {
|
||||
.res_role = resource_state_change->role[NEW],
|
||||
@@ -3232,9 +3233,10 @@ int notify_resource_state_change(struct sk_buff *skb,
|
||||
|
||||
int notify_connection_state_change(struct sk_buff *skb,
|
||||
unsigned int seq,
|
||||
- struct drbd_connection_state_change *connection_state_change,
|
||||
+ void *state_change,
|
||||
enum drbd_notification_type type)
|
||||
{
|
||||
+ struct drbd_connection_state_change *connection_state_change = state_change;
|
||||
struct drbd_connection *connection = connection_state_change->connection;
|
||||
struct connection_info connection_info = {
|
||||
.conn_connection_state = connection_state_change->cstate[NEW],
|
||||
@@ -3246,9 +3248,10 @@ int notify_connection_state_change(struct sk_buff *skb,
|
||||
|
||||
int notify_device_state_change(struct sk_buff *skb,
|
||||
unsigned int seq,
|
||||
- struct drbd_device_state_change *device_state_change,
|
||||
+ void *state_change,
|
||||
enum drbd_notification_type type)
|
||||
{
|
||||
+ struct drbd_device_state_change *device_state_change = state_change;
|
||||
struct drbd_device *device = device_state_change->device;
|
||||
struct device_info device_info;
|
||||
device_state_change_to_info(&device_info, device_state_change);
|
||||
@@ -3258,10 +3261,11 @@ int notify_device_state_change(struct sk_buff *skb,
|
||||
|
||||
int notify_peer_device_state_change(struct sk_buff *skb,
|
||||
unsigned int seq,
|
||||
- struct drbd_peer_device_state_change *state_change,
|
||||
+ void *state_change,
|
||||
enum drbd_notification_type type)
|
||||
{
|
||||
- struct drbd_peer_device *peer_device = state_change->peer_device;
|
||||
+ struct drbd_peer_device_state_change *peer_device_state_change = state_change;
|
||||
+ struct drbd_peer_device *peer_device = peer_device_state_change->peer_device;
|
||||
struct peer_device_info peer_device_info;
|
||||
peer_device_state_change_to_info(&peer_device_info, state_change);
|
||||
|
||||
diff --git a/drbd/drbd_state_change.h b/drbd/drbd_state_change.h
|
||||
index 3dc8616dedd4..40687d40b222 100644
|
||||
--- a/drbd/drbd_state_change.h
|
||||
+++ b/drbd/drbd_state_change.h
|
||||
@@ -69,19 +69,19 @@ extern void forget_state_change(struct drbd_state_change *);
|
||||
|
||||
extern int notify_resource_state_change(struct sk_buff *,
|
||||
unsigned int,
|
||||
- struct drbd_state_change *,
|
||||
+ void *,
|
||||
enum drbd_notification_type type);
|
||||
extern int notify_connection_state_change(struct sk_buff *,
|
||||
unsigned int,
|
||||
- struct drbd_connection_state_change *,
|
||||
+ void *,
|
||||
enum drbd_notification_type type);
|
||||
extern int notify_device_state_change(struct sk_buff *,
|
||||
unsigned int,
|
||||
- struct drbd_device_state_change *,
|
||||
+ void *,
|
||||
enum drbd_notification_type type);
|
||||
extern int notify_peer_device_state_change(struct sk_buff *,
|
||||
unsigned int,
|
||||
- struct drbd_peer_device_state_change *,
|
||||
+ void *,
|
||||
enum drbd_notification_type type);
|
||||
|
||||
#endif /* DRBD_STATE_CHANGE_H */
|
||||
--
|
||||
2.35.3
|
||||
|
@ -1,61 +0,0 @@
|
||||
From 11e96ecc0575eb0d6d4e29caaffb70d1e299908d Mon Sep 17 00:00:00 2001
|
||||
From: Simon Horman <horms@kernel.org>
|
||||
Date: Tue, 23 Jul 2024 10:41:52 +0100
|
||||
Subject: [PATCH 28/32] Add missing documentation of peer_device parameter to
|
||||
Kernel doc.
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
These parameters were added in commit 8164dd6c8ae1 ("drbd: Add peer
|
||||
device parameter to whole-bitmap I/O handlers")
|
||||
|
||||
Flagged by W=1 builds.
|
||||
|
||||
Signed-off-by: Simon Horman <horms@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20240723-drbd-doc-v1-1-a04d9b7a9688@kernel.org
|
||||
Signed-off-by: Jens Axboe <axboe@kernel.dk>
|
||||
Signed-off-by: Christoph Böhmwalder <christoph.boehmwalder@linbit.com>
|
||||
---
|
||||
drbd/drbd_main.c | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
diff --git a/drbd/drbd_main.c b/drbd/drbd_main.c
|
||||
index 407b0a1d1773..a216b725e66c 100644
|
||||
--- a/drbd/drbd_main.c
|
||||
+++ b/drbd/drbd_main.c
|
||||
@@ -5356,6 +5356,7 @@ int drbd_bmio_set_all_n_write(struct drbd_device *device,
|
||||
/**
|
||||
* drbd_bmio_set_n_write() - io_fn for drbd_queue_bitmap_io() or drbd_bitmap_io()
|
||||
* @device: DRBD device.
|
||||
+ * @peer_device: Peer DRBD device.
|
||||
*
|
||||
* Sets all bits in the bitmap towards one peer and writes the whole bitmap to stable storage.
|
||||
*/
|
||||
@@ -5408,6 +5409,7 @@ int drbd_bmio_set_allocated_n_write(struct drbd_device *device,
|
||||
/**
|
||||
* drbd_bmio_clear_all_n_write() - io_fn for drbd_queue_bitmap_io() or drbd_bitmap_io()
|
||||
* @device: DRBD device.
|
||||
+ * @peer_device: Peer DRBD device.
|
||||
*
|
||||
* Clears all bits in the bitmap and writes the whole bitmap to stable storage.
|
||||
*/
|
||||
@@ -5474,6 +5476,7 @@ void drbd_queue_pending_bitmap_work(struct drbd_device *device)
|
||||
* @io_fn: IO callback to be called when bitmap IO is possible
|
||||
* @done: callback to be called after the bitmap IO was performed
|
||||
* @why: Descriptive text of the reason for doing the IO
|
||||
+ * @peer_device: Peer DRBD device.
|
||||
*
|
||||
* While IO on the bitmap happens we freeze application IO thus we ensure
|
||||
* that drbd_set_out_of_sync() can not be called. This function MAY ONLY be
|
||||
@@ -5549,6 +5552,7 @@ void drbd_queue_bitmap_io(struct drbd_device *device,
|
||||
* @device: DRBD device.
|
||||
* @io_fn: IO callback to be called when bitmap IO is possible
|
||||
* @why: Descriptive text of the reason for doing the IO
|
||||
+ * @peer_device: Peer DRBD device.
|
||||
*
|
||||
* freezes application IO while that the actual IO operations runs. This
|
||||
* functions MAY NOT be called from sender context.
|
||||
--
|
||||
2.35.3
|
||||
|
@ -1,42 +0,0 @@
|
||||
From 9fe2be655a793d2f9425b96e53a7e1e7feec067e Mon Sep 17 00:00:00 2001
|
||||
From: Joel Colledge <joel.colledge@linbit.com>
|
||||
Date: Wed, 18 Sep 2024 15:08:55 +0200
|
||||
Subject: [PATCH 30/32] drbd: kref_put() path when kernel_accept() fails
|
||||
|
||||
We need to put the reference that dtt_wait_connect_cond() gets.
|
||||
|
||||
This is an unusual situation. The function dtt_wait_connect_cond() only
|
||||
returns a path when pending_accepts is positive or there is a socket in
|
||||
the path->sockets list. So if the code reaches the kernel_accept() call,
|
||||
we expect it to succeed. However, it has been observed to fail, so we
|
||||
need to handle that case cleanly.
|
||||
|
||||
Without the kref_put(), it is impossible to rmmod drbd.
|
||||
|
||||
For any error other than -EAGAIN, the error is be passed up and is
|
||||
logged by conn_connect(). However, when -EAGAIN is returned,
|
||||
dtt_connect() continues trying to connect and the error from
|
||||
kernel_accept() leaves no traces in the logs.
|
||||
---
|
||||
drbd/drbd_transport_tcp.c | 4 +++-
|
||||
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drbd/drbd_transport_tcp.c b/drbd/drbd_transport_tcp.c
|
||||
index df144fcb4522..d59f68d83c58 100644
|
||||
--- a/drbd/drbd_transport_tcp.c
|
||||
+++ b/drbd/drbd_transport_tcp.c
|
||||
@@ -625,8 +625,10 @@ retry:
|
||||
|
||||
s_estab = NULL;
|
||||
err = kernel_accept(listener->s_listen, &s_estab, O_NONBLOCK);
|
||||
- if (err < 0)
|
||||
+ if (err < 0) {
|
||||
+ kref_put(&path->path.kref, drbd_destroy_path);
|
||||
return err;
|
||||
+ }
|
||||
|
||||
/* The established socket inherits the sk_state_change callback
|
||||
from the listening socket. */
|
||||
--
|
||||
2.35.3
|
||||
|
@ -1,29 +0,0 @@
|
||||
From 903779df9a65ac04814afb1530423914bdfe305c Mon Sep 17 00:00:00 2001
|
||||
From: Lars Ellenberg <lars.ellenberg@linbit.com>
|
||||
Date: Sun, 6 Oct 2024 01:14:19 +0200
|
||||
Subject: [PATCH 31/32] build: fix typo in Makefile.spatch
|
||||
|
||||
The variable name should be cached_compat_h, compat_h does not exist.
|
||||
Noticed when built with `make -j`:
|
||||
Because of the empty prerequisites, sometimes make would try to build
|
||||
kernelrelease.txt before the directory was created.
|
||||
---
|
||||
drbd/Makefile.spatch | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drbd/Makefile.spatch b/drbd/Makefile.spatch
|
||||
index bbcf10dc0603..a5cc774c18b5 100644
|
||||
--- a/drbd/Makefile.spatch
|
||||
+++ b/drbd/Makefile.spatch
|
||||
@@ -42,7 +42,7 @@ cached_compat_patch := $(cache_dir)/compat.patch
|
||||
|
||||
# Remember which kernel releases this supposedly works for.
|
||||
# If KERNELRELEASE is not known, will add an empty line (at most once).
|
||||
-$(cache_dir)/kernelrelease.txt: $(compat_h) FORCE
|
||||
+$(cache_dir)/kernelrelease.txt: $(cached_compat_h) FORCE
|
||||
$(Q)set -e; \
|
||||
grep -sqxFe "$(KERNELRELEASE)" $@ < /dev/null || \
|
||||
echo $(KERNELRELEASE) >> $@;
|
||||
--
|
||||
2.35.3
|
||||
|
@ -1,90 +0,0 @@
|
||||
From 13ada1be201eb14ff8295a17194de8db5cdccd7f Mon Sep 17 00:00:00 2001
|
||||
From: Lars Ellenberg <lars.ellenberg@linbit.com>
|
||||
Date: Wed, 2 Oct 2024 14:34:02 +0200
|
||||
Subject: [PATCH 32/32] drbd: open: do not delay open() if already Primary
|
||||
|
||||
Since 48376549f (drbd: When a remote state change is active to not touch the open_counts, 2017-10-30)
|
||||
if a remote state change is pending when someone tries to open() a DRBD volume,
|
||||
we wait, interruptible, for "auto-promote-timeout",
|
||||
until that state change is finalized (committed or aborted),
|
||||
or give up with EAGAIN if the auto-promote timeout is reached.
|
||||
|
||||
auto-promote-timeout by default is much smaller than twopc-timeout,
|
||||
so we may get spurious open() failures.
|
||||
|
||||
This could be mitigated with auto-promote-timeout > twopc-timeout.
|
||||
|
||||
But we can just ignore the pending state change,
|
||||
if changing the open_cnt won't make a difference:
|
||||
if we are already Primary, or we already have openers anyways.
|
||||
|
||||
If
|
||||
- we have some remote state change pending,
|
||||
- and we are not Primary already,
|
||||
- and we do not have any openers, or this is an open with write intent,
|
||||
we reject NDELAY openers immediately.
|
||||
Normal openers wait for the state change to be finalized
|
||||
(or give up after auto-promote-timeout).
|
||||
|
||||
We do not need to wait if:
|
||||
- there is no remote state change pending,
|
||||
- or we are already Primary anyways,
|
||||
- or we are Secondary, this is a read-only open, and we have openers already.
|
||||
|
||||
Note: we may still want to immediately reject NDELAY open if
|
||||
there is a remote state change pending, even if we have an
|
||||
open count != 0. These are typically short lived openers
|
||||
triggered via udev. If they overlap (new open comes in
|
||||
before previous close), these may still accumulate enough
|
||||
time to mess with state changes.
|
||||
For now, I decide to allow them.
|
||||
---
|
||||
drbd/drbd_main.c | 22 ++++++++++++++++++++--
|
||||
1 file changed, 20 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drbd/drbd_main.c b/drbd/drbd_main.c
|
||||
index a216b725e66c..258be3b9c10d 100644
|
||||
--- a/drbd/drbd_main.c
|
||||
+++ b/drbd/drbd_main.c
|
||||
@@ -2583,10 +2583,21 @@ enum ioc_rv {
|
||||
IOC_ABORT = 2,
|
||||
};
|
||||
|
||||
+/* If we are in the middle of a cluster wide state change, we don't want
|
||||
+ * to change (open_cnt == 0), as that then could cause a failure to commit
|
||||
+ * some already promised peer auto-promote locally.
|
||||
+ * So we wait until the pending remote_state_change is finalized,
|
||||
+ * or give up when the timeout is reached.
|
||||
+ *
|
||||
+ * But we don't want to fail an open on a Primary just because it happens
|
||||
+ * during some unrelated remote state change.
|
||||
+ * If we are already Primary, or already have an open count != 0,
|
||||
+ * we don't need to wait, it won't change anything.
|
||||
+ */
|
||||
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 & BLK_OPEN_NDELAY ? IOC_ABORT : IOC_SLEEP;
|
||||
+ enum ioc_rv r;
|
||||
|
||||
if (test_bit(DOWN_IN_PROGRESS, &resource->flags))
|
||||
return IOC_ABORT;
|
||||
@@ -2594,7 +2605,14 @@ static enum ioc_rv inc_open_count(struct drbd_device *device, blk_mode_t mode)
|
||||
read_lock_irq(&resource->state_rwlock);
|
||||
if (test_bit(UNREGISTERED, &device->flags))
|
||||
r = IOC_ABORT;
|
||||
- else if (!resource->remote_state_change) {
|
||||
+ else if (resource->remote_state_change &&
|
||||
+ resource->role[NOW] != R_PRIMARY &&
|
||||
+ (device->open_cnt == 0 || mode & BLK_OPEN_WRITE)) {
|
||||
+ if (mode & BLK_OPEN_NDELAY)
|
||||
+ r = IOC_ABORT;
|
||||
+ else
|
||||
+ r = IOC_SLEEP;
|
||||
+ } else {
|
||||
r = IOC_OK;
|
||||
device->open_cnt++;
|
||||
if (mode & BLK_OPEN_WRITE)
|
||||
--
|
||||
2.35.3
|
||||
|
@ -1,59 +0,0 @@
|
||||
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,35 +0,0 @@
|
||||
From f6078aa51ed5b776eb2f646553872d576c404c60 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Christoph=20B=C3=B6hmwalder?=
|
||||
<christoph.boehmwalder@linbit.com>
|
||||
Date: Tue, 13 Aug 2024 12:40:27 +0200
|
||||
Subject: [PATCH] compat: fix nla_nest_start_noflag test
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
GCC complains:
|
||||
|
||||
returning ‘struct nlattr *’ from a function with return type ‘int’ makes
|
||||
integer from pointer without a cast
|
||||
|
||||
Return the proper type from this function.
|
||||
---
|
||||
drbd/drbd-kernel-compat/tests/have_nla_nest_start_noflag.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drbd/drbd-kernel-compat/tests/have_nla_nest_start_noflag.c b/drbd/drbd-kernel-compat/tests/have_nla_nest_start_noflag.c
|
||||
index 1d8037c397c5..62ab06c563b7 100644
|
||||
--- a/drbd/drbd-kernel-compat/tests/have_nla_nest_start_noflag.c
|
||||
+++ b/drbd/drbd-kernel-compat/tests/have_nla_nest_start_noflag.c
|
||||
@@ -1,7 +1,7 @@
|
||||
/* {"version": "5.1-rc7", "commit": "ae0be8de9a53cda3505865c11826d8ff0640237c", "comment": "nla_nest_start was renamed to _noflag, and the original version became a wrapper adding a flag", "author": "Michal Kubecek <mkubecek@suse.cz>", "date": "Fri Apr 26 11:13:06 2019 +0200"} */
|
||||
#include <net/netlink.h>
|
||||
|
||||
-int dummy(struct sk_buff *skb, int attrtype)
|
||||
+static struct nlattr *dummy(struct sk_buff *skb, int attrtype)
|
||||
{
|
||||
return nla_nest_start_noflag(skb, attrtype);
|
||||
}
|
||||
--
|
||||
2.35.3
|
||||
|
@ -1,180 +0,0 @@
|
||||
From cfa95bfaefdc2c4e91806fdeb810901015a42a36 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Christoph=20B=C3=B6hmwalder?=
|
||||
<christoph.boehmwalder@linbit.com>
|
||||
Date: Thu, 27 Jun 2024 11:19:33 +0200
|
||||
Subject: [PATCH] drbd: port block device access to file
|
||||
|
||||
Equivalent to upstream kernel commit 20e6a8d0dcdc
|
||||
("drbd: port block device access to file").
|
||||
|
||||
|
||||
---
|
||||
by heming.zhao@suse.com
|
||||
|
||||
change this patch (ignore commit cdd3b8aa03f1a)
|
||||
from:
|
||||
```
|
||||
/* avoid double bd_claim_by_disk() for the same (source,target) tuple,
|
||||
* as would happen with internal metadata. */
|
||||
- if (handle->bdev != nbc->backing_bdev) {
|
||||
- err = link_backing_dev(device, new_disk_conf->meta_dev, handle);
|
||||
```
|
||||
to:
|
||||
```
|
||||
/* 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);
|
||||
```
|
||||
|
||||
---
|
||||
drbd/drbd_int.h | 4 ++--
|
||||
drbd/drbd_nl.c | 56 ++++++++++++++++++++++++-------------------------
|
||||
2 files changed, 30 insertions(+), 30 deletions(-)
|
||||
|
||||
diff --git a/drbd/drbd_int.h b/drbd/drbd_int.h
|
||||
index ae7b45b2f8df..0ebd79091af6 100644
|
||||
--- a/drbd/drbd_int.h
|
||||
+++ b/drbd/drbd_int.h
|
||||
@@ -704,9 +704,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 *f_md_bdev;
|
||||
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 298db40b22ea..b732fa6f9d60 100644
|
||||
--- a/drbd/drbd_nl.c
|
||||
+++ b/drbd/drbd_nl.c
|
||||
@@ -2710,13 +2710,13 @@ bool want_bitmap(struct drbd_peer_device *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)
|
||||
@@ -2727,33 +2727,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_handle,
|
||||
+ ldev->f_md_bdev,
|
||||
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,
|
||||
+ struct file *file = bdev_file_open_by_path(bdev_path,
|
||||
BLK_OPEN_READ | BLK_OPEN_WRITE,
|
||||
claim_ptr, NULL);
|
||||
- if (IS_ERR(handle)) {
|
||||
+ 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);
|
||||
}
|
||||
@@ -2764,22 +2764,22 @@ static int open_backing_devices(struct drbd_device *device,
|
||||
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
|
||||
@@ -2794,23 +2794,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)
|
||||
*/
|
||||
- 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_bdev(file) != nbc->backing_bdev) {
|
||||
+ 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->f_md_bdev = file;
|
||||
return NO_ERROR;
|
||||
}
|
||||
|
||||
--
|
||||
2.35.3
|
||||
|
@ -1,92 +0,0 @@
|
||||
Oct 11, 2024. by heming.zhao@suse.com
|
||||
|
||||
This patch includes the following 4 changes for passing the build on v6.11.0.
|
||||
|
||||
-------------
|
||||
for 'queue_flag_stable_writes__no_present', modifying
|
||||
drbd-kernel-compat/cocci/queue_flag_stable_writes__no_present.cocci
|
||||
|
||||
upstream kernel:
|
||||
commit 1a02f3a73f8c670eddeb44bf52a75ae7f67cfc11
|
||||
Author: Christoph Hellwig <hch@lst.de>
|
||||
Date: Mon Jun 17 08:04:44 2024 +0200
|
||||
|
||||
block: move the stable_writes flag to queue_limits
|
||||
|
||||
-------------
|
||||
for 'disk_update_readahead__no_present', modifying
|
||||
drbd-kernel-compat/cocci/disk_update_readahead__no_present.cocci
|
||||
|
||||
upstream kernel:
|
||||
commit 73781b3b81e76583708a652c853d54d03dce031d
|
||||
Author: Christoph Hellwig <hch@lst.de>
|
||||
Date: Wed Jun 26 16:26:27 2024 +0200
|
||||
|
||||
block: remove disk_update_readahead
|
||||
|
||||
--------------
|
||||
for 'blk_queue_update_readahead__no_present', modifying
|
||||
'drbd-kernel-compat/gen_patch_names.c', which bypasses the
|
||||
testing of COMPAT_HAVE_BLK_QUEUE_UPDATE_READAHEAD.
|
||||
|
||||
---------------
|
||||
for 'blk_queue_write_cache__no_present__yes_flush', modifying
|
||||
drbd-kernel-compat/tests/have_blk_queue_write_cache.c
|
||||
|
||||
upstream kernel:
|
||||
commit 62e35f942231e372f8e465d8484de66a60221226
|
||||
Author: Christoph Hellwig <hch@lst.de>
|
||||
Date: Thu Jun 27 13:14:03 2024 +0200
|
||||
|
||||
block: pass a gendisk to the queue_sysfs_entry methods
|
||||
|
||||
---------------
|
||||
|
||||
diff -Nupr a/drbd/drbd-kernel-compat/cocci/disk_update_readahead__no_present.cocci b/drbd/drbd-kernel-compat/cocci/disk_update_readahead__no_present.cocci
|
||||
--- a/drbd/drbd-kernel-compat/cocci/disk_update_readahead__no_present.cocci 2024-10-11 09:23:43.340688884 +0800
|
||||
+++ b/drbd/drbd-kernel-compat/cocci/disk_update_readahead__no_present.cocci 2024-10-11 09:27:53.755206413 +0800
|
||||
@@ -6,5 +6,5 @@ type T;
|
||||
T q = dev->rq_queue;
|
||||
<...
|
||||
- disk_update_readahead(dev->vdisk);
|
||||
-+ blk_queue_update_readahead(q);
|
||||
++ blk_apply_bdi_limits(dev->vdisk->bdi, &dev->vdisk->queue->limits);
|
||||
...>
|
||||
diff -Nupr a/drbd/drbd-kernel-compat/cocci/queue_flag_stable_writes__no_present.cocci b/drbd/drbd-kernel-compat/cocci/queue_flag_stable_writes__no_present.cocci
|
||||
--- a/drbd/drbd-kernel-compat/cocci/queue_flag_stable_writes__no_present.cocci 2024-10-11 09:23:25.420604140 +0800
|
||||
+++ b/drbd/drbd-kernel-compat/cocci/queue_flag_stable_writes__no_present.cocci 2024-10-11 09:28:33.265393250 +0800
|
||||
@@ -2,4 +2,4 @@
|
||||
expression q;
|
||||
@@
|
||||
- blk_queue_flag_set(QUEUE_FLAG_STABLE_WRITES, q);
|
||||
-+ q->backing_dev_info->capabilities |= BDI_CAP_STABLE_WRITES;
|
||||
++ q->limits.features |= BLK_FEAT_STABLE_WRITES;
|
||||
diff -Nupr a/drbd/drbd-kernel-compat/gen_patch_names.c b/drbd/drbd-kernel-compat/gen_patch_names.c
|
||||
--- a/drbd/drbd-kernel-compat/gen_patch_names.c 2024-10-11 09:24:54.021023132 +0800
|
||||
+++ b/drbd/drbd-kernel-compat/gen_patch_names.c 2024-10-11 09:26:48.508231197 +0800
|
||||
@@ -405,6 +405,7 @@ int main(int argc, char **argv)
|
||||
patch(1, "disk_update_readahead", true, false,
|
||||
COMPAT_HAVE_DISK_UPDATE_READAHEAD, "present");
|
||||
|
||||
+#if 0
|
||||
#if !defined(COMPAT_HAVE_DISK_UPDATE_READAHEAD)
|
||||
/* disk_update_readahead is the "new version" of
|
||||
* blk_queue_update_readahead. we only need to consider compat
|
||||
@@ -412,6 +413,7 @@ int main(int argc, char **argv)
|
||||
patch(1, "blk_queue_update_readahead", true, false,
|
||||
COMPAT_HAVE_BLK_QUEUE_UPDATE_READAHEAD, "present");
|
||||
#endif
|
||||
+#endif
|
||||
|
||||
patch(1, "struct_gendisk", true, false,
|
||||
COMPAT_STRUCT_GENDISK_HAS_BACKING_DEV_INFO, "has_backing_dev_info");
|
||||
diff -Nupr a/drbd/drbd-kernel-compat/tests/have_blk_queue_write_cache.c b/drbd/drbd-kernel-compat/tests/have_blk_queue_write_cache.c
|
||||
--- a/drbd/drbd-kernel-compat/tests/have_blk_queue_write_cache.c 2024-10-11 09:25:57.557990258 +0800
|
||||
+++ b/drbd/drbd-kernel-compat/tests/have_blk_queue_write_cache.c 2024-10-11 09:27:17.571701979 +0800
|
||||
@@ -2,5 +2,5 @@
|
||||
|
||||
void dummy(struct request_queue *q, bool enabled, bool fua)
|
||||
{
|
||||
- blk_queue_write_cache(q, enabled, fua);
|
||||
+ blk_queue_write_cache(q);
|
||||
}
|
@ -1,37 +0,0 @@
|
||||
From 80673af5c0cebaeedc1260248466cfd8b268aa0c Mon Sep 17 00:00:00 2001
|
||||
From: Su Yue <glass.su@suse.com>
|
||||
Date: Tue, 12 Nov 2024 10:14:17 +0800
|
||||
Subject: [PATCH] boo1233222_fix_drbd_build_error_against_kernel_v6.11.6
|
||||
|
||||
This patch fixes build error due to kernel ABI change introduced
|
||||
in v6.11.6 by
|
||||
|
||||
commit 56440d7ec28d60f8da3bfa09062b3368ff9b16db
|
||||
Author: Eric Dumazet <edumazet@google.com>
|
||||
Date: Fri Oct 11 17:12:17 2024 +0000
|
||||
|
||||
genetlink: hold RCU in genlmsg_mcast()
|
||||
|
||||
After the commit, genlmsg_multicast_allns is called without parameter flags.
|
||||
|
||||
Signed-off-by: Su Yue <glass.su@suse.com>
|
||||
---
|
||||
.../genl_magic_func-genl_register_family_with_ops_groups.h | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drbd/drbd-headers/linux/genl_magic_func-genl_register_family_with_ops_groups.h b/drbd/drbd-headers/linux/genl_magic_func-genl_register_family_with_ops_groups.h
|
||||
index b7adc480247e..733cbc788f7f 100644
|
||||
--- a/drbd/drbd-headers/linux/genl_magic_func-genl_register_family_with_ops_groups.h
|
||||
+++ b/drbd/drbd-headers/linux/genl_magic_func-genl_register_family_with_ops_groups.h
|
||||
@@ -19,7 +19,7 @@ static int CONCAT_(GENL_MAGIC_FAMILY, _genl_multicast_ ## group)( \
|
||||
unsigned int group_id = \
|
||||
CONCAT_(GENL_MAGIC_FAMILY, _group_ ## group); \
|
||||
return genlmsg_multicast_allns(&ZZZ_genl_family, skb, 0, \
|
||||
- group_id, flags); \
|
||||
+ group_id); \
|
||||
}
|
||||
|
||||
#include GENL_MAGIC_INCLUDE_FILE
|
||||
--
|
||||
2.47.0
|
||||
|
@ -1,78 +0,0 @@
|
||||
By heming.zhao@suse.com
|
||||
|
||||
This patch was updated/changed after boo#1230635
|
||||
|
||||
----
|
||||
|
||||
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_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;
|
||||
|
BIN
drbd-9.1.16.tar.gz
(Stored with Git LFS)
BIN
drbd-9.1.16.tar.gz
(Stored with Git LFS)
Binary file not shown.
@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:4a0af3560d6d133f8062d4284dd6a2be8614388bbacd140a0978232fd163c533
|
||||
size 1427992
|
Loading…
Reference in New Issue
Block a user