From bf44058c0878319a6b9698f349c583f31cf79b3675745be27ae6bc732cbdad35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Schr=C3=B6ter?= Date: Tue, 14 Jan 2025 14:15:52 +0100 Subject: [PATCH] Sync from SUSE:SLFO:Main drbd revision 92ba344a60ecf13120c13354e3f32f8d --- 0001-drbd-Fix-memory-leak.patch | 81 + ...-value-of-drbd_state_rv-as-well-as-s.patch | 82 - 0008-compat-block-introduce-holder-ops.patch | 80 - ...-compat-block-pass-a-gendisk-to-open.patch | 129 -- ...sed-extern-for-conn_try_outdate_peer.patch | 38 - ...nclude-source-of-state-change-in-log.patch | 1480 ----------------- ...-the-holder-as-indication-for-exclus.patch | 202 --- 0018-drbd-rework-autopromote.patch | 185 --- ...ove-the-unused-mode-argument-to-rele.patch | 107 -- ...lace-fmode_t-with-a-block-specific-t.patch | 183 -- ...-remove-userhdr-from-struct-genl_inf.patch | 96 -- ...x_the_warning_of_blk_validate_limits.patch | 73 + ...ve-sendpage-in-favour-of-sendmsg-MSG.patch | 107 -- drbd-9.1.16.tar.gz | 3 - drbd-9.1.23.tar.gz | 3 + drbd.changes | 340 ++++ drbd.spec | 66 +- drbd_git_revision | 2 +- suse-coccinelle.patch | 119 +- 19 files changed, 581 insertions(+), 2795 deletions(-) create mode 100644 0001-drbd-Fix-memory-leak.patch delete mode 100644 0006-drbd-log-numeric-value-of-drbd_state_rv-as-well-as-s.patch delete mode 100644 0008-compat-block-introduce-holder-ops.patch delete mode 100644 0011-compat-block-pass-a-gendisk-to-open.patch delete mode 100644 0013-drbd-remove-unused-extern-for-conn_try_outdate_peer.patch delete mode 100644 0014-drbd-include-source-of-state-change-in-log.patch delete mode 100644 0015-compat-block-use-the-holder-as-indication-for-exclus.patch delete mode 100644 0018-drbd-rework-autopromote.patch delete mode 100644 0019-compat-block-remove-the-unused-mode-argument-to-rele.patch delete mode 100644 0022-compat-block-replace-fmode_t-with-a-block-specific-t.patch delete mode 100644 0023-compat-genetlink-remove-userhdr-from-struct-genl_inf.patch create mode 100644 boo1235399-fix_the_warning_of_blk_validate_limits.patch delete mode 100644 bsc-1216666-compat-sock-Remove-sendpage-in-favour-of-sendmsg-MSG.patch delete mode 100644 drbd-9.1.16.tar.gz create mode 100644 drbd-9.1.23.tar.gz diff --git a/0001-drbd-Fix-memory-leak.patch b/0001-drbd-Fix-memory-leak.patch new file mode 100644 index 0000000..8883ea0 --- /dev/null +++ b/0001-drbd-Fix-memory-leak.patch @@ -0,0 +1,81 @@ +From d64ebe7eb7df8c622b20bca38f3d7f4c7bb033c9 Mon Sep 17 00:00:00 2001 +From: "zhengbing.huang" +Date: Sun, 15 Dec 2024 14:50:56 +0800 +Subject: [PATCH] drbd: Fix memory leak + +In the output of kmemleak, we have the followe backtrace: + +unreferenced object 0xffff8885b57cda80 (size 64): + comm "drbd_r_testimg4", pid 37104, jiffies 4494192827 (age 127162.843s) + hex dump (first 32 bytes): + 31 20 6f 66 20 32 20 6e 6f 64 65 73 20 76 69 73 1 of 2 nodes vis + 69 62 6c 65 2c 20 6e 65 65 64 20 32 20 66 6f 72 ible, need 2 for + backtrace: + [<000000006d641d68>] __kmalloc_track_caller+0x15c/0x270 + [<000000006a7ffbcf>] kvasprintf+0xa7/0x120 + [<000000002d2f15b3>] drbd_state_err+0xa9/0x190 [drbd] + [<000000006aa2f3df>] __is_valid_soft_transition+0xe99/0xec0 [drbd] + [<0000000009d68cc7>] try_state_change+0x4f0/0x840 [drbd] + [<00000000d5640f06>] ___end_state_change+0x140/0x12a0 [drbd] + [<000000009f4b8d71>] __end_state_change+0xa1/0x130 [drbd] + [<000000001c6de1a7>] change_connection_state+0x5ee/0xbd0 [drbd] + [<00000000ce4408d6>] process_twopc+0x1d3e/0x2ce0 [drbd] + [<00000000df3af6e8>] receive_twopc+0x17b/0x2b0 [drbd] + [<000000009701f919>] drbd_receiver+0x311/0x6e0 [drbd] + [<0000000092c4aeb1>] drbd_thread_setup+0x19d/0x430 [drbd] + [<0000000098e316ab>] kthread+0x19c/0x1c0 + [<000000004c72b3a8>] ret_from_fork+0x1f/0x40 + +This is a memory leak. + +In drbd_state_err() function, if resource->state_change_err_str is a null pointer, +the err_str will not be free. +And _drbd_state_err() has same issues. + +So, if err_str has not put to up layer, free it in current function. + +Signed-off-by: zhengbing.huang +Signed-off-by: Joel Colledge +--- + drbd/drbd_state.c | 14 ++++++++++---- + 1 file changed, 10 insertions(+), 4 deletions(-) + +diff --git a/drbd/drbd_state.c b/drbd/drbd_state.c +index f498eaa60396..0e693c8e3af0 100644 +--- a/drbd/drbd_state.c ++++ b/drbd/drbd_state.c +@@ -1557,10 +1557,13 @@ static __printf(2, 3) void _drbd_state_err(struct change_context *context, const + va_end(args); + if (!err_str) + return; +- if (context->err_str) +- *context->err_str = err_str; + if (context->flags & CS_VERBOSE) + drbd_err(resource, "%s\n", err_str); ++ ++ if (context->err_str) ++ *context->err_str = err_str; ++ else ++ kfree(err_str); + } + + static __printf(2, 3) void drbd_state_err(struct drbd_resource *resource, const char *fmt, ...) +@@ -1573,10 +1576,13 @@ static __printf(2, 3) void drbd_state_err(struct drbd_resource *resource, const + va_end(args); + if (!err_str) + return; +- if (resource->state_change_err_str) +- *resource->state_change_err_str = err_str; + if (resource->state_change_flags & CS_VERBOSE) + drbd_err(resource, "%s\n", err_str); ++ ++ if (resource->state_change_err_str) ++ *resource->state_change_err_str = err_str; ++ else ++ kfree(err_str); + } + + static enum drbd_state_rv __is_valid_soft_transition(struct drbd_resource *resource) +-- +2.43.0 + diff --git a/0006-drbd-log-numeric-value-of-drbd_state_rv-as-well-as-s.patch b/0006-drbd-log-numeric-value-of-drbd_state_rv-as-well-as-s.patch deleted file mode 100644 index f340c97..0000000 --- a/0006-drbd-log-numeric-value-of-drbd_state_rv-as-well-as-s.patch +++ /dev/null @@ -1,82 +0,0 @@ -From 8c2c783a09d81f0a725e7a3ae48be4ceb2d79a63 Mon Sep 17 00:00:00 2001 -From: Joel Colledge -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 - diff --git a/0008-compat-block-introduce-holder-ops.patch b/0008-compat-block-introduce-holder-ops.patch deleted file mode 100644 index 53fa4d9..0000000 --- a/0008-compat-block-introduce-holder-ops.patch +++ /dev/null @@ -1,80 +0,0 @@ -From c34a13c3df85352124e94456f81e3d4ba4f52440 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Moritz=20=22WanzenBug=22=20Wanzenb=C3=B6ck?= - -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 ", "date": "Thu Jun 1 11:44:52 2023 +0200" } */ -+#include -+ -+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 - diff --git a/0011-compat-block-pass-a-gendisk-to-open.patch b/0011-compat-block-pass-a-gendisk-to-open.patch deleted file mode 100644 index a5b00ee..0000000 --- a/0011-compat-block-pass-a-gendisk-to-open.patch +++ /dev/null @@ -1,129 +0,0 @@ -From b993152e80676f5b9ce583c9471b630cbd0675d7 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Moritz=20=22WanzenBug=22=20Wanzenb=C3=B6ck?= - -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 ", "date": "Thu Jun 8 13:02:36 2023 +0200" } */ -+#include -+ -+#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 - diff --git a/0013-drbd-remove-unused-extern-for-conn_try_outdate_peer.patch b/0013-drbd-remove-unused-extern-for-conn_try_outdate_peer.patch deleted file mode 100644 index 9d3a99b..0000000 --- a/0013-drbd-remove-unused-extern-for-conn_try_outdate_peer.patch +++ /dev/null @@ -1,38 +0,0 @@ -From 9e087399533445e3df60a34f26a1e6a285b0504a Mon Sep 17 00:00:00 2001 -From: Joel Colledge -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 - diff --git a/0014-drbd-include-source-of-state-change-in-log.patch b/0014-drbd-include-source-of-state-change-in-log.patch deleted file mode 100644 index 8d215ce..0000000 --- a/0014-drbd-include-source-of-state-change-in-log.patch +++ /dev/null @@ -1,1480 +0,0 @@ -From d6bbb1b1635b9912d77d1a26aba3f380a2ed986d Mon Sep 17 00:00:00 2001 -From: Joel Colledge -Date: Mon, 11 Sep 2023 16:45:27 +0200 -Subject: [PATCH 14/20] drbd: include source of state change in log - -This is useful for understanding why a state change occurs. In -particular, whether it was triggered by userspace. ---- - drbd/drbd_int.h | 10 ++-- - drbd/drbd_main.c | 12 ++--- - drbd/drbd_nl.c | 103 ++++++++++++++++++++------------------ - drbd/drbd_receiver.c | 77 +++++++++++++++------------- - drbd/drbd_req.c | 6 +-- - drbd/drbd_sender.c | 25 ++++++---- - drbd/drbd_state.c | 116 ++++++++++++++++++++++++------------------- - drbd/drbd_state.h | 40 +++++++++++---- - 8 files changed, 224 insertions(+), 165 deletions(-) - -diff --git a/drbd/drbd_int.h b/drbd/drbd_int.h -index f6e7c3ac2629..b705f26e71a4 100644 ---- a/drbd/drbd_int.h -+++ b/drbd/drbd_int.h -@@ -1876,7 +1876,8 @@ extern void drbd_destroy_resource(struct kref *kref); - - extern void drbd_destroy_device(struct kref *kref); - --extern int set_resource_options(struct drbd_resource *resource, struct res_opts *res_opts); -+extern int set_resource_options(struct drbd_resource *resource, struct res_opts *res_opts, -+ const char *tag); - extern struct drbd_connection *drbd_create_connection(struct drbd_resource *resource, - struct drbd_transport_class *tc); - extern void drbd_transport_shutdown(struct drbd_connection *connection, enum drbd_tr_free_op op); -@@ -1931,7 +1932,9 @@ extern void resync_after_online_grow(struct drbd_peer_device *); - 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 enum drbd_state_rv -+drbd_set_role(struct drbd_resource *resource, enum drbd_role role, bool force, const char *tag, -+ struct sk_buff *reply_skb); - 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); -@@ -1943,7 +1946,8 @@ extern int drbd_worker(struct drbd_thread *thi); - enum drbd_ret_code drbd_resync_after_valid(struct drbd_device *device, int o_minor); - void drbd_resync_after_changed(struct drbd_device *device); - extern bool drbd_stable_sync_source_present(struct drbd_peer_device *, enum which_state); --extern void drbd_start_resync(struct drbd_peer_device *, enum drbd_repl_state); -+extern void drbd_start_resync(struct drbd_peer_device *peer_device, enum drbd_repl_state side, -+ const char *tag); - extern void resume_next_sg(struct drbd_device *device); - extern void suspend_other_sg(struct drbd_device *device); - extern void drbd_resync_finished(struct drbd_peer_device *, enum drbd_disk_state); -diff --git a/drbd/drbd_main.c b/drbd/drbd_main.c -index 6bb618909aa0..4b0b967c2c97 100644 ---- a/drbd/drbd_main.c -+++ b/drbd/drbd_main.c -@@ -2505,7 +2505,7 @@ static int try_to_promote(struct drbd_device *device, long timeout, bool ndelay) - unsigned long start = jiffies; - long t; - -- rv = drbd_set_role(resource, R_PRIMARY, false, NULL); -+ rv = drbd_set_role(resource, R_PRIMARY, false, "auto-promote", NULL); - timeout -= jiffies - start; - - if (ndelay || rv >= SS_SUCCESS || timeout <= 0) { -@@ -2854,7 +2854,7 @@ static void drbd_release(struct gendisk *gd, fmode_t mode) - open_rw_cnt == 0 && - resource->role[NOW] == R_PRIMARY && - !test_bit(EXPLICIT_PRIMARY, &resource->flags)) { -- rv = drbd_set_role(resource, R_SECONDARY, false, NULL); -+ 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); -@@ -2866,7 +2866,7 @@ static void drbd_release(struct gendisk *gd, fmode_t mode) - - begin_state_change(resource, &irq_flags, CS_VERBOSE); - resource->fail_io[NEW] = false; -- end_state_change(resource, &irq_flags); -+ end_state_change(resource, &irq_flags, "release"); - } - - /* if the open counts are 0, we free the whole list, otherwise we remove the specific pid */ -@@ -3349,7 +3349,7 @@ static void wake_all_device_misc(struct drbd_resource *resource) - rcu_read_unlock(); - } - --int set_resource_options(struct drbd_resource *resource, struct res_opts *res_opts) -+int set_resource_options(struct drbd_resource *resource, struct res_opts *res_opts, const char *tag) - { - struct drbd_connection *connection; - cpumask_var_t new_cpu_mask; -@@ -3414,7 +3414,7 @@ int set_resource_options(struct drbd_resource *resource, struct res_opts *res_op - - if (force_state_recalc) { - begin_state_change(resource, &irq_flags, CS_VERBOSE | CS_FORCE_RECALC); -- end_state_change(resource, &irq_flags); -+ end_state_change(resource, &irq_flags, tag); - } - - if (wake_device_misc) -@@ -3491,7 +3491,7 @@ struct drbd_resource *drbd_create_resource(const char *name, - } - resource->pp_vacant = page_pool_count; - -- if (set_resource_options(resource, res_opts)) -+ if (set_resource_options(resource, res_opts, "create-resource")) - goto fail_free_pages; - - list_add_tail_rcu(&resource->resources, &drbd_resources); -diff --git a/drbd/drbd_nl.c b/drbd/drbd_nl.c -index cb5cdb184824..b7e9e43312f9 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; - } - --static bool conn_try_outdate_peer(struct drbd_connection *connection) -+static bool conn_try_outdate_peer(struct drbd_connection *connection, const char *tag) - { - struct drbd_resource *resource = connection->resource; - unsigned long last_reconnect_jif; -@@ -792,7 +792,7 @@ static bool conn_try_outdate_peer(struct drbd_connection *connection) - !(disk_state == D_DISKLESS && intentional_diskless(resource))) { - begin_state_change_locked(resource, CS_VERBOSE | CS_HARD); - __change_io_susp_fencing(connection, false); -- end_state_change_locked(resource); -+ end_state_change_locked(resource, tag); - read_unlock_irq(&resource->state_rwlock); - return false; - } -@@ -862,7 +862,7 @@ static bool conn_try_outdate_peer(struct drbd_connection *connection) - goto abort; - } - -- end_state_change(resource, &irq_flags); -+ end_state_change(resource, &irq_flags, tag); - - goto out; - abort: -@@ -875,7 +875,7 @@ static int _try_outdate_peer_async(void *data) - { - struct drbd_connection *connection = (struct drbd_connection *)data; - -- conn_try_outdate_peer(connection); -+ conn_try_outdate_peer(connection, "outdate-async"); - - kref_debug_put(&connection->kref_debug, 4); - kref_put(&connection->kref, drbd_destroy_connection); -@@ -1014,7 +1014,8 @@ static bool wait_up_to_date(struct drbd_resource *resource) - } - - enum drbd_state_rv --drbd_set_role(struct drbd_resource *resource, enum drbd_role role, bool force, struct sk_buff *reply_skb) -+drbd_set_role(struct drbd_resource *resource, enum drbd_role role, bool force, const char *tag, -+ struct sk_buff *reply_skb) - { - struct drbd_device *device; - int vnr, try = 0; -@@ -1042,7 +1043,7 @@ retry: - err_str = NULL; - } - rv = stable_state_change(resource, -- change_role(resource, role, flags, &err_str)); -+ change_role(resource, role, flags, tag, &err_str)); - - if (rv == SS_TIMEOUT || rv == SS_CONCURRENT_ST_CHG) { - long timeout = twopc_retry_timeout(resource, try); -@@ -1104,7 +1105,7 @@ retry: - if (device->disk_state[NOW] != D_CONSISTENT) - continue; - -- if (conn_try_outdate_peer(connection)) -+ if (conn_try_outdate_peer(connection, tag)) - fenced_peers = true; - else - any_fencing_failed = true; -@@ -1140,7 +1141,7 @@ retry: - - up(&resource->state_sem); /* Allow connect while fencing */ - for_each_connection_ref(connection, im, resource) { -- bool outdated_peer = conn_try_outdate_peer(connection); -+ bool outdated_peer = conn_try_outdate_peer(connection, tag); - if (!outdated_peer && force) { - drbd_warn(connection, "Forced into split brain situation!\n"); - flags |= CS_FP_LOCAL_UP_TO_DATE; -@@ -1331,7 +1332,9 @@ int drbd_adm_set_role(struct sk_buff *skb, struct genl_info *info) - new_role = info->genlhdr->cmd == DRBD_ADM_PRIMARY ? R_PRIMARY : R_SECONDARY; - rv = drbd_set_role(adm_ctx.resource, - new_role, -- parms.force, adm_ctx.reply_skb); -+ parms.force, -+ new_role == R_PRIMARY ? "primary" : "secondary", -+ adm_ctx.reply_skb); - - if (new_role == R_PRIMARY) { - if (rv >= SS_SUCCESS) -@@ -3093,7 +3096,7 @@ int drbd_adm_attach(struct sk_buff *skb, struct genl_info *info) - drbd_flush_workqueue(&resource->work); - - rv = stable_state_change(resource, -- change_disk_state(device, D_ATTACHING, CS_VERBOSE | CS_SERIALIZE, NULL)); -+ change_disk_state(device, D_ATTACHING, CS_VERBOSE | CS_SERIALIZE, "attach", NULL)); - retcode = (enum drbd_ret_code)rv; - if (rv >= SS_SUCCESS) - update_resource_dagtag(resource, nbc); -@@ -3353,8 +3356,8 @@ int drbd_adm_attach(struct sk_buff *skb, struct genl_info *info) - - /* change_disk_state uses disk_state_from_md(device); in case D_NEGOTIATING not - necessary, and falls back to a local state change */ -- rv = stable_state_change(resource, -- change_disk_state(device, D_NEGOTIATING, CS_VERBOSE | CS_SERIALIZE, NULL)); -+ rv = stable_state_change(resource, change_disk_state(device, -+ D_NEGOTIATING, CS_VERBOSE | CS_SERIALIZE, "attach", NULL)); - - if (rv < SS_SUCCESS) { - if (rv == SS_CW_FAILED_BY_PEER) -@@ -3385,7 +3388,7 @@ int drbd_adm_attach(struct sk_buff *skb, struct genl_info *info) - force_diskless_dec: - put_ldev(device); - force_diskless: -- change_disk_state(device, D_DISKLESS, CS_HARD, NULL); -+ change_disk_state(device, D_DISKLESS, CS_HARD, "attach", NULL); - fail: - mutex_unlock_cond(&resource->conf_update, &have_conf_update); - drbd_backing_dev_free(device, nbc); -@@ -3406,7 +3409,7 @@ static enum drbd_disk_state get_disk_state(struct drbd_device *device) - } - - static int adm_detach(struct drbd_device *device, bool force, bool intentional_diskless, -- struct sk_buff *reply_skb) -+ const char *tag, struct sk_buff *reply_skb) - { - const char *err_str = NULL; - int ret, retcode; -@@ -3414,7 +3417,7 @@ static int adm_detach(struct drbd_device *device, bool force, bool intentional_d - device->device_conf.intentional_diskless = intentional_diskless; - if (force) { - set_bit(FORCE_DETACH, &device->flags); -- change_disk_state(device, D_DETACHING, CS_HARD, NULL); -+ change_disk_state(device, D_DETACHING, CS_HARD, tag, NULL); - retcode = SS_SUCCESS; - goto out; - } -@@ -3422,7 +3425,7 @@ static int adm_detach(struct drbd_device *device, bool force, bool intentional_d - drbd_suspend_io(device, READ_AND_WRITE); /* so no-one is stuck in drbd_al_begin_io */ - retcode = stable_state_change(device->resource, - change_disk_state(device, D_DETACHING, -- CS_VERBOSE | CS_WAIT_COMPLETE | CS_SERIALIZE, &err_str)); -+ CS_VERBOSE | CS_WAIT_COMPLETE | CS_SERIALIZE, tag, &err_str)); - /* D_DETACHING will transition to DISKLESS. */ - drbd_resume_io(device); - ret = wait_event_interruptible(device->misc_wait, -@@ -3473,7 +3476,7 @@ int drbd_adm_detach(struct sk_buff *skb, struct genl_info *info) - - mutex_lock(&adm_ctx.resource->adm_mutex); - retcode = (enum drbd_ret_code)adm_detach(adm_ctx.device, parms.force_detach, -- parms.intentional_diskless_detach, adm_ctx.reply_skb); -+ parms.intentional_diskless_detach, "detach", adm_ctx.reply_skb); - mutex_unlock(&adm_ctx.resource->adm_mutex); - - out: -@@ -4385,7 +4388,7 @@ int drbd_adm_connect(struct sk_buff *skb, struct genl_info *info) - drbd_md_mark_dirty(device); - } - -- rv = change_cstate(connection, C_UNCONNECTED, CS_VERBOSE); -+ rv = change_cstate_tag(connection, C_UNCONNECTED, CS_VERBOSE, "connect", NULL); - drbd_adm_finish(&adm_ctx, info, rv); - return 0; - out: -@@ -4535,7 +4538,7 @@ int drbd_open_ro_count(struct drbd_resource *resource) - } - - static enum drbd_state_rv conn_try_disconnect(struct drbd_connection *connection, bool force, -- struct sk_buff *reply_skb) -+ const char *tag, struct sk_buff *reply_skb) - { - struct drbd_resource *resource = connection->resource; - enum drbd_conn_state cstate; -@@ -4545,7 +4548,7 @@ static enum drbd_state_rv conn_try_disconnect(struct drbd_connection *connection - long t; - - repeat: -- rv = change_cstate_es(connection, C_DISCONNECTING, flags, &err_str); -+ rv = change_cstate_tag(connection, C_DISCONNECTING, flags, tag, &err_str); - switch (rv) { - case SS_CW_FAILED_BY_PEER: - case SS_NEED_CONNECTION: -@@ -4571,7 +4574,7 @@ static enum drbd_state_rv conn_try_disconnect(struct drbd_connection *connection - break; - case SS_IS_DISKLESS: - case SS_LOWER_THAN_OUTDATED: -- rv = change_cstate(connection, C_DISCONNECTING, CS_HARD); -+ rv = change_cstate_tag(connection, C_DISCONNECTING, CS_HARD, tag, NULL); - break; - case SS_NO_QUORUM: - if (!(flags & CS_VERBOSE)) { -@@ -4597,7 +4600,7 @@ static enum drbd_state_rv conn_try_disconnect(struct drbd_connection *connection - - /* this can only be called immediately after a successful - * peer_try_disconnect, within the same resource->adm_mutex */ --static void del_connection(struct drbd_connection *connection) -+static void del_connection(struct drbd_connection *connection, const char *tag) - { - struct drbd_resource *resource = connection->resource; - struct drbd_peer_device *peer_device; -@@ -4619,7 +4622,7 @@ static void del_connection(struct drbd_connection *connection) - * after drbd_receiver() returned. Typically, we should be - * C_STANDALONE already, now, and this becomes a no-op. - */ -- rv2 = change_cstate(connection, C_STANDALONE, CS_VERBOSE | CS_HARD); -+ rv2 = change_cstate_tag(connection, C_STANDALONE, CS_VERBOSE | CS_HARD, tag, NULL); - if (rv2 < SS_SUCCESS) - drbd_err(connection, - "unexpected rv2=%d in del_connection()\n", -@@ -4654,6 +4657,7 @@ static int adm_disconnect(struct sk_buff *skb, struct genl_info *info, bool dest - struct drbd_connection *connection; - enum drbd_state_rv rv; - enum drbd_ret_code retcode; -+ const char *tag = destroy ? "del-peer" : "disconnect"; - - retcode = drbd_adm_prepare(&adm_ctx, skb, info, DRBD_ADM_NEED_CONNECTION); - if (!adm_ctx.reply_skb) -@@ -4671,10 +4675,10 @@ static int adm_disconnect(struct sk_buff *skb, struct genl_info *info, bool dest - - connection = adm_ctx.connection; - mutex_lock(&adm_ctx.resource->adm_mutex); -- rv = conn_try_disconnect(connection, parms.force_disconnect, adm_ctx.reply_skb); -+ rv = conn_try_disconnect(connection, parms.force_disconnect, tag, adm_ctx.reply_skb); - if (rv >= SS_SUCCESS && destroy) { - mutex_lock(&connection->resource->conf_update); -- del_connection(connection); -+ del_connection(connection, tag); - mutex_unlock(&connection->resource->conf_update); - } - if (rv < SS_SUCCESS) -@@ -4721,10 +4725,10 @@ void resync_after_online_grow(struct drbd_peer_device *peer_device) - - if (!sync_source && connection->agreed_pro_version < 110) { - stable_change_repl_state(peer_device, L_WF_SYNC_UUID, -- CS_VERBOSE | CS_SERIALIZE); -+ CS_VERBOSE | CS_SERIALIZE, "online-grow"); - return; - } -- drbd_start_resync(peer_device, sync_source ? L_SYNC_SOURCE : L_SYNC_TARGET); -+ drbd_start_resync(peer_device, sync_source ? L_SYNC_SOURCE : L_SYNC_TARGET, "online-grow"); - } - - sector_t drbd_local_max_size(struct drbd_device *device) __must_hold(local) -@@ -4956,7 +4960,7 @@ int drbd_adm_resource_opts(struct sk_buff *skb, struct genl_info *info) - goto fail; - } - -- err = set_resource_options(adm_ctx.resource, &res_opts); -+ err = set_resource_options(adm_ctx.resource, &res_opts, "resource-options"); - if (err) { - retcode = ERR_INVALID_REQUEST; - if (err == -ENOMEM) -@@ -4976,11 +4980,11 @@ static enum drbd_state_rv invalidate_resync(struct drbd_peer_device *peer_device - - drbd_flush_workqueue(&peer_device->connection->sender_work); - -- rv = change_repl_state(peer_device, L_STARTING_SYNC_T, CS_SERIALIZE); -+ rv = change_repl_state(peer_device, L_STARTING_SYNC_T, CS_SERIALIZE, "invalidate"); - - if (rv < SS_SUCCESS && rv != SS_NEED_CONNECTION) - rv = stable_change_repl_state(peer_device, L_STARTING_SYNC_T, -- CS_VERBOSE | CS_SERIALIZE); -+ CS_VERBOSE | CS_SERIALIZE, "invalidate"); - - wait_event_interruptible(resource->state_wait, - peer_device->repl_state[NOW] != L_STARTING_SYNC_T); -@@ -5005,7 +5009,7 @@ static enum drbd_state_rv invalidate_no_resync(struct drbd_device *device) __mus - } - } - __change_disk_state(device, D_INCONSISTENT); -- rv = end_state_change(resource, &irq_flags); -+ rv = end_state_change(resource, &irq_flags, "invalidate"); - - if (rv >= SS_SUCCESS) { - drbd_bitmap_io(device, &drbd_bmio_set_all_n_write, -@@ -5080,7 +5084,8 @@ int drbd_adm_invalidate(struct sk_buff *skb, struct genl_info *info) - retcode = invalidate_resync(sync_from_peer_device); - } else { - retcode = change_repl_state(sync_from_peer_device, L_WF_BITMAP_T, -- CS_VERBOSE | CS_CLUSTER_WIDE | CS_WAIT_COMPLETE | CS_SERIALIZE); -+ CS_VERBOSE | CS_CLUSTER_WIDE | CS_WAIT_COMPLETE | -+ CS_SERIALIZE, "invalidate"); - } - } else { - int retry = 3; -@@ -5103,7 +5108,8 @@ int drbd_adm_invalidate(struct sk_buff *skb, struct genl_info *info) - } - retcode = change_repl_state(peer_device, L_WF_BITMAP_T, - CS_VERBOSE | CS_CLUSTER_WIDE | -- CS_WAIT_COMPLETE | CS_SERIALIZE); -+ CS_WAIT_COMPLETE | CS_SERIALIZE, -+ "invalidate"); - } - if (retcode >= SS_SUCCESS) - goto out; -@@ -5140,13 +5146,15 @@ static int full_sync_from_peer(struct drbd_peer_device *peer_device) - struct drbd_resource *resource = device->resource; - int retcode; /* enum drbd_ret_code rsp. enum drbd_state_rv */ - -- retcode = stable_change_repl_state(peer_device, L_STARTING_SYNC_S, CS_SERIALIZE); -+ retcode = stable_change_repl_state(peer_device, L_STARTING_SYNC_S, CS_SERIALIZE, -+ "invalidate-remote"); - if (retcode < SS_SUCCESS) { - if (retcode == SS_NEED_CONNECTION && resource->role[NOW] == R_PRIMARY) { - /* The peer will get a resync upon connect anyways. - * Just make that into a full resync. */ - retcode = change_peer_disk_state(peer_device, D_INCONSISTENT, -- CS_VERBOSE | CS_WAIT_COMPLETE | CS_SERIALIZE); -+ CS_VERBOSE | CS_WAIT_COMPLETE | CS_SERIALIZE, -+ "invalidate-remote"); - if (retcode >= SS_SUCCESS) { - if (drbd_bitmap_io(device, &drbd_bmio_set_susp_al, - "set_n_write from invalidate_peer", -@@ -5155,7 +5163,7 @@ static int full_sync_from_peer(struct drbd_peer_device *peer_device) - } - } else { - retcode = stable_change_repl_state(peer_device, L_STARTING_SYNC_S, -- CS_VERBOSE | CS_SERIALIZE); -+ CS_VERBOSE | CS_SERIALIZE, "invalidate-remote"); - } - } - -@@ -5214,7 +5222,8 @@ int drbd_adm_invalidate_peer(struct sk_buff *skb, struct genl_info *info) - retcode = full_sync_from_peer(peer_device); - } else { - retcode = change_repl_state(peer_device, L_WF_BITMAP_S, -- CS_VERBOSE | CS_CLUSTER_WIDE | CS_WAIT_COMPLETE | CS_SERIALIZE); -+ CS_VERBOSE | CS_CLUSTER_WIDE | CS_WAIT_COMPLETE | CS_SERIALIZE, -+ "invalidate-remote"); - } - drbd_resume_io(device); - -@@ -5329,7 +5338,7 @@ int drbd_adm_resume_io(struct sk_buff *skb, struct genl_info *info) - __change_io_susp_fencing(connection, false); - - __change_io_susp_quorum(resource, false); -- retcode = end_state_change(resource, &irq_flags); -+ retcode = end_state_change(resource, &irq_flags, "resume-io"); - drbd_resume_io(device); - mutex_unlock(&adm_ctx.resource->adm_mutex); - drbd_adm_finish(&adm_ctx, info, retcode); -@@ -5348,7 +5357,7 @@ int drbd_adm_outdate(struct sk_buff *skb, struct genl_info *info) - - retcode = stable_state_change(adm_ctx.device->resource, - change_disk_state(adm_ctx.device, D_OUTDATED, -- CS_VERBOSE | CS_WAIT_COMPLETE | CS_SERIALIZE, NULL)); -+ CS_VERBOSE | CS_WAIT_COMPLETE | CS_SERIALIZE, "outdate", NULL)); - - mutex_unlock(&adm_ctx.resource->adm_mutex); - drbd_adm_finish(&adm_ctx, info, retcode); -@@ -6010,7 +6019,7 @@ int drbd_adm_start_ov(struct sk_buff *skb, struct genl_info *info) - drbd_suspend_io(device, READ_AND_WRITE); - wait_event(device->misc_wait, !atomic_read(&device->pending_bitmap_work.n)); - rv = stable_change_repl_state(peer_device, -- L_VERIFY_S, CS_VERBOSE | CS_WAIT_COMPLETE | CS_SERIALIZE); -+ L_VERIFY_S, CS_VERBOSE | CS_WAIT_COMPLETE | CS_SERIALIZE, "verify"); - drbd_resume_io(device); - - mutex_unlock(&adm_ctx.resource->adm_mutex); -@@ -6082,7 +6091,7 @@ int drbd_adm_new_c_uuid(struct sk_buff *skb, struct genl_info *info) - unsigned long irq_flags; - begin_state_change(device->resource, &irq_flags, CS_VERBOSE); - __change_disk_state(device, D_UP_TO_DATE); -- end_state_change(device->resource, &irq_flags); -+ end_state_change(device->resource, &irq_flags, "new-c-uuid"); - - for_each_peer_device(peer_device, device) { - if (NODE_MASK(peer_device->node_id) & nodes) { -@@ -6122,7 +6131,7 @@ int drbd_adm_new_c_uuid(struct sk_buff *skb, struct genl_info *info) - if (NODE_MASK(peer_device->node_id) & diskful) - __change_peer_disk_state(peer_device, D_UP_TO_DATE); - } -- end_state_change(device->resource, &irq_flags); -+ end_state_change(device->resource, &irq_flags, "new-c-uuid"); - } - - drbd_md_sync_if_dirty(device); -@@ -6353,7 +6362,7 @@ static enum drbd_ret_code adm_del_minor(struct drbd_device *device) - - for_each_peer_device_ref(peer_device, im, device) - stable_change_repl_state(peer_device, L_OFF, -- CS_VERBOSE | CS_WAIT_COMPLETE); -+ CS_VERBOSE | CS_WAIT_COMPLETE, "del-minor"); - - /* If drbd_ldev_destroy() is pending, wait for it to run before - * unregistering the device. */ -@@ -6465,7 +6474,7 @@ int drbd_adm_down(struct sk_buff *skb, struct genl_info *info) - mutex_lock(&resource->adm_mutex); - set_bit(DOWN_IN_PROGRESS, &resource->flags); - /* demote */ -- retcode = drbd_set_role(resource, R_SECONDARY, false, adm_ctx.reply_skb); -+ retcode = drbd_set_role(resource, R_SECONDARY, false, "down", adm_ctx.reply_skb); - if (retcode < SS_SUCCESS) { - opener_info(adm_ctx.resource, adm_ctx.reply_skb, retcode); - goto out; -@@ -6474,10 +6483,10 @@ int drbd_adm_down(struct sk_buff *skb, struct genl_info *info) - for_each_connection_ref(connection, im, resource) { - retcode = SS_SUCCESS; - if (connection->cstate[NOW] > C_STANDALONE) -- retcode = conn_try_disconnect(connection, 0, adm_ctx.reply_skb); -+ retcode = conn_try_disconnect(connection, 0, "down", adm_ctx.reply_skb); - if (retcode >= SS_SUCCESS) { - mutex_lock(&resource->conf_update); -- del_connection(connection); -+ del_connection(connection, "down"); - mutex_unlock(&resource->conf_update); - } else { - kref_debug_put(&connection->kref_debug, 13); -@@ -6491,7 +6500,7 @@ int drbd_adm_down(struct sk_buff *skb, struct genl_info *info) - idr_for_each_entry(&resource->devices, device, i) { - kref_get(&device->kref); - rcu_read_unlock(); -- retcode = adm_detach(device, 0, 0, adm_ctx.reply_skb); -+ retcode = adm_detach(device, 0, 0, "down", adm_ctx.reply_skb); - mutex_lock(&resource->conf_update); - ret = adm_del_minor(device); - mutex_unlock(&resource->conf_update); -diff --git a/drbd/drbd_receiver.c b/drbd/drbd_receiver.c -index 223353b1081c..0c3ab0fd486c 100644 ---- a/drbd/drbd_receiver.c -+++ b/drbd/drbd_receiver.c -@@ -920,7 +920,7 @@ static void apply_local_state_change(struct drbd_connection *connection, enum ao - resource->role[NEW] = R_SECONDARY; - } - } -- end_state_change(resource, &irq_flags); -+ end_state_change(resource, &irq_flags, "connect-failed"); - } - - static int connect_work(struct drbd_work *work, int cancel) -@@ -945,8 +945,9 @@ static int connect_work(struct drbd_work *work, int cancel) - rv = SS_CONCURRENT_ST_CHG; - break; - } -- rv = change_cstate(connection, C_CONNECTED, CS_SERIALIZE | -- CS_ALREADY_SERIALIZED | CS_VERBOSE | CS_DONT_RETRY); -+ rv = change_cstate_tag(connection, C_CONNECTED, CS_SERIALIZE | -+ CS_ALREADY_SERIALIZED | CS_VERBOSE | CS_DONT_RETRY, -+ "connected", NULL); - up(&resource->state_sem); - if (rv != SS_PRIMARY_READER) - break; -@@ -1011,7 +1012,8 @@ static bool conn_connect(struct drbd_connection *connection) - start: - have_mutex = false; - clear_bit(DISCONNECT_EXPECTED, &connection->flags); -- if (change_cstate(connection, C_CONNECTING, CS_VERBOSE) < SS_SUCCESS) { -+ if (change_cstate_tag(connection, C_CONNECTING, CS_VERBOSE, "connecting", NULL) -+ < SS_SUCCESS) { - /* We do not have a network config. */ - return false; - } -@@ -3697,7 +3699,8 @@ static enum sync_strategy drbd_asb_recover_1p(struct drbd_peer_device *peer_devi - /* drbd_change_state() does not sleep while in SS_IN_TRANSIENT_STATE, - * we might be here in L_OFF which is transient. - * we do not need to wait for the after state change work either. */ -- rv2 = change_role(resource, R_SECONDARY, CS_VERBOSE, NULL); -+ rv2 = change_role(resource, R_SECONDARY, CS_VERBOSE, -+ "after-sb-1pri", NULL); - if (rv2 != SS_SUCCESS) { - drbd_maybe_khelper(device, connection, "pri-lost-after-sb"); - } else { -@@ -3750,7 +3753,8 @@ static enum sync_strategy drbd_asb_recover_2p(struct drbd_peer_device *peer_devi - /* drbd_change_state() does not sleep while in SS_IN_TRANSIENT_STATE, - * we might be here in L_OFF which is transient. - * we do not need to wait for the after state change work either. */ -- rv2 = change_role(device->resource, R_SECONDARY, CS_VERBOSE, NULL); -+ rv2 = change_role(device->resource, R_SECONDARY, CS_VERBOSE, -+ "after-sb-2pri", NULL); - if (rv2 != SS_SUCCESS) { - drbd_maybe_khelper(device, connection, "pri-lost-after-sb"); - } else { -@@ -5500,6 +5504,7 @@ static void drbd_resync(struct drbd_peer_device *peer_device, - enum sync_rule rule; - int peer_node_id; - enum drbd_state_rv rv; -+ const char *tag = reason == AFTER_UNSTABLE ? "after-unstable" : "diskless-primary"; - - strategy = drbd_handshake(peer_device, &rule, &peer_node_id, reason == DISKLESS_PRIMARY); - if (strategy == SPLIT_BRAIN_AUTO_RECOVER && reason == AFTER_UNSTABLE) -@@ -5529,11 +5534,11 @@ static void drbd_resync(struct drbd_peer_device *peer_device, - as well. */ - drbd_info(peer_device, "Upgrading local disk to %s after unstable/weak (and no resync).\n", - drbd_disk_str(peer_disk_state)); -- change_disk_state(peer_device->device, peer_disk_state, CS_VERBOSE, NULL); -+ change_disk_state(peer_device->device, peer_disk_state, CS_VERBOSE, tag, NULL); - return; - } - -- rv = change_repl_state(peer_device, new_repl_state, CS_VERBOSE); -+ rv = change_repl_state(peer_device, new_repl_state, CS_VERBOSE, tag); - if ((rv == SS_NOTHING_TO_DO || rv == SS_RESYNC_RUNNING) && - (new_repl_state == L_WF_BITMAP_S || new_repl_state == L_WF_BITMAP_T)) { - /* Those events might happen very quickly. In case we are still processing -@@ -5633,7 +5638,7 @@ static int __receive_uuids(struct drbd_peer_device *peer_device, u64 node_mask) - begin_state_change(device->resource, &irq_flags, CS_VERBOSE); - __change_disk_state(device, D_UP_TO_DATE); - __change_peer_disk_state(peer_device, D_UP_TO_DATE); -- end_state_change(device->resource, &irq_flags); -+ end_state_change(device->resource, &irq_flags, "skip-initial-sync"); - updated_uuids = 1; - propagate_skip_initial_to_diskless(device); - } -@@ -5668,7 +5673,7 @@ static int __receive_uuids(struct drbd_peer_device *peer_device, u64 node_mask) - if (device->disk_state[NOW] == D_DISKLESS && uuid_match && - peer_device->disk_state[NOW] == D_CONSISTENT) { - drbd_info(peer_device, "Peer is on same UUID now\n"); -- change_peer_disk_state(peer_device, D_UP_TO_DATE, CS_VERBOSE); -+ change_peer_disk_state(peer_device, D_UP_TO_DATE, CS_VERBOSE, "receive-uuids"); - } - - if (updated_uuids) -@@ -5855,7 +5860,7 @@ static void check_resync_source(struct drbd_device *device, u64 weak_nodes) - return; - abort: - drbd_info(peer_device, "My sync source became a weak node, aborting resync!\n"); -- change_repl_state(peer_device, L_ESTABLISHED, CS_VERBOSE); -+ change_repl_state(peer_device, L_ESTABLISHED, CS_VERBOSE, "abort-resync"); - drbd_flush_workqueue(&device->resource->work); - - wait_event_interruptible(device->misc_wait, -@@ -6091,7 +6096,7 @@ retry: - - if (is_connect && connection->agreed_pro_version >= 117) - apply_connect(connection, (flags & CS_PREPARED) && !abort); -- rv = end_state_change(resource, &irq_flags); -+ rv = end_state_change(resource, &irq_flags, "remote"); - out: - - if ((rv == SS_NO_UP_TO_DATE_DISK && resource->role[NOW] != R_PRIMARY) || -@@ -6144,7 +6149,7 @@ change_peer_device_state(struct drbd_peer_device *peer_device, - rv = __change_connection_state(connection, mask, val, flags); - if (rv < SS_SUCCESS) - goto fail; -- rv = end_state_change(connection->resource, &irq_flags); -+ rv = end_state_change(connection->resource, &irq_flags, "remote"); - out: - return rv; - fail: -@@ -6375,7 +6380,7 @@ far_away_change(struct drbd_connection *connection, - } - - /* even if no outdate happens, CS_FORCE_RECALC might be set here */ -- return end_state_change(resource, &irq_flags); -+ return end_state_change(resource, &irq_flags, "far-away"); - } - - static void handle_neighbor_demotion(struct drbd_connection *connection, -@@ -6630,17 +6635,18 @@ cont: - /* peer is secondary */ - resync = L_SYNC_SOURCE; - } -- drbd_start_resync(peer_device, resync); -+ drbd_start_resync(peer_device, resync, "resize"); - } else { - if (tr->diskful_primary_nodes & NODE_MASK(peer_device->node_id)) -- drbd_start_resync(peer_device, L_SYNC_TARGET); -+ drbd_start_resync(peer_device, L_SYNC_TARGET, -+ "resize"); - /* else no resync */ - } - } else { - if (resource->twopc_parent_nodes & NODE_MASK(peer_device->node_id)) -- drbd_start_resync(peer_device, L_SYNC_TARGET); -+ drbd_start_resync(peer_device, L_SYNC_TARGET, "resize"); - else if (nodes_to_reach & NODE_MASK(peer_device->node_id)) -- drbd_start_resync(peer_device, L_SYNC_SOURCE); -+ drbd_start_resync(peer_device, L_SYNC_SOURCE, "resize"); - /* else no resync */ - } - } -@@ -7101,7 +7107,7 @@ void drbd_try_to_get_resynced(struct drbd_device *device) - peer_device = best_peer_device; - - if (best_strategy == NO_SYNC) { -- change_disk_state(device, D_UP_TO_DATE, CS_VERBOSE, NULL); -+ change_disk_state(device, D_UP_TO_DATE, CS_VERBOSE, "get-resync", NULL); - } else if (peer_device) { - drbd_resync(peer_device, DISKLESS_PRIMARY); - drbd_send_uuids(peer_device, UUID_FLAG_RESYNC | UUID_FLAG_DISKLESS_PRIMARY, 0); -@@ -7225,7 +7231,7 @@ static void diskless_with_peers_different_current_uuids(struct drbd_peer_device - CS_VERBOSE | CS_HARD | CS_FS_IGN_OPENERS); - resource->role[NEW] = R_SECONDARY; - /* resource->fail_io[NEW] gets set via CS_FS_IGN_OPENERS */ -- end_state_change(resource, &irq_flags); -+ end_state_change(resource, &irq_flags, "peer-state"); - } - set_bit(CONN_HANDSHAKE_RETRY, &connection->flags); - } else if (data_successor && resource->role[NOW] == R_SECONDARY) { -@@ -7278,7 +7284,7 @@ static int receive_state(struct drbd_connection *connection, struct packet_info - if (peer_state.role == R_SECONDARY) { - begin_state_change(resource, &irq_flags, CS_HARD | CS_VERBOSE); - __change_peer_role(connection, R_SECONDARY); -- rv = end_state_change(resource, &irq_flags); -+ rv = end_state_change(resource, &irq_flags, "peer-state"); - if (rv < SS_SUCCESS) - goto fail; - } -@@ -7374,7 +7380,7 @@ static int receive_state(struct drbd_connection *connection, struct packet_info - /* Start resync after AHEAD/BEHIND */ - if (connection->agreed_pro_version >= 110 && - peer_state.conn == L_SYNC_SOURCE && old_peer_state.conn == L_BEHIND) { -- drbd_start_resync(peer_device, L_SYNC_TARGET); -+ drbd_start_resync(peer_device, L_SYNC_TARGET, "resync-after-behind"); - return 0; - } - -@@ -7519,7 +7525,7 @@ static int receive_state(struct drbd_connection *connection, struct packet_info - begin_state_change(resource, &irq_flags, CS_HARD); - __change_cstate(connection, C_PROTOCOL_ERROR); - __change_io_susp_user(resource, false); -- end_state_change(resource, &irq_flags); -+ end_state_change(resource, &irq_flags, "abort-connect"); - return -EIO; - } - -@@ -7581,7 +7587,7 @@ static int receive_state(struct drbd_connection *connection, struct packet_info - if (repl_state[OLD] < L_ESTABLISHED && repl_state[NEW] >= L_ESTABLISHED) - resource->state_change_flags |= CS_HARD; - -- rv = end_state_change(resource, &irq_flags); -+ rv = end_state_change(resource, &irq_flags, "peer-state"); - new_repl_state = peer_device->repl_state[NOW]; - - if (rv < SS_SUCCESS) -@@ -7635,7 +7641,7 @@ static int receive_sync_uuid(struct drbd_connection *connection, struct packet_i - _drbd_uuid_set_bitmap(peer_device, 0UL); - - drbd_print_uuids(peer_device, "updated sync uuid"); -- drbd_start_resync(peer_device, L_SYNC_TARGET); -+ drbd_start_resync(peer_device, L_SYNC_TARGET, "peer-sync-uuid"); - - put_ldev(device); - } else -@@ -7935,17 +7941,18 @@ static int receive_bitmap(struct drbd_connection *connection, struct packet_info - /* We have entered drbd_start_resync() since starting the bitmap exchange. */ - drbd_warn(peer_device, "Received bitmap more than once; ignoring\n"); - } else if (repl_state == L_WF_BITMAP_S) { -- drbd_start_resync(peer_device, L_SYNC_SOURCE); -+ drbd_start_resync(peer_device, L_SYNC_SOURCE, "receive-bitmap"); - } else if (repl_state == L_WF_BITMAP_T) { - if (connection->agreed_pro_version < 110) { - enum drbd_state_rv rv; - - /* Omit CS_WAIT_COMPLETE and CS_SERIALIZE with this state - * transition to avoid deadlocks. */ -- rv = stable_change_repl_state(peer_device, L_WF_SYNC_UUID, CS_VERBOSE); -+ rv = stable_change_repl_state(peer_device, L_WF_SYNC_UUID, CS_VERBOSE, -+ "receive-bitmap"); - D_ASSERT(device, rv == SS_SUCCESS); - } else { -- drbd_start_resync(peer_device, L_SYNC_TARGET); -+ drbd_start_resync(peer_device, L_SYNC_TARGET, "receive-bitmap"); - } - } else { - /* admin may have requested C_DISCONNECTING, -@@ -8139,7 +8146,7 @@ static int receive_peer_dagtag(struct drbd_connection *connection, struct packet - __change_repl_state(peer_device, new_repl_state); - set_bit(RECONCILIATION_RESYNC, &peer_device->flags); - } -- rv = end_state_change(resource, &irq_flags); -+ rv = end_state_change(resource, &irq_flags, "receive-peer-dagtag"); - if (rv == SS_SUCCESS) - drbd_info(connection, "Reconciliation resync because \'%s\' disappeared. (o=%d)\n", - lost_peer->transport.net_conf->name, (int)dagtag_offset); -@@ -8248,7 +8255,8 @@ static int receive_current_uuid(struct drbd_connection *connection, struct packe - if (resource->remote_state_change) - set_bit(OUTDATE_ON_2PC_COMMIT, &device->flags); - else -- change_disk_state(device, D_OUTDATED, CS_VERBOSE, NULL); -+ change_disk_state(device, D_OUTDATED, CS_VERBOSE, -+ "receive-current-uuid", NULL); - } - put_ldev(device); - } else if (device->disk_state[NOW] == D_DISKLESS && resource->role[NOW] == R_PRIMARY) { -@@ -8328,7 +8336,7 @@ static int receive_rs_deallocated(struct drbd_connection *connection, struct pac - - static int receive_disconnect(struct drbd_connection *connection, struct packet_info *pi) - { -- change_cstate(connection, C_DISCONNECTING, CS_HARD); -+ change_cstate_tag(connection, C_DISCONNECTING, CS_HARD, "receive-disconnect", NULL); - return 0; - } - -@@ -8594,7 +8602,7 @@ static void conn_disconnect(struct drbd_connection *connection) - * Usually we should be in some network failure state already, - * but just in case we are not, we fix it up here. - */ -- change_cstate(connection, C_NETWORK_FAILURE, CS_HARD); -+ change_cstate_tag(connection, C_NETWORK_FAILURE, CS_HARD, "disconnected", NULL); - - del_connect_timer(connection); - -@@ -8707,10 +8715,11 @@ static void conn_disconnect(struct drbd_connection *connection) - /* drbd_receiver() has to be restarted after it returns */ - drbd_thread_restart_nowait(&connection->receiver); - } -- end_state_change(resource, &irq_flags); -+ end_state_change(resource, &irq_flags, "disconnected"); - - if (oc == C_DISCONNECTING) -- change_cstate(connection, C_STANDALONE, CS_VERBOSE | CS_HARD | CS_LOCAL_ONLY); -+ change_cstate_tag(connection, C_STANDALONE, CS_VERBOSE | CS_HARD | CS_LOCAL_ONLY, -+ "disconnected", NULL); - } - - /* -diff --git a/drbd/drbd_req.c b/drbd/drbd_req.c -index af2ae66f51b5..41950e46ec27 100644 ---- a/drbd/drbd_req.c -+++ b/drbd/drbd_req.c -@@ -2688,7 +2688,7 @@ void request_timer_fn(struct timer_list *t) - continue; - begin_state_change(resource, &irq_flags, CS_VERBOSE | CS_HARD); - __change_cstate(connection, C_TIMEOUT); -- end_state_change(resource, &irq_flags); -+ end_state_change(resource, &irq_flags, "timeout"); - kref_put(&connection->kref, drbd_destroy_connection); - } - -@@ -2723,7 +2723,7 @@ void drbd_handle_io_error_(struct drbd_device *device, - if (device->disk_state[NOW] > D_INCONSISTENT) { - begin_state_change_locked(device->resource, CS_HARD); - __change_disk_state(device, D_INCONSISTENT); -- end_state_change_locked(device->resource); -+ end_state_change_locked(device->resource, "local-io-error"); - } - break; - } -@@ -2740,7 +2740,7 @@ void drbd_handle_io_error_(struct drbd_device *device, - if (device->disk_state[NOW] > D_FAILED) { - begin_state_change_locked(device->resource, CS_HARD); - __change_disk_state(device, D_FAILED); -- end_state_change_locked(device->resource); -+ end_state_change_locked(device->resource, "local-io-error"); - drbd_err(device, - "Local IO failed in %s. Detaching...\n", where); - } -diff --git a/drbd/drbd_sender.c b/drbd/drbd_sender.c -index 93a460dae190..0beeb5f3cb54 100644 ---- a/drbd/drbd_sender.c -+++ b/drbd/drbd_sender.c -@@ -472,7 +472,7 @@ int w_resync_timer(struct drbd_work *w, int cancel) - unsigned long irq_flags; - begin_state_change(resource, &irq_flags, 0); - peer_device->resync_active[NEW] = false; -- end_state_change(resource, &irq_flags); -+ end_state_change(resource, &irq_flags, "resync-inactive"); - } - break; - } -@@ -1155,7 +1155,7 @@ static void resync_again(struct drbd_device *device, u64 source_m, u64 target_m) - peer_device->resync_again--; - begin_state_change_locked(device->resource, CS_VERBOSE); - __change_repl_state(peer_device, new_repl_state); -- end_state_change_locked(device->resource); -+ end_state_change_locked(device->resource, "resync-again"); - } - } - } -@@ -1225,7 +1225,7 @@ found: - } - - drbd_send_uuids(peer_device, 0, 0); -- drbd_start_resync(peer_device, L_SYNC_TARGET); -+ drbd_start_resync(peer_device, L_SYNC_TARGET, "resync-from-primary"); - } - - static void queue_resync_finished(struct drbd_peer_device *peer_device, enum drbd_disk_state new_peer_disk_state) -@@ -1428,7 +1428,7 @@ void drbd_resync_finished(struct drbd_peer_device *peer_device, - } - - out_unlock: -- end_state_change_locked(device->resource); -+ end_state_change_locked(device->resource, "resync-finished"); - - put_ldev(device); - -@@ -1920,7 +1920,8 @@ static bool drbd_pause_after(struct drbd_device *device) - if (!__drbd_may_sync_now(other_peer_device)) - __change_resync_susp_dependency(other_peer_device, true); - } -- if (end_state_change_locked(other_device->resource) != SS_NOTHING_TO_DO) -+ if (end_state_change_locked(other_device->resource, "resync-after") != -+ SS_NOTHING_TO_DO) - changed = true; - } - rcu_read_unlock(); -@@ -1957,7 +1958,8 @@ static bool drbd_resume_next(struct drbd_device *device) - __drbd_may_sync_now(other_peer_device)) - __change_resync_susp_dependency(other_peer_device, false); - } -- if (end_state_change_locked(other_device->resource) != SS_NOTHING_TO_DO) -+ if (end_state_change_locked(other_device->resource, "resync-after") != -+ SS_NOTHING_TO_DO) - changed = true; - } - rcu_read_unlock(); -@@ -2125,7 +2127,7 @@ static void do_start_resync(struct drbd_peer_device *peer_device) - return; - } - -- drbd_start_resync(peer_device, peer_device->start_resync_side); -+ drbd_start_resync(peer_device, peer_device->start_resync_side, "postponed-resync"); - clear_bit(AHEAD_TO_SYNC_SOURCE, &peer_device->flags); - } - -@@ -2149,7 +2151,7 @@ static void handle_congestion(struct drbd_peer_device *peer_device) - else if (on_congestion == OC_DISCONNECT) - __change_cstate(peer_device->connection, C_DISCONNECTING); - } -- end_state_change(resource, &irq_flags); -+ end_state_change(resource, &irq_flags, "congestion"); - } - rcu_read_unlock(); - -@@ -2163,7 +2165,8 @@ static void handle_congestion(struct drbd_peer_device *peer_device) - * This function might bring you directly into one of the - * C_PAUSED_SYNC_* states. - */ --void drbd_start_resync(struct drbd_peer_device *peer_device, enum drbd_repl_state side) -+void drbd_start_resync(struct drbd_peer_device *peer_device, enum drbd_repl_state side, -+ const char *tag) - { - struct drbd_device *device = peer_device->device; - struct drbd_connection *connection = peer_device->connection; -@@ -2258,7 +2261,7 @@ skip_helper: - init_resync_stable_bits(peer_device); - finished_resync_pdsk = peer_device->resync_finished_pdsk; - peer_device->resync_finished_pdsk = D_UNKNOWN; -- r = end_state_change_locked(device->resource); -+ r = end_state_change_locked(device->resource, tag); - repl_state = peer_device->repl_state[NOW]; - - if (repl_state < L_ESTABLISHED) -@@ -2339,7 +2342,7 @@ static void go_diskless(struct drbd_device *device) - } - - drbd_md_sync_if_dirty(device); -- change_disk_state(device, D_DISKLESS, CS_HARD, NULL); -+ change_disk_state(device, D_DISKLESS, CS_HARD, "go-diskless", NULL); - } - - static int do_md_sync(struct drbd_device *device) -diff --git a/drbd/drbd_state.c b/drbd/drbd_state.c -index 23eab7f867aa..22cd134be962 100644 ---- a/drbd/drbd_state.c -+++ b/drbd/drbd_state.c -@@ -74,8 +74,8 @@ struct change_disk_state_context { - static bool lost_contact_to_peer_data(enum drbd_disk_state *peer_disk_state); - static bool peer_returns_diskless(struct drbd_peer_device *peer_device, - enum drbd_disk_state os, enum drbd_disk_state ns); --static void print_state_change(struct drbd_resource *resource, const char *prefix); --static void finish_state_change(struct drbd_resource *); -+static void print_state_change(struct drbd_resource *resource, const char *prefix, const char *tag); -+static void finish_state_change(struct drbd_resource *, const char *tag); - static int w_after_state_change(struct drbd_work *w, int unused); - static enum drbd_state_rv is_valid_soft_transition(struct drbd_resource *); - static enum drbd_state_rv is_valid_transition(struct drbd_resource *resource); -@@ -774,7 +774,7 @@ static void queue_after_state_change_work(struct drbd_resource *resource, - } - - static enum drbd_state_rv ___end_state_change(struct drbd_resource *resource, struct completion *done, -- enum drbd_state_rv rv) -+ enum drbd_state_rv rv, const char *tag) - { - enum chg_state_flags flags = resource->state_change_flags; - struct drbd_connection *connection; -@@ -793,14 +793,14 @@ static enum drbd_state_rv ___end_state_change(struct drbd_resource *resource, st - if (flags & CS_VERBOSE) { - drbd_err(resource, "State change failed: %s (%d)\n", - drbd_set_st_err_str(rv), rv); -- print_state_change(resource, "Failed: "); -+ print_state_change(resource, "Failed: ", tag); - } - goto out; - } - if (flags & CS_PREPARE) - goto out; - -- finish_state_change(resource); -+ finish_state_change(resource, tag); - update_members(resource); - - /* Check whether we are establishing a connection before applying the change. */ -@@ -939,9 +939,9 @@ void begin_state_change_locked(struct drbd_resource *resource, enum chg_state_fl - __begin_state_change(resource); - } - --enum drbd_state_rv end_state_change_locked(struct drbd_resource *resource) -+enum drbd_state_rv end_state_change_locked(struct drbd_resource *resource, const char *tag) - { -- return ___end_state_change(resource, NULL, SS_SUCCESS); -+ return ___end_state_change(resource, NULL, SS_SUCCESS, tag); - } - - void begin_state_change(struct drbd_resource *resource, unsigned long *irq_flags, enum chg_state_flags flags) -@@ -952,7 +952,8 @@ void begin_state_change(struct drbd_resource *resource, unsigned long *irq_flags - - static enum drbd_state_rv __end_state_change(struct drbd_resource *resource, - unsigned long *irq_flags, -- enum drbd_state_rv rv) -+ enum drbd_state_rv rv, -+ const char *tag) - { - enum chg_state_flags flags = resource->state_change_flags; - struct completion __done, *done = NULL; -@@ -961,26 +962,27 @@ static enum drbd_state_rv __end_state_change(struct drbd_resource *resource, - done = &__done; - init_completion(done); - } -- rv = ___end_state_change(resource, done, rv); -+ rv = ___end_state_change(resource, done, rv, tag); - __state_change_unlock(resource, irq_flags, rv >= SS_SUCCESS ? done : NULL); - return rv; - } - --enum drbd_state_rv end_state_change(struct drbd_resource *resource, unsigned long *irq_flags) -+enum drbd_state_rv end_state_change(struct drbd_resource *resource, unsigned long *irq_flags, -+ const char *tag) - { -- return __end_state_change(resource, irq_flags, SS_SUCCESS); -+ return __end_state_change(resource, irq_flags, SS_SUCCESS, tag); - } - - void abort_state_change(struct drbd_resource *resource, unsigned long *irq_flags) - { - resource->state_change_flags &= ~CS_VERBOSE; -- __end_state_change(resource, irq_flags, SS_UNKNOWN_ERROR); -+ __end_state_change(resource, irq_flags, SS_UNKNOWN_ERROR, NULL); - } - - void abort_state_change_locked(struct drbd_resource *resource) - { - resource->state_change_flags &= ~CS_VERBOSE; -- ___end_state_change(resource, NULL, SS_UNKNOWN_ERROR); -+ ___end_state_change(resource, NULL, SS_UNKNOWN_ERROR, NULL); - } - - static void begin_remote_state_change(struct drbd_resource *resource, unsigned long *irq_flags) -@@ -1159,15 +1161,19 @@ static int scnprintf_io_suspend_flags(char *buffer, size_t size, - return b - buffer; - } - --static void print_state_change(struct drbd_resource *resource, const char *prefix) -+static void print_state_change(struct drbd_resource *resource, const char *prefix, const char *tag) - { - char buffer[150], *b, *end = buffer + sizeof(buffer); -+ char tag_buffer[30] = ""; - struct drbd_connection *connection; - struct drbd_device *device; - enum drbd_role *role = resource->role; - bool *fail_io = resource->fail_io; - int vnr; - -+ if (tag) -+ scnprintf(tag_buffer, 30, " [%s]", tag); -+ - b = buffer; - if (role[OLD] != role[NEW]) - b += scnprintf(b, end - b, "role( %s -> %s ) ", -@@ -1186,7 +1192,7 @@ static void print_state_change(struct drbd_resource *resource, const char *prefi - fail_io[NEW] ? "yes" : "no"); - if (b != buffer) { - *(b-1) = 0; -- drbd_info(resource, "%s%s\n", prefix, buffer); -+ drbd_info(resource, "%s%s%s\n", prefix, buffer, tag_buffer); - } - - for_each_connection(connection, resource) { -@@ -1205,7 +1211,7 @@ static void print_state_change(struct drbd_resource *resource, const char *prefi - - if (b != buffer) { - *(b-1) = 0; -- drbd_info(connection, "%s%s\n", prefix, buffer); -+ drbd_info(connection, "%s%s%s\n", prefix, buffer, tag_buffer); - } - } - -@@ -1225,7 +1231,7 @@ static void print_state_change(struct drbd_resource *resource, const char *prefi - have_quorum[NEW] ? "yes" : "no"); - if (b != buffer) { - *(b-1) = 0; -- drbd_info(device, "%s%s\n", prefix, buffer); -+ drbd_info(device, "%s%s%s\n", prefix, buffer, tag_buffer); - } - - for_each_peer_device(peer_device, device) { -@@ -1253,7 +1259,7 @@ static void print_state_change(struct drbd_resource *resource, const char *prefi - - if (b != buffer) { - *(b-1) = 0; -- drbd_info(peer_device, "%s%s\n", prefix, buffer); -+ drbd_info(peer_device, "%s%s%s\n", prefix, buffer, tag_buffer); - } - } - } -@@ -2543,7 +2549,7 @@ static bool should_try_become_up_to_date(struct drbd_device *device, enum drbd_d - /** - * finish_state_change - carry out actions triggered by a state change - */ --static void finish_state_change(struct drbd_resource *resource) -+static void finish_state_change(struct drbd_resource *resource, const char *tag) - { - enum drbd_role *role = resource->role; - struct drbd_device *device; -@@ -2557,7 +2563,7 @@ static void finish_state_change(struct drbd_resource *resource) - bool unfreeze_io = false; - int vnr; - -- print_state_change(resource, ""); -+ print_state_change(resource, "", tag); - - resource_suspended[OLD] = resource_is_suspended(resource, OLD); - resource_suspended[NEW] = resource_is_suspended(resource, NEW); -@@ -3025,7 +3031,7 @@ static void abw_start_sync(struct drbd_device *device, - - if (rv) { - drbd_err(device, "Writing the bitmap failed not starting resync.\n"); -- stable_change_repl_state(peer_device, L_ESTABLISHED, CS_VERBOSE); -+ stable_change_repl_state(peer_device, L_ESTABLISHED, CS_VERBOSE, "start-sync"); - return; - } - -@@ -3039,12 +3045,13 @@ static void abw_start_sync(struct drbd_device *device, - rcu_read_unlock(); - - if (peer_device->connection->agreed_pro_version < 110) -- stable_change_repl_state(peer_device, L_WF_SYNC_UUID, CS_VERBOSE); -+ stable_change_repl_state(peer_device, L_WF_SYNC_UUID, CS_VERBOSE, -+ "start-sync"); - else -- drbd_start_resync(peer_device, L_SYNC_TARGET); -+ drbd_start_resync(peer_device, L_SYNC_TARGET, "start-sync"); - break; - case L_STARTING_SYNC_S: -- drbd_start_resync(peer_device, L_SYNC_SOURCE); -+ drbd_start_resync(peer_device, L_SYNC_SOURCE, "start-sync"); - break; - default: - break; -@@ -3531,7 +3538,7 @@ static void check_may_resume_io_after_fencing(struct drbd_state_change *state_ch - rcu_read_unlock(); - begin_state_change(resource, &irq_flags, CS_VERBOSE); - __change_io_susp_fencing(connection, false); -- end_state_change(resource, &irq_flags); -+ end_state_change(resource, &irq_flags, "after-fencing"); - } - /* case2: The connection was established again: */ - if (all_peer_disks_connected) { -@@ -3543,7 +3550,7 @@ static void check_may_resume_io_after_fencing(struct drbd_state_change *state_ch - rcu_read_unlock(); - begin_state_change(resource, &irq_flags, CS_VERBOSE); - __change_io_susp_fencing(connection, false); -- end_state_change(resource, &irq_flags); -+ end_state_change(resource, &irq_flags, "after-fencing"); - } - } - -@@ -4191,7 +4198,7 @@ static int w_after_state_change(struct drbd_work *w, int unused) - - begin_state_change(resource, &irq_flags, CS_VERBOSE); - resource->susp_uuid[NEW] = false; -- end_state_change(resource, &irq_flags); -+ end_state_change(resource, &irq_flags, "susp-uuid"); - } - - if (try_become_up_to_date) -@@ -4673,7 +4680,7 @@ static void twopc_phase2(struct drbd_resource *resource, - */ - static enum drbd_state_rv - change_cluster_wide_state(bool (*change)(struct change_context *, enum change_phase), -- struct change_context *context) -+ struct change_context *context, const char *tag) - { - struct drbd_resource *resource = context->resource; - unsigned long irq_flags; -@@ -4692,11 +4699,11 @@ change_cluster_wide_state(bool (*change)(struct change_context *, enum change_ph - if (local_state_change(context->flags)) { - /* Not a cluster-wide state change. */ - change(context, PH_LOCAL_COMMIT); -- return end_state_change(resource, &irq_flags); -+ return end_state_change(resource, &irq_flags, tag); - } else { - if (!change(context, PH_PREPARE)) { - /* Not a cluster-wide state change. */ -- return end_state_change(resource, &irq_flags); -+ return end_state_change(resource, &irq_flags, tag); - } - rv = try_state_change(resource); - if (rv != SS_SUCCESS) { -@@ -4704,7 +4711,7 @@ change_cluster_wide_state(bool (*change)(struct change_context *, enum change_ph - /* abort_state_change(resource, &irq_flags); */ - if (rv == SS_NOTHING_TO_DO) - resource->state_change_flags &= ~CS_VERBOSE; -- return __end_state_change(resource, &irq_flags, rv); -+ return __end_state_change(resource, &irq_flags, rv, tag); - } - /* Really a cluster-wide state change. */ - } -@@ -4720,12 +4727,12 @@ change_cluster_wide_state(bool (*change)(struct change_context *, enum change_ph - } - if (rv >= SS_SUCCESS) - change(context, PH_84_COMMIT); -- return __end_state_change(resource, &irq_flags, rv); -+ return __end_state_change(resource, &irq_flags, rv, tag); - } - - if (!expect(resource, context->flags & CS_SERIALIZE)) { - rv = SS_CW_FAILED_BY_PEER; -- return __end_state_change(resource, &irq_flags, rv); -+ return __end_state_change(resource, &irq_flags, rv, tag); - } - - rcu_read_lock(); -@@ -4740,7 +4747,7 @@ change_cluster_wide_state(bool (*change)(struct change_context *, enum change_ph - - retry: - if (current == resource->worker.task && resource->remote_state_change) -- return __end_state_change(resource, &irq_flags, SS_CONCURRENT_ST_CHG); -+ return __end_state_change(resource, &irq_flags, SS_CONCURRENT_ST_CHG, tag); - - complete_remote_state_change(resource, &irq_flags); - start_time = jiffies; -@@ -4756,7 +4763,7 @@ change_cluster_wide_state(bool (*change)(struct change_context *, enum change_ph - connection = drbd_get_connection_by_node_id(resource, context->target_node_id); - if (!connection) { - rv = SS_NEED_CONNECTION; -- return __end_state_change(resource, &irq_flags, rv); -+ return __end_state_change(resource, &irq_flags, rv, tag); - } - kref_debug_get(&connection->kref_debug, 8); - -@@ -4768,7 +4775,7 @@ change_cluster_wide_state(bool (*change)(struct change_context *, enum change_ph - - kref_debug_put(&connection->kref_debug, 8); - kref_put(&connection->kref, drbd_destroy_connection); -- return __end_state_change(resource, &irq_flags, rv); -+ return __end_state_change(resource, &irq_flags, rv, tag); - } - target_connection = connection; - -@@ -4959,7 +4966,7 @@ change_cluster_wide_state(bool (*change)(struct change_context *, enum change_ph - clear_bit(TWOPC_STATE_CHANGE_PENDING, &resource->flags); - if (rv >= SS_SUCCESS) { - change(context, PH_COMMIT); -- rv = end_state_change(resource, &irq_flags); -+ rv = end_state_change(resource, &irq_flags, tag); - if (rv < SS_SUCCESS) - drbd_err(resource, "FATAL: Local commit of already committed %u failed! \n", - request.tid); -@@ -5276,6 +5283,7 @@ static bool do_change_role(struct change_context *context, enum change_phase pha - enum drbd_state_rv change_role(struct drbd_resource *resource, - enum drbd_role role, - enum chg_state_flags flags, -+ const char *tag, - const char **err_str) - { - struct change_context role_context = { -@@ -5310,7 +5318,7 @@ enum drbd_state_rv change_role(struct drbd_resource *resource, - } - role_context.change_local_state_last = true; - } -- rv = change_cluster_wide_state(do_change_role, &role_context); -+ rv = change_cluster_wide_state(do_change_role, &role_context, tag); - out: - if (got_state_sem) - up(&resource->state_sem); -@@ -5330,7 +5338,7 @@ enum drbd_state_rv change_io_susp_user(struct drbd_resource *resource, - - begin_state_change(resource, &irq_flags, flags); - __change_io_susp_user(resource, value); -- return end_state_change(resource, &irq_flags); -+ return end_state_change(resource, &irq_flags, value ? "suspend-io" : "resume-io"); - } - - void __change_io_susp_no_data(struct drbd_resource *resource, bool value) -@@ -5465,7 +5473,7 @@ enum drbd_state_rv twopc_after_lost_peer(struct drbd_resource *resource, - /* The other nodes get the request for an empty state change. I.e. they - will agree to this change request. At commit time we know where to - go from the D_CONSISTENT, since we got the primary mask. */ -- return change_cluster_wide_state(do_twopc_after_lost_peer, &context); -+ return change_cluster_wide_state(do_twopc_after_lost_peer, &context, "lost-peer"); - } - - static bool do_change_disk_state(struct change_context *context, enum change_phase phase) -@@ -5496,6 +5504,7 @@ static bool do_change_disk_state(struct change_context *context, enum change_pha - enum drbd_state_rv change_disk_state(struct drbd_device *device, - enum drbd_disk_state disk_state, - enum chg_state_flags flags, -+ const char *tag, - const char **err_str) - { - struct change_disk_state_context disk_state_context = { -@@ -5513,7 +5522,7 @@ enum drbd_state_rv change_disk_state(struct drbd_device *device, - }; - - return change_cluster_wide_state(do_change_disk_state, -- &disk_state_context.context); -+ &disk_state_context.context, tag); - } - - void __change_cstate(struct drbd_connection *connection, enum drbd_conn_state cstate) -@@ -5683,11 +5692,11 @@ static bool do_change_cstate(struct change_context *context, enum change_phase p - * peer disks depending on the fencing policy. This cannot easily be split - * into two state changes. - */ --enum drbd_state_rv change_cstate_es(struct drbd_connection *connection, -+enum drbd_state_rv change_cstate_tag(struct drbd_connection *connection, - enum drbd_conn_state cstate, - enum chg_state_flags flags, -- const char **err_str -- ) -+ const char *tag, -+ const char **err_str) - { - struct change_cstate_context cstate_context = { - .context = { -@@ -5717,7 +5726,7 @@ enum drbd_state_rv change_cstate_es(struct drbd_connection *connection, - if (!(flags & CS_HARD)) - cstate_context.context.flags |= CS_SERIALIZE; - -- return change_cluster_wide_state(do_change_cstate, &cstate_context.context); -+ return change_cluster_wide_state(do_change_cstate, &cstate_context.context, tag); - } - - void __change_peer_role(struct drbd_connection *connection, enum drbd_role peer_role) -@@ -5759,7 +5768,8 @@ static bool do_change_repl_state(struct change_context *context, enum change_pha - - enum drbd_state_rv change_repl_state(struct drbd_peer_device *peer_device, - enum drbd_repl_state new_repl_state, -- enum chg_state_flags flags) -+ enum chg_state_flags flags, -+ const char *tag) - { - struct change_repl_context repl_context = { - .context = { -@@ -5776,15 +5786,16 @@ enum drbd_state_rv change_repl_state(struct drbd_peer_device *peer_device, - if (new_repl_state == L_WF_BITMAP_S || new_repl_state == L_VERIFY_S) - repl_context.context.change_local_state_last = true; - -- return change_cluster_wide_state(do_change_repl_state, &repl_context.context); -+ return change_cluster_wide_state(do_change_repl_state, &repl_context.context, tag); - } - - enum drbd_state_rv stable_change_repl_state(struct drbd_peer_device *peer_device, - enum drbd_repl_state repl_state, -- enum chg_state_flags flags) -+ enum chg_state_flags flags, -+ const char *tag) - { - return stable_state_change(peer_device->device->resource, -- change_repl_state(peer_device, repl_state, flags)); -+ change_repl_state(peer_device, repl_state, flags, tag)); - } - - void __change_peer_disk_state(struct drbd_peer_device *peer_device, enum drbd_disk_state disk_state) -@@ -5807,14 +5818,15 @@ void __downgrade_peer_disk_states(struct drbd_connection *connection, enum drbd_ - - enum drbd_state_rv change_peer_disk_state(struct drbd_peer_device *peer_device, - enum drbd_disk_state disk_state, -- enum chg_state_flags flags) -+ enum chg_state_flags flags, -+ const char *tag) - { - struct drbd_resource *resource = peer_device->device->resource; - unsigned long irq_flags; - - begin_state_change(resource, &irq_flags, flags); - __change_peer_disk_state(peer_device, disk_state); -- return end_state_change(resource, &irq_flags); -+ return end_state_change(resource, &irq_flags, tag); - } - - void __change_resync_susp_user(struct drbd_peer_device *peer_device, -@@ -5832,7 +5844,7 @@ enum drbd_state_rv change_resync_susp_user(struct drbd_peer_device *peer_device, - - begin_state_change(resource, &irq_flags, flags); - __change_resync_susp_user(peer_device, value); -- return end_state_change(resource, &irq_flags); -+ return end_state_change(resource, &irq_flags, value ? "pause-sync" : "resume-sync"); - } - - void __change_resync_susp_peer(struct drbd_peer_device *peer_device, -diff --git a/drbd/drbd_state.h b/drbd/drbd_state.h -index 6942f85123dd..952dea156697 100644 ---- a/drbd/drbd_state.h -+++ b/drbd/drbd_state.h -@@ -56,12 +56,13 @@ extern void state_change_lock(struct drbd_resource *, unsigned long *, enum chg_ - extern void state_change_unlock(struct drbd_resource *, unsigned long *); - - extern void begin_state_change(struct drbd_resource *, unsigned long *, enum chg_state_flags); --extern enum drbd_state_rv end_state_change(struct drbd_resource *, unsigned long *); -+extern enum drbd_state_rv end_state_change(struct drbd_resource *resource, unsigned long *irq_flags, -+ const char *tag); - extern void abort_state_change(struct drbd_resource *, unsigned long *); - extern void abort_state_change_locked(struct drbd_resource *resource); - - extern void begin_state_change_locked(struct drbd_resource *, enum chg_state_flags); --extern enum drbd_state_rv end_state_change_locked(struct drbd_resource *); -+extern enum drbd_state_rv end_state_change_locked(struct drbd_resource *resource, const char *tag); - - extern void clear_remote_state_change(struct drbd_resource *resource); - extern void __clear_remote_state_change(struct drbd_resource *resource); -@@ -89,7 +90,11 @@ extern enum drbd_state_rv nested_twopc_request(struct drbd_resource *res, struct - extern bool drbd_twopc_between_peer_and_me(struct drbd_connection *connection); - extern bool cluster_wide_reply_ready(struct drbd_resource *); - --extern enum drbd_state_rv change_role(struct drbd_resource *, enum drbd_role, enum chg_state_flags, const char **); -+extern enum drbd_state_rv change_role(struct drbd_resource *resource, -+ enum drbd_role role, -+ enum chg_state_flags flags, -+ const char *tag, -+ const char **err_str); - - extern void __change_io_susp_user(struct drbd_resource *, bool); - extern enum drbd_state_rv change_io_susp_user(struct drbd_resource *, bool, enum chg_state_flags); -@@ -99,27 +104,44 @@ extern void __change_io_susp_quorum(struct drbd_resource *, bool); - - extern void __change_disk_state(struct drbd_device *, enum drbd_disk_state); - extern void __downgrade_disk_states(struct drbd_resource *, enum drbd_disk_state); --extern enum drbd_state_rv change_disk_state(struct drbd_device *, enum drbd_disk_state, enum chg_state_flags, const char **); -+extern enum drbd_state_rv change_disk_state(struct drbd_device *device, -+ enum drbd_disk_state disk_state, -+ enum chg_state_flags flags, -+ const char *tag, -+ const char **err_str); - - extern void __change_cstate(struct drbd_connection *, enum drbd_conn_state); --extern enum drbd_state_rv change_cstate_es(struct drbd_connection *, enum drbd_conn_state, enum chg_state_flags, const char **); -+extern enum drbd_state_rv change_cstate_tag(struct drbd_connection *connection, -+ enum drbd_conn_state cstate, -+ enum chg_state_flags flags, -+ const char *tag, -+ const char **err_str); - static inline enum drbd_state_rv change_cstate(struct drbd_connection *connection, - enum drbd_conn_state cstate, - enum chg_state_flags flags) - { -- return change_cstate_es(connection, cstate, flags, NULL); -+ return change_cstate_tag(connection, cstate, flags, NULL, NULL); - } - - extern void __change_peer_role(struct drbd_connection *, enum drbd_role); - - extern void __change_repl_state(struct drbd_peer_device *, enum drbd_repl_state); --extern enum drbd_state_rv change_repl_state(struct drbd_peer_device *, enum drbd_repl_state, enum chg_state_flags); --extern enum drbd_state_rv stable_change_repl_state(struct drbd_peer_device *, enum drbd_repl_state, enum chg_state_flags); -+extern enum drbd_state_rv change_repl_state(struct drbd_peer_device *peer_device, -+ enum drbd_repl_state new_repl_state, -+ enum chg_state_flags flags, -+ const char *tag); -+extern enum drbd_state_rv stable_change_repl_state(struct drbd_peer_device *peer_device, -+ enum drbd_repl_state repl_state, -+ enum chg_state_flags flags, -+ const char *tag); - - extern void __change_peer_disk_state(struct drbd_peer_device *, enum drbd_disk_state); - extern void __downgrade_peer_disk_states(struct drbd_connection *, enum drbd_disk_state); - extern void __outdate_myself(struct drbd_resource *resource); --extern enum drbd_state_rv change_peer_disk_state(struct drbd_peer_device *, enum drbd_disk_state, enum chg_state_flags); -+extern enum drbd_state_rv change_peer_disk_state(struct drbd_peer_device *peer_device, -+ enum drbd_disk_state disk_state, -+ enum chg_state_flags flags, -+ const char *tag); - - enum drbd_state_rv twopc_after_lost_peer(struct drbd_resource *resource, enum chg_state_flags); - --- -2.35.3 - diff --git a/0015-compat-block-use-the-holder-as-indication-for-exclus.patch b/0015-compat-block-use-the-holder-as-indication-for-exclus.patch deleted file mode 100644 index 83881d6..0000000 --- a/0015-compat-block-use-the-holder-as-indication-for-exclus.patch +++ /dev/null @@ -1,202 +0,0 @@ -From 3b9fcc2cfaa32766724f371cc2054e057adbc425 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Moritz=20=22WanzenBug=22=20Wanzenb=C3=B6ck?= - -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 ", "date": "Thu Jun 8 13:02:37 2023 +0200" } */ -+#include -+ -+#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 - diff --git a/0018-drbd-rework-autopromote.patch b/0018-drbd-rework-autopromote.patch deleted file mode 100644 index dab770a..0000000 --- a/0018-drbd-rework-autopromote.patch +++ /dev/null @@ -1,185 +0,0 @@ -From e3ef0e229a6ae88346164d1507697ae1b397cdf9 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Moritz=20=22WanzenBug=22=20Wanzenb=C3=B6ck?= - -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 - diff --git a/0019-compat-block-remove-the-unused-mode-argument-to-rele.patch b/0019-compat-block-remove-the-unused-mode-argument-to-rele.patch deleted file mode 100644 index 9f40f7c..0000000 --- a/0019-compat-block-remove-the-unused-mode-argument-to-rele.patch +++ /dev/null @@ -1,107 +0,0 @@ -From bf287c15359c4495a706ca270e7dcab4c2d6ebcc Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Moritz=20=22WanzenBug=22=20Wanzenb=C3=B6ck?= - -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 ", "date": "Thu Jun 8 13:02:37 2023 +0200" } */ -+#include -+ -+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 - diff --git a/0022-compat-block-replace-fmode_t-with-a-block-specific-t.patch b/0022-compat-block-replace-fmode_t-with-a-block-specific-t.patch deleted file mode 100644 index 82ef213..0000000 --- a/0022-compat-block-replace-fmode_t-with-a-block-specific-t.patch +++ /dev/null @@ -1,183 +0,0 @@ -From 2d3c3fd6546174a0452c9bbd64d4f4193c0c39e2 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Moritz=20WanzenBug=20Wanzenb=C3=B6ck?= - -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 ", "date": "Thu Jun 8 13:02:55 2023 +0200" } */ -+#include -+ -+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 - diff --git a/0023-compat-genetlink-remove-userhdr-from-struct-genl_inf.patch b/0023-compat-genetlink-remove-userhdr-from-struct-genl_inf.patch deleted file mode 100644 index 490b1e3..0000000 --- a/0023-compat-genetlink-remove-userhdr-from-struct-genl_inf.patch +++ /dev/null @@ -1,96 +0,0 @@ -From 1412792a443ddc696fd1c8981a6cc544272f54bf Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Moritz=20WanzenBug=20Wanzenb=C3=B6ck?= - -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 ", "date": "Mon Aug 14 14:47:16 2023 -0700" } */ -+#include -+ -+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 - diff --git a/boo1235399-fix_the_warning_of_blk_validate_limits.patch b/boo1235399-fix_the_warning_of_blk_validate_limits.patch new file mode 100644 index 0000000..e972e2c --- /dev/null +++ b/boo1235399-fix_the_warning_of_blk_validate_limits.patch @@ -0,0 +1,73 @@ +Subject: [PATCH] drbd: Fix block layer warning + +drbdadm down r0 trigger kernel warning + +drbd_reconsider_queue_parameters + + get_common_queue_limits + | blk_set_stacking_limits + | lim->max_zone_append_sectors = UINT_MAX; <=== set + | + + ... ... + | + + queue_limits_commit_update + blk_validate_limits + WARN_ON_ONCE(lim->max_zone_append_sectors) <== trigger + +log: + +``` +Jan 08 14:43:37 tw-2 kernel: drbd r0/0 drbd0: disk( UpToDate -> Detaching ) [down] +Jan 08 14:43:37 tw-2 kernel: drbd r0/0 drbd0: disk( Detaching -> Diskless ) [go-diskless] +------------[ cut here ]------------ +WARNING: CPU: 0 PID: 1773 at block/blk-settings.c:75 blk_validate_limits+0x41d/0x440 +... ... +Call Trace: + + ? blk_validate_limits+0x41d/0x440 + ? __warn.cold+0x93/0xf7 + ? blk_validate_limits+0x41d/0x440 + ? report_bug+0xff/0x140 + ? handle_bug+0x58/0x90 + ? exc_invalid_op+0x17/0x70 + ? asm_exc_invalid_op+0x1a/0x20 + ? blk_validate_limits+0x41d/0x440 + queue_limits_commit_update+0x1b/0xa0 + drbd_reconsider_queue_parameters+0x1d2/0x240 [drbd 9a1d8dc285f5b1fe449ab4495af7893c660ff3ea] + w_after_state_change+0x1997/0x20a0 [drbd 9a1d8dc285f5b1fe449ab4495af7893c660ff3ea] + ? idr_get_next_ul+0xee/0x110 + ? do_unqueued_device_work+0x1da/0x2a0 [drbd 9a1d8dc285f5b1fe449ab4495af7893c660ff3ea] + drbd_worker+0x109/0x530 [drbd 9a1d8dc285f5b1fe449ab4495af7893c660ff3ea] + ? __pfx_autoremove_wake_function+0x10/0x10 + ? __pfx_drbd_thread_setup+0x10/0x10 [drbd 9a1d8dc285f5b1fe449ab4495af7893c660ff3ea] + drbd_thread_setup+0x6d/0x170 [drbd 9a1d8dc285f5b1fe449ab4495af7893c660ff3ea] + kthread+0xcf/0x100 + ? __pfx_kthread+0x10/0x10 + ret_from_fork+0x31/0x50 + ? __pfx_kthread+0x10/0x10 + ret_from_fork_asm+0x1a/0x30 + +Jan 08 14:43:37 tw-2 kernel: ---[ end trace 0000000000000000 ]--- +Jan 08 14:43:37 tw-2 kernel: drbd r0/0 drbd0: setting new queue limits failed +Jan 08 14:43:37 tw-2 kernel: drbd r0/0 drbd0: drbd_bm_resize called with capacity == 0 +Jan 08 14:43:37 tw-2 kernel: drbd /unregistered/r0: Terminating worker thread + +---[ end trace 0000000000000000 ]--- +drbd /unregistered/r0/0 drbd0: setting new queue limits failed +drbd /unregistered/r0: Terminating worker thread +``` + +Signed-off-by: Heming Zhao +--- + +diff -Nupr a/drbd/drbd_nl.c b/drbd/drbd_nl.c +--- a/drbd/drbd_nl.c 2025-01-08 14:25:56.369599242 +0800 ++++ b/drbd/drbd_nl.c 2025-01-08 14:32:07.260157474 +0800 +@@ -2068,6 +2068,8 @@ static void get_common_queue_limits(stru + common_limits->physical_block_size = device->device_conf.block_size; + common_limits->logical_block_size = device->device_conf.block_size; + common_limits->io_min = device->device_conf.block_size; ++ if (!(common_limits->features & BLK_FEAT_ZONED)) ++ common_limits->max_zone_append_sectors = 0; + + rcu_read_lock(); + for_each_peer_device_rcu(peer_device, device) { diff --git a/bsc-1216666-compat-sock-Remove-sendpage-in-favour-of-sendmsg-MSG.patch b/bsc-1216666-compat-sock-Remove-sendpage-in-favour-of-sendmsg-MSG.patch deleted file mode 100644 index 244b785..0000000 --- a/bsc-1216666-compat-sock-Remove-sendpage-in-favour-of-sendmsg-MSG.patch +++ /dev/null @@ -1,107 +0,0 @@ -From 6fd35546c2d2afd10afe04ab9cdf4ac9ca0b3e94 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Moritz=20=22WanzenBug=22=20Wanzenb=C3=B6ck?= - -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 228386f448a5..e4a65a3c451e 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 ", "date": "Fri Jun 23 23:55:12 2023 +0100" } */ -+#include -+ -+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.35.3 - diff --git a/drbd-9.1.16.tar.gz b/drbd-9.1.16.tar.gz deleted file mode 100644 index e01fee3..0000000 --- a/drbd-9.1.16.tar.gz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1ad99353dbae62acc1bf4ef32fa8ca317e6657138e02c009e3d4cf42bfb465fb -size 1332576 diff --git a/drbd-9.1.23.tar.gz b/drbd-9.1.23.tar.gz new file mode 100644 index 0000000..01c58e4 --- /dev/null +++ b/drbd-9.1.23.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:27273c96d68d6399bdc0f9a21581c4ebe67fb387206e55f8727d05595baf1cae +size 1481356 diff --git a/drbd.changes b/drbd.changes index 641b8d4..97f42fa 100644 --- a/drbd.changes +++ b/drbd.changes @@ -1,3 +1,306 @@ +------------------------------------------------------------------- +Wed Jan 8 07:08:00 UTC 2025 - Heming Zhao + +- fix the warning of blk_validate_limits when running drbdadm down (boo#1235399) + * add patch + boo1235399-fix_the_warning_of_blk_validate_limits.patch + +------------------------------------------------------------------- +Fri Dec 11 02:35:00 UTC 2024 - Heming Zhao + +- Update DRBD version from 9.1.22 to 9.1.23 (boo#1234849) + + * Changelog from Linbit: + + 9.1.23 (api:genl2/proto:86-101,118-121/transport:18) + -------- + * Fix a corner case that can happen when DRBD establishes multiple + connections in parallel, which could lead one connection to end up in + an inconsistent replication state of WFBitMapT/Established + * Fix a corner case in which a reconciliation resync ends up in + WFBitMapT/Established + * Restrict protocol compatibility to the most recent 8.4 and 9.0 releases + * Fix a corner case causing a module ref leak on drbd_transport_tcp; + if it hits, you can not rmmod it + * rate-limit resync progress while resync is paused + * resync-target inherits history UUIDs when resync finishes, + this can prevent unexpected "unrelared data" events later + * Updated compatibility code for Linux 6.11 and 6.12 + + * remove patches which already included in the new version: + 0001-drbd-properly-rate-limit-resync-progress-reports.patch + 0002-drbd-inherit-history-UUIDs-from-sync-source-when-res.patch + 0003-build-compat-fix-line-offset-in-annotation-pragmas-p.patch + 0004-drbd-fix-exposed_uuid-going-backward.patch + 0005-drbd-Proper-locking-around-new_current_uuid-on-a-dis.patch + 0006-build-CycloneDX-fix-bom-ref-add-purl.patch + 0007-build-Another-update-to-the-spdx-files.patch + 0008-build-generate-spdx.json-not-tag-value-format.patch + 0009-compat-fix-gen_patch_names-for-bdev_file_open_by_pat.patch + 0010-compat-fix-nla_nest_start_noflag-test.patch + 0011-compat-fix-blk_alloc_disk-rule.patch + 0012-drbd-remove-const-from-function-return-type.patch + 0013-drbd-don-t-set-max_write_zeroes_sectors-in-decide_on.patch + 0014-drbd-split-out-a-drbd_discard_supported-helper.patch + 0015-drbd-atomically-update-queue-limits-in-drbd_reconsid.patch + 0016-compat-test-and-patch-for-queue_limits_start_update.patch + 0017-compat-specify-which-essential-change-was-not-made.patch + 0018-gen_patch_names-reorder-blk_mode_t.patch + 0019-compat-fix-blk_queue_update_readahead-patch.patch + 0020-compat-test-and-patch-for-que_limits-max_hw_discard_.patch + 0021-compat-fixup-write_zeroes__no_capable.patch + 0022-compat-fixup-queue_flag_discard__yes_present.patch + 0023-drbd-move-flags-to-queue_limits.patch + 0024-compat-test-and-patch-for-queue_limits.features.patch + 0025-drbd-Annotate-struct-fifo_buffer-with-__counted_by.patch + 0026-compat-test-and-patch-for-__counted_by.patch + 0027-drbd-fix-function-cast-warnings-in-state-machine.patch + 0028-Add-missing-documentation-of-peer_device-parameter-t.patch + 0030-drbd-kref_put-path-when-kernel_accept-fails.patch + 0031-build-fix-typo-in-Makefile.spatch.patch + 0032-drbd-open-do-not-delay-open-if-already-Primary.patch + + * removed patch which is not needed anymore: + boo1231290_fix_drbd_build_error_against_kernel_v6.11.0.patch + boo1233222_fix_drbd_build_error_against_kernel_v6.11.6.patch + bsc-1216666-compat-sock-Remove-sendpage-in-favour-of-sendmsg-MSG.patch + + * update: + drbd_git_revision + drbd.spec + + * add upstream patches to align commit d64ebe7eb7df: + 0001-drbd-Fix-memory-leak.patch + +------------------------------------------------------------------- +Mon Nov 11 12:23:17 UTC 2024 - Glass Su + +- drbd: fix build error against kernel v6.11.6 (boo#1233222) + * add patch + + boo1233222_fix_drbd_build_error_against_kernel_v6.11.6.patch + +------------------------------------------------------------------- +Fri Oct 11 03:30:00 UTC 2024 - heming zhao + +- Update DRBD version from 9.1.16 to 9.1.22 + + * Changelog from Linbit: + + 9.1.22 (api:genl2/proto:86-121/transport:18) + -------- + * Upgrade from partial resync to a full resync if necessary when the + user manually resolves a split-brain situation + * Fix a potential NULL deref when a disk fails while doing a + forget-peer operation. + * Fix a rcu_read_lock()/rcu_read_unlock() imbalance + * Restart the open() syscall when a process auto promoting a drbd device gets + interrupted by a signal + * Remove a deadlock that caused DRBD to connect sometimes + exceptionally slow + * Make detach operations interruptible + * Added dev_is_open to events2 status information + * Improve log readability for 2PC state changes and drbd-threads + * Updated compability code for Linux 6.9 + + 9.1.21 (api:genl2/proto:86-121/transport:18) + -------- + * fix a deadlock that can trigger when deleting a connection and + another connection going down in parallel. This is a regression of + 9.1.20 + * Fix an out-of-bounds access when scanning the bitmap. It leads to a + crash when the bitmap ends on a page boundary, and this is also a + regression in 9.1.20. + + 9.1.20 (api:genl2/proto:86-121/transport:18) + -------- + * Fix a kernel crash that is sometimes triggered when downing drbd + resources in a specific, unusual order (was triggered by the + Kubernetes CSI driver) + * Fix a rarely triggering kernel crash upon adding paths to a + connection by rehauling the path lists' locking + * Fix the continuation of an interrupted initial resync + * Fix the state engine so that an incapable primary does not outdate + indirectly reachable secondary nodes + * Fix a logic bug that caused drbd to pretend that a peer's disk is + outdated when doing a manual disconnect on a down connection; with + that cured impact on fencing and quorum. + * Fix forceful demotion of suspended devices + * Rehaul of the build system to apply compatibility patches out of + place that allows one to build for different target kernels from a + single drbd source tree + * Updated compability code for Linux 6.8 + + 9.1.19 (api:genl2/proto:86-121/transport:18) + -------- + * Fix a resync decision case where drbd wrongly decided to do a full + resync, where a partial resync was sufficient; that happened in a + specific connect order when all nodes were on the same data + generation (UUID) + * Fix the online resize code to obey cached size information about + temporal unreachable nodes + * Fix a rare corner case in which DRBD on a diskless primary node + failed to re-issue a read request to another node with a backing + disk upon connection loss on the connection where it shipped the + read request initially + * Make timeout during promotion attempts interruptible + * No longer write activity-log updates on the secondary node in a + cluster with precisely two nodes with backing disk; this is a + performance optimization + * Reduce CPU usage of acknowledgment processing + + 9.1.18 (api:genl2/proto:86-121/transport:18) + -------- + * Fixed connecting nodes with differently sized backing disks, + specifically when the smaller node is primary, before establishing + the connections + * Fixed thawing a device that has I/O frozen after loss of quorum + when a configuration change eases its quorum requirements + * Properly fail TLS if requested (only available in drbd-9.2) + * Fixed a race condition that can cause auto-demote to trigger right + after an explicit promote + * Fixed a rare race condition that could mess up the handshake result + before it is committed to the replication state. + * Preserve "tiebreaker quorum" over a reboot of the last node (3-node + clusters only) + * Update compatibility code for Linux 6.6 + + 9.1.17 (api:genl2/proto:86-121/transport:18) + -------- + * fix a potential crash when configuring drbd to bind to a + non-existent local IP address (this is a regression of drbd-9.1.8) + * Cure a very seldom triggering race condition bug during + establishing connections; when you triggered it, you got an OOPS + hinting to list corruption + * fix a race condition regarding operations on the bitmap while + forgetting a bitmap slot and a pointless warning + * Fix handling of unexpected (on a resource in secondary role) write + requests + * Fix a corner case that can cause a process to hang when closing the + DRBD device, while a connection gets re-established + * Correctly block signal delivery during auto-demote + * Improve the reliability of establishing connections + * Do not clear the transport with `net-options --set-defaults`. This + fix avoids unexpected disconnect/connect cycles upon an `adjust` + when using the 'lb-tcp' or 'rdma' transports in drbd-9.2. + * New netlink packet to report path status to drbdsetup + * Improvements to the content and rate-limiting of many log messages + * Update compatibility code and follow Linux upstream development + until Linux 6.5 + + * remove patches which already included in the new version: + 0001-drbd-allow-transports-to-take-additional-krefs-on-a-.patch + 0002-drbd-improve-decision-about-marking-a-failed-disk-Ou.patch + 0003-drbd-fix-error-path-in-drbd_get_listener.patch + 0004-drbd-build-fix-spurious-re-build-attempt-of-compat.p.patch + 0005-drbd-log-error-code-when-thread-fails-to-start.patch + 0006-drbd-log-numeric-value-of-drbd_state_rv-as-well-as-s.patch + 0007-drbd-stop-defining-__KERNEL_SYSCALLS__.patch + 0008-compat-block-introduce-holder-ops.patch + 0009-drbd-reduce-net_ee-not-empty-info-to-a-dynamic-debug.patch + 0010-drbd-do-not-send-P_CURRENT_UUID-to-DRBD-8-peer-when-.patch + 0011-compat-block-pass-a-gendisk-to-open.patch + 0012-drbd-Restore-DATA_CORKED-and-CONTROL_CORKED-bits.patch + 0013-drbd-remove-unused-extern-for-conn_try_outdate_peer.patch + 0014-drbd-include-source-of-state-change-in-log.patch + 0015-compat-block-use-the-holder-as-indication-for-exclus.patch + 0016-drbd-Fix-net-options-set-defaults-to-not-clear-the-t.patch + 0017-drbd-propagate-exposed-UUIDs-only-into-established-c.patch + 0018-drbd-rework-autopromote.patch + 0019-compat-block-remove-the-unused-mode-argument-to-rele.patch + 0020-drbd-do-not-allow-auto-demote-to-be-interrupted-by-s.patch + 0021-compat-sock-Remove-sendpage-in-favour-of-sendmsg-MSG.patch + 0022-compat-block-replace-fmode_t-with-a-block-specific-t.patch + 0023-compat-genetlink-remove-userhdr-from-struct-genl_inf.patch + 0024-compat-fixup-FMODE_READ-FMODE_WRITE-usage.patch + 0025-compat-drdb-Convert-to-use-bdev_open_by_path.patch + 0026-compat-gate-blkdev_-patches-behind-bdev_open_by_path.patch + boo1230635_01-compat-fix-nla_nest_start_noflag-test.patch + boo1230635_02-drbd-port-block-device-access-to-file.patch + + * removed patches which are not needed anymore: + boo1229062-re-enable-blk_queue_max_hw_sectors.patch + bsc1226510-fix-build-err-against-6.9.3.patch + + * update: + drbd_git_revision + suse-coccinelle.patch + drbd.spec + + * add upstream patches to align commit 13ada1be201e: + 0001-drbd-properly-rate-limit-resync-progress-reports.patch + 0002-drbd-inherit-history-UUIDs-from-sync-source-when-res.patch + 0003-build-compat-fix-line-offset-in-annotation-pragmas-p.patch + 0004-drbd-fix-exposed_uuid-going-backward.patch + 0005-drbd-Proper-locking-around-new_current_uuid-on-a-dis.patch + 0006-build-CycloneDX-fix-bom-ref-add-purl.patch + 0007-build-Another-update-to-the-spdx-files.patch + 0008-build-generate-spdx.json-not-tag-value-format.patch + 0009-compat-fix-gen_patch_names-for-bdev_file_open_by_pat.patch + 0010-compat-fix-nla_nest_start_noflag-test.patch + 0011-compat-fix-blk_alloc_disk-rule.patch + 0012-drbd-remove-const-from-function-return-type.patch + 0013-drbd-don-t-set-max_write_zeroes_sectors-in-decide_on.patch + 0014-drbd-split-out-a-drbd_discard_supported-helper.patch + 0015-drbd-atomically-update-queue-limits-in-drbd_reconsid.patch + 0016-compat-test-and-patch-for-queue_limits_start_update.patch + 0017-compat-specify-which-essential-change-was-not-made.patch + 0018-gen_patch_names-reorder-blk_mode_t.patch + 0019-compat-fix-blk_queue_update_readahead-patch.patch + 0020-compat-test-and-patch-for-que_limits-max_hw_discard_.patch + 0021-compat-fixup-write_zeroes__no_capable.patch + 0022-compat-fixup-queue_flag_discard__yes_present.patch + 0023-drbd-move-flags-to-queue_limits.patch + 0024-compat-test-and-patch-for-queue_limits.features.patch + 0025-drbd-Annotate-struct-fifo_buffer-with-__counted_by.patch + 0026-compat-test-and-patch-for-__counted_by.patch + 0027-drbd-fix-function-cast-warnings-in-state-machine.patch + 0028-Add-missing-documentation-of-peer_device-parameter-t.patch + 0030-drbd-kref_put-path-when-kernel_accept-fails.patch + 0031-build-fix-typo-in-Makefile.spatch.patch + 0032-drbd-open-do-not-delay-open-if-already-Primary.patch + + * add patch to fix kernel imcompatibility issue (boo#1231290): + boo1231290_fix_drbd_build_error_against_kernel_v6.11.0.patch + +------------------------------------------------------------------- +Tue Sep 17 11:38:00 UTC 2024 - heming zhao + +- drbdadm down fails to remove sysfs holder file (boo#1230635) + * add patch + + boo1230635_01-compat-fix-nla_nest_start_noflag-test.patch + + boo1230635_02-drbd-port-block-device-access-to-file.patch + * update patch + + bsc1226510-fix-build-err-against-6.9.3.patch + +------------------------------------------------------------------- +Mon Aug 12 07:37:42 UTC 2024 - heming zhao + +- drbd: fix build error against kernel v6.10.3 (boo#1229062) + * add patch + + boo1229062-re-enable-blk_queue_max_hw_sectors.patch + +------------------------------------------------------------------- +Wed Jun 19 07:54:17 UTC 2024 - heming zhao + +- drbd: fix build error against kernel v6.9.3 (boo#1226510) + * add patch + + bsc1226510-fix-build-err-against-6.9.3.patch + +------------------------------------------------------------------ +Tue Apr 15 07:50:00 UTC 2024 - Glass Su + +- drbd: fix build error against kernel v6.8.2 (boo#1222397) + * add upstream patches + + 0024-compat-fixup-FMODE_READ-FMODE_WRITE-usage.patch + + 0025-compat-drdb-Convert-to-use-bdev_open_by_path.patch + + 0026-compat-gate-blkdev_-patches-behind-bdev_open_by_path.patch + +------------------------------------------------------------------- +Mon Feb 26 07:45:54 UTC 2024 - Dominique Leuenberger + +- Use %autosetup macro. Allows to eliminate the usage of deprecated + PatchN. + ------------------------------------------------------------------ Wed Jan 10 01:55:00 UTC 2024 - Heming Zhao @@ -12,6 +315,16 @@ Wed Jan 10 01:55:00 UTC 2024 - Heming Zhao + 0019-compat-block-remove-the-unused-mode-argument-to-rele.patch + 0022-compat-block-replace-fmode_t-with-a-block-specific-t.patch + 0023-compat-genetlink-remove-userhdr-from-struct-genl_inf.patch +------------------------------------------------------------------ +Tue Nov 13 11:56:00 UTC 2023 - Glass Su + +- drbd: fix build error against kernel v6.6.1 (boo#1217078) + * add upstream patches + + 0021-compat-sock-Remove-sendpage-in-favour-of-sendmsg-MSG.patch + + 0022-compat-block-replace-fmode_t-with-a-block-specific-t.patch + + 0023-compat-genetlink-remove-userhdr-from-struct-genl_inf.patch + * remove patch which are already included in upstream patches: + - bsc-1215699_fix-build-error-against-kernel-v6.5.4.patch ------------------------------------------------------------------ Wed Nov 8 07:47:00 UTC 2023 - Heming Zhao @@ -26,6 +339,33 @@ Tue Oct 31 10:16:00 UTC 2023 - Heming Zhao - drbd failed to build after 15sp6/dolomit updated kernel (bsc#1216666) * Add patch + 0008-compat-block-introduce-holder-ops.patch +------------------------------------------------------------------ +Tue Sep 26 03:35:00 UTC 2023 - Heming Zhao + +- drbd: fix build error against kernel v6.5.4 (boo#1215699) + * add upstream patch + + 0001-drbd-allow-transports-to-take-additional-krefs-on-a-.patch + + 0002-drbd-improve-decision-about-marking-a-failed-disk-Ou.patch + + 0003-drbd-fix-error-path-in-drbd_get_listener.patch + + 0004-drbd-build-fix-spurious-re-build-attempt-of-compat.p.patch + + 0005-drbd-log-error-code-when-thread-fails-to-start.patch + + 0006-drbd-log-numeric-value-of-drbd_state_rv-as-well-as-s.patch + + 0007-drbd-stop-defining-__KERNEL_SYSCALLS__.patch + + 0008-compat-block-introduce-holder-ops.patch + + 0009-drbd-reduce-net_ee-not-empty-info-to-a-dynamic-debug.patch + + 0010-drbd-do-not-send-P_CURRENT_UUID-to-DRBD-8-peer-when-.patch + + 0011-compat-block-pass-a-gendisk-to-open.patch + + 0012-drbd-Restore-DATA_CORKED-and-CONTROL_CORKED-bits.patch + + 0013-drbd-remove-unused-extern-for-conn_try_outdate_peer.patch + + 0014-drbd-include-source-of-state-change-in-log.patch + + 0015-compat-block-use-the-holder-as-indication-for-exclus.patch + + 0016-drbd-Fix-net-options-set-defaults-to-not-clear-the-t.patch + + 0017-drbd-propagate-exposed-UUIDs-only-into-established-c.patch + + 0018-drbd-rework-autopromote.patch + + 0019-compat-block-remove-the-unused-mode-argument-to-rele.patch + + 0020-drbd-do-not-allow-auto-demote-to-be-interrupted-by-s.patch + * add suse special patch + + bsc-1215699_fix-build-error-against-kernel-v6.5.4.patch ------------------------------------------------------------------ Mon Sep 04 11:35:00 UTC 2023 - Heming Zhao diff --git a/drbd.spec b/drbd.spec index 430391b..a7fc0fb 100644 --- a/drbd.spec +++ b/drbd.spec @@ -23,31 +23,26 @@ %define buildrt 1 %endif %endif - Name: drbd -Version: 9.1.16 +Version: 9.1.23 Release: 0 Summary: Linux driver for the "Distributed Replicated Block Device" License: GPL-2.0-or-later -URL: https://drbd.linbit.com/ +URL: https://pkg.linbit.com/ Source: %{name}-%{version}.tar.gz Source1: preamble Source2: Module.supported Source3: drbd_git_revision -Patch1: bsc-1025089_fix-resync-finished-with-syncs-have-bits-set.patch -Patch2: 0006-drbd-log-numeric-value-of-drbd_state_rv-as-well-as-s.patch -Patch3: 0008-compat-block-introduce-holder-ops.patch -Patch4: 0011-compat-block-pass-a-gendisk-to-open.patch -Patch5: 0013-drbd-remove-unused-extern-for-conn_try_outdate_peer.patch -Patch6: 0014-drbd-include-source-of-state-change-in-log.patch -Patch7: 0015-compat-block-use-the-holder-as-indication-for-exclus.patch -Patch8: 0018-drbd-rework-autopromote.patch -Patch9: 0019-compat-block-remove-the-unused-mode-argument-to-rele.patch -Patch10: 0022-compat-block-replace-fmode_t-with-a-block-specific-t.patch -Patch11: 0023-compat-genetlink-remove-userhdr-from-struct-genl_inf.patch -Patch12: bsc-1216666-compat-sock-Remove-sendpage-in-favour-of-sendmsg-MSG.patch -Patch99: suse-coccinelle.patch +######################## +# upstream patch +Patch0001: 0001-drbd-Fix-memory-leak.patch + +# suse special patch +Patch1001: bsc-1025089_fix-resync-finished-with-syncs-have-bits-set.patch +Patch1002: suse-coccinelle.patch +Patch1003: boo1235399-fix_the_warning_of_blk_validate_limits.patch +######################## #https://github.com/openSUSE/rpmlint-checks/blob/master/KMPPolicyCheck.py BuildRequires: coccinelle >= 1.0.8 @@ -55,6 +50,7 @@ BuildRequires: kernel-source BuildRequires: kernel-syms BuildRequires: libelf-devel BuildRequires: modutils +BuildRequires: perl BuildRequires: %kernel_module_package_buildreqs Requires: drbd-utils >= 9.3.0 Supplements: drbd-utils >= 9.3.0 @@ -81,24 +77,7 @@ that multiple kernel driver versions can be installed, one for each installed kernel. %prep -%setup -q -n drbd-%{version} -%patch1 -p1 -%patch2 -p1 -%patch3 -p1 -%patch4 -p1 -%patch5 -p1 -%patch6 -p1 -%patch7 -p1 -%patch8 -p1 -%patch9 -p1 -%patch10 -p1 -%patch11 -p1 -%patch12 -p1 -%patch99 -p1 - -mkdir source -cp -a drbd/. source/. || : -cp $RPM_SOURCE_DIR/drbd_git_revision source/.drbd_git_revision +%autosetup -p1 -n drbd-%{version} %build rm -rf obj @@ -114,26 +93,33 @@ export SPAAS='false' for flavor in %{flavors_to_build}; do rm -rf $flavor - cp -a -r source $flavor - cp -a %{_sourcedir}/Module.supported $flavor + cp -a -r drbd $flavor + cp $RPM_SOURCE_DIR/drbd_git_revision ${flavor}/.drbd_git_revision + export DRBDSRC="$PWD/obj/$flavor" # bsc#1160194, check the coccicheck work. #make coccicheck - make %{?_smp_mflags} -C %{kernel_source $flavor} modules M=$PWD/$flavor SPAAS=${SPAAS} + + # call make prep to generate drbd build dir + make %{?_smp_mflags} -C $flavor KDIR=%{kernel_source $flavor} prep SPAAS=${SPAAS} + + cp -a %{_sourcedir}/Module.supported ${flavor}/build-current + + make %{?_smp_mflags} -C %{kernel_source $flavor} modules M=$PWD/$flavor/build-current SPAAS=${SPAAS} # Check the compat result - cat $PWD/$flavor/compat.h + cat $PWD/${flavor}/build-current/compat.h done %install export INSTALL_MOD_PATH=%{buildroot} export INSTALL_MOD_DIR=updates for flavor in %{flavors_to_build}; do - make -C %{kernel_source $flavor} modules_install M=$PWD/$flavor + make -C %{kernel_source $flavor} modules_install M=$PWD/$flavor/build-current done mkdir -p %{buildroot}/%{_sbindir} -ln -s -f %{_sbindir}/service %{buildroot}/%{_sbindir}/rc%{name} +ln -s service %{buildroot}/%{_sbindir}/rc%{name} rm -f drbd.conf %files diff --git a/drbd_git_revision b/drbd_git_revision index 634f6fa..72b4510 100644 --- a/drbd_git_revision +++ b/drbd_git_revision @@ -1 +1 @@ -GIT-hash: 288abda1fb8c93e385960af01ab28729fefdaa38 +GIT-hash: d64ebe7eb7df8c622b20bca38f3d7f4c7bb033c9 diff --git a/suse-coccinelle.patch b/suse-coccinelle.patch index 8ffdb7b..f44470b 100644 --- a/suse-coccinelle.patch +++ b/suse-coccinelle.patch @@ -1,76 +1,71 @@ -diff -Naur drbd-9.0.29~0+git.9a7bc817.orig/drbd/drbd-kernel-compat/gen_compat_patch.sh drbd-9.0.29~0+git.9a7bc817/drbd/drbd-kernel-compat/gen_compat_patch.sh ---- drbd-9.0.29~0+git.9a7bc817.orig/drbd/drbd-kernel-compat/gen_compat_patch.sh 2021-05-07 11:24:44.877547149 +0800 -+++ drbd-9.0.29~0+git.9a7bc817/drbd/drbd-kernel-compat/gen_compat_patch.sh 2021-05-07 12:30:58.385703306 +0800 -@@ -44,9 +44,19 @@ +diff -Nupr a/drbd/drbd-kernel-compat/gen_compat_patch.sh b/drbd/drbd-kernel-compat/gen_compat_patch.sh +--- a/drbd/drbd-kernel-compat/gen_compat_patch.sh 2024-09-16 10:24:47.044861735 +0800 ++++ b/drbd/drbd-kernel-compat/gen_compat_patch.sh 2024-09-16 10:32:03.256040980 +0800 +@@ -43,9 +43,19 @@ fi if hash spatch && spatch_is_recent; then - K=$(cat $incdir/kernelrelease.txt) + K=$(cat $incdir/kernelrelease.txt || echo unknown kernel release) + -+ echo " compat.h content "; -+ cat $incdir/compat.h; -+ echo " ------------------- "; ++ echo " compat.h content "; ++ cat $incdir/compat.h; ++ echo " ------------------- "; + - echo " GENPATCHNAMES "$K - gcc -I $incdir -o $incdir/gen_patch_names -std=c99 drbd-kernel-compat/gen_patch_names.c - $incdir/gen_patch_names > $incdir/applied_cocci_files.txt + echo " GENPATCHNAMES "$K + gcc -I $incdir -o $incdir/gen_patch_names -std=c99 drbd-kernel-compat/gen_patch_names.c + $incdir/gen_patch_names > $incdir/applied_cocci_files.txt + -+ echo " APPLIED_COCCI_FILES "; -+ cat $incdir/applied_cocci_files.txt; -+ echo " ------------------- "; ++ echo " APPLIED_COCCI_FILES "; ++ cat $incdir/applied_cocci_files.txt; ++ echo " ------------------- "; + - rm $incdir/gen_patch_names - rm -f $incdir/.compat.cocci - rm -f $incdir/.compat.patch -@@ -67,7 +77,15 @@ - < drbd-kernel-compat/cocci/debugfs_compat_template.cocci.in \ - >> $incdir/.compat.cocci - done -+ -+ coccilibpath=$(rpm -ql coccinelle|grep standard.h|xargs dirname); -+ echo " SPATCH_SOURCES: "$*; -+ echo " COCCI_LIBPATH: "$coccilibpath; -+ - if [ -e $incdir/.compat.cocci ]; then -+ echo " GENCOCCIRULES .compat.cocci"; -+ cat $incdir/.compat.cocci; -+ - echo " SPATCH $chksum "$K - # Note: $* (or $@) is NOT make magic variable now, this is a shell script - # make $@, the target file, was passed as $1, and is now $compat_patch -@@ -77,8 +95,14 @@ - # we know we don't have white-space in the argument list + rm $incdir/gen_patch_names + # truncat them all + : > $incdir/.compat.cocci +@@ -72,15 +82,28 @@ if hash spatch && spatch_is_recent; then + >> $incdir/.compat.cocci.tmp + done - set +e ++ coccilibpath=$(rpm -ql coccinelle|grep standard.h|xargs dirname); ++ echo " SPATCH_SOURCES: "$*; ++ echo " COCCI_LIBPATH: "$coccilibpath; + -+ command="spatch --sp-file $incdir/.compat.cocci $@ --macro-file drbd-kernel-compat/cocci_macros.h --macro-file-builtins $coccilibpath/standard.h --iso-file $coccilibpath/standard.iso --very-quiet --all-includes > $compat_patch.tmp 2> $incdir/.spatch.stderr" -+ echo " SPATCH COMMAND $command "; + mv $incdir/.compat.cocci.tmp $incdir/.compat.cocci + mv $incdir/.compat.patch.tmp $incdir/.compat.patch + + if [ -s $incdir/.compat.cocci ]; then ++ echo " GENCOCCIRULES .compat.cocci"; ++ cat $incdir/.compat.cocci; + - spatch --sp-file "$incdir/.compat.cocci" "$@" \ - --macro-file drbd-kernel-compat/cocci_macros.h \ -+ --macro-file-builtins $coccilibpath/standard.h \ -+ --iso-file $coccilibpath/standard.iso \ - --very-quiet \ - --all-includes \ - > "$compat_patch.tmp" \ -@@ -94,9 +118,21 @@ - echo " SPATCH $chksum "$K" - nothing to do" - touch $compat_patch.tmp - fi + # sources=( ... ) passed in via environment + echo " SPATCH $chksum "$K + set +e + -+ echo " GENSPATCHFILE $compat_patch.tmp "; -+ cat $compat_patch.tmp; ++ command="spatch --sp-file $incdir/.compat.cocci $@ --macro-file drbd-kernel-compat/cocci_macros.h --macro-file-builtins $coccilibpath/standard.h --iso-file $coccilibpath/standard.iso --very-quiet --all-includes > $compat_patch.tmp 2> $incdir/.spatch.stderr" ++ echo " SPATCH COMMAND $command "; + - if [ -e $incdir/.compat.patch ]; then -+ echo " EXIST $incdir/.compat.patch "; - cat $incdir/.compat.patch >> $compat_patch.tmp + spatch --sp-file "$incdir/.compat.cocci" "${sources[@]}" \ + --macro-file drbd-kernel-compat/cocci_macros.h \ ++ --macro-file-builtins $coccilibpath/standard.h \ ++ --iso-file $coccilibpath/standard.iso \ + --very-quiet \ + --all-includes \ + ${SPATCH_DEBUG:+ --debug} \ +@@ -101,8 +124,18 @@ if hash spatch && spatch_is_recent; then + echo " SPATCH $chksum "$K" - nothing to do" + fi + ++ echo " GENSPATCHFILE $compat_patch.tmp "; + cat $compat_patch.tmp; - fi + -+ if [ -e $incdir/.spatch.stderr ]; then -+ echo " GENSPATCHERR .spatch.stderr"; -+ cat $incdir/.spatch.stderr; -+ fi + if [ -s $incdir/.compat.patch ]; then ++ echo " EXIST $incdir/.compat.patch "; + cat $incdir/.compat.patch >> $compat_patch.tmp ++ cat $compat_patch.tmp; ++ fi + - mv $compat_patch.tmp $compat_patch - # keep it around - # to better be able to match the "stderr" warnings to their source files ++ if [ -e $incdir/.spatch.stderr ]; then ++ echo " GENSPATCHERR .spatch.stderr"; ++ cat $incdir/.spatch.stderr; + fi + + if [ -s $compat_patch.tmp ]; then