Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package drbd for openSUSE:Factory checked in 
at 2024-10-11 17:02:35
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/drbd (Old)
 and      /work/SRC/openSUSE:Factory/.drbd.new.19354 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "drbd"

Fri Oct 11 17:02:35 2024 rev:112 rq:1207029 version:9.1.22

Changes:
--------
--- /work/SRC/openSUSE:Factory/drbd/drbd.changes        2024-09-17 
18:20:27.488567676 +0200
+++ /work/SRC/openSUSE:Factory/.drbd.new.19354/drbd.changes     2024-10-11 
17:02:47.743879300 +0200
@@ -1,0 +2,183 @@
+Fri Oct 11 03:30:00 UTC 2024 - heming zhao <[email protected]>
+
+- 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
+
+-------------------------------------------------------------------

Old:
----
  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
  boo1229062-re-enable-blk_queue_max_hw_sectors.patch
  boo1230635_01-compat-fix-nla_nest_start_noflag-test.patch
  boo1230635_02-drbd-port-block-device-access-to-file.patch
  bsc1226510-fix-build-err-against-6.9.3.patch
  drbd-9.1.16.tar.gz

New:
----
  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
  boo1231290_fix_drbd_build_error_against_kernel_v6.11.0.patch
  drbd-9.1.22.tar.gz

BETA DEBUG BEGIN:
  Old:  * 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
  Old:     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
  Old:     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
  Old:     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
  Old:     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
  Old:     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
  Old:     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
  Old:     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
  Old:     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
  Old:     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
  Old:     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
  Old:     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
  Old:     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
  Old:     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
  Old:     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
  Old:     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
  Old:     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
  Old:     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
  Old:     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
  Old:     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
  Old:     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
  Old:     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
  Old:     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
  Old:     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
  Old:     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
  Old:     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
  Old:  * 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
  Old:     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
  Old:     boo1230635_01-compat-fix-nla_nest_start_noflag-test.patch
     boo1230635_02-drbd-port-block-device-access-to-file.patch
   
  Old:     boo1229062-re-enable-blk_queue_max_hw_sectors.patch
     bsc1226510-fix-build-err-against-6.9.3.patch
   
BETA DEBUG END:

BETA DEBUG BEGIN:
  New:  * 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
  New:     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
  New:     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
  New:     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
  New:     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
  New:     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
  New:     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
  New:     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
  New:     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
  New:     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
  New:     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
  New:     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
  New:     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
  New:     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
  New:     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
  New:     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
  New:     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
  New:     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
  New:     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
  New:     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
  New:     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
  New:     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
  New:     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
  New:     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
  New:     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
  New:     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
  New:     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
  New:     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
  New:     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
  New:     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
  New:     0031-build-fix-typo-in-Makefile.spatch.patch
     0032-drbd-open-do-not-delay-open-if-already-Primary.patch
   
  New:  * add patch to fix kernel imcompatibility issue (boo#1231290):
     boo1231290_fix_drbd_build_error_against_kernel_v6.11.0.patch
BETA DEBUG END:

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ drbd.spec ++++++
--- /var/tmp/diff_new_pack.dOzgE3/_old  2024-10-11 17:02:49.207941318 +0200
+++ /var/tmp/diff_new_pack.dOzgE3/_new  2024-10-11 17:02:49.207941318 +0200
@@ -24,11 +24,11 @@
 %endif
 %endif
 Name:           drbd
-Version:        9.1.16
+Version:        9.1.22
 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
@@ -36,40 +36,43 @@
 
 ########################
 # upstream patch
-Patch0001:   0001-drbd-allow-transports-to-take-additional-krefs-on-a-.patch
-Patch0002:   0002-drbd-improve-decision-about-marking-a-failed-disk-Ou.patch
-Patch0003:   0003-drbd-fix-error-path-in-drbd_get_listener.patch
-Patch0004:   0004-drbd-build-fix-spurious-re-build-attempt-of-compat.p.patch
-Patch0005:   0005-drbd-log-error-code-when-thread-fails-to-start.patch
-Patch0006:   0006-drbd-log-numeric-value-of-drbd_state_rv-as-well-as-s.patch
-Patch0007:   0007-drbd-stop-defining-__KERNEL_SYSCALLS__.patch
-Patch0008:   0008-compat-block-introduce-holder-ops.patch
-Patch0009:   0009-drbd-reduce-net_ee-not-empty-info-to-a-dynamic-debug.patch
-Patch0010:   0010-drbd-do-not-send-P_CURRENT_UUID-to-DRBD-8-peer-when-.patch
-Patch0011:   0011-compat-block-pass-a-gendisk-to-open.patch
-Patch0012:   0012-drbd-Restore-DATA_CORKED-and-CONTROL_CORKED-bits.patch
-Patch0013:   0013-drbd-remove-unused-extern-for-conn_try_outdate_peer.patch
-Patch0014:   0014-drbd-include-source-of-state-change-in-log.patch
-Patch0015:   0015-compat-block-use-the-holder-as-indication-for-exclus.patch
-Patch0016:   0016-drbd-Fix-net-options-set-defaults-to-not-clear-the-t.patch
-Patch0017:   0017-drbd-propagate-exposed-UUIDs-only-into-established-c.patch
-Patch0018:   0018-drbd-rework-autopromote.patch
-Patch0019:   0019-compat-block-remove-the-unused-mode-argument-to-rele.patch
-Patch0020:   0020-drbd-do-not-allow-auto-demote-to-be-interrupted-by-s.patch
-Patch0021:   0021-compat-sock-Remove-sendpage-in-favour-of-sendmsg-MSG.patch
-Patch0022:   0022-compat-block-replace-fmode_t-with-a-block-specific-t.patch
-Patch0023:   0023-compat-genetlink-remove-userhdr-from-struct-genl_inf.patch
-Patch0024:   0024-compat-fixup-FMODE_READ-FMODE_WRITE-usage.patch
-Patch0025:   0025-compat-drdb-Convert-to-use-bdev_open_by_path.patch
-Patch0026:   0026-compat-gate-blkdev_-patches-behind-bdev_open_by_path.patch
-Patch0027:   boo1230635_01-compat-fix-nla_nest_start_noflag-test.patch
-Patch0028:   boo1230635_02-drbd-port-block-device-access-to-file.patch
+Patch0001:  0001-drbd-properly-rate-limit-resync-progress-reports.patch
+Patch0002:  0002-drbd-inherit-history-UUIDs-from-sync-source-when-res.patch
+Patch0003:  0003-build-compat-fix-line-offset-in-annotation-pragmas-p.patch
+Patch0004:  0004-drbd-fix-exposed_uuid-going-backward.patch
+Patch0005:  0005-drbd-Proper-locking-around-new_current_uuid-on-a-dis.patch
+Patch0006:  0006-build-CycloneDX-fix-bom-ref-add-purl.patch
+Patch0007:  0007-build-Another-update-to-the-spdx-files.patch
+Patch0008:  0008-build-generate-spdx.json-not-tag-value-format.patch
+Patch0009:  0009-compat-fix-gen_patch_names-for-bdev_file_open_by_pat.patch
+Patch0010:  0010-compat-fix-nla_nest_start_noflag-test.patch
+Patch0011:  0011-compat-fix-blk_alloc_disk-rule.patch
+Patch0012:  0012-drbd-remove-const-from-function-return-type.patch
+Patch0013:  0013-drbd-don-t-set-max_write_zeroes_sectors-in-decide_on.patch
+Patch0014:  0014-drbd-split-out-a-drbd_discard_supported-helper.patch
+Patch0015:  0015-drbd-atomically-update-queue-limits-in-drbd_reconsid.patch
+Patch0016:  0016-compat-test-and-patch-for-queue_limits_start_update.patch
+Patch0017:  0017-compat-specify-which-essential-change-was-not-made.patch
+Patch0018:  0018-gen_patch_names-reorder-blk_mode_t.patch
+Patch0019:  0019-compat-fix-blk_queue_update_readahead-patch.patch
+Patch0020:  0020-compat-test-and-patch-for-que_limits-max_hw_discard_.patch
+Patch0021:  0021-compat-fixup-write_zeroes__no_capable.patch
+Patch0022:  0022-compat-fixup-queue_flag_discard__yes_present.patch
+Patch0023:  0023-drbd-move-flags-to-queue_limits.patch
+Patch0024:  0024-compat-test-and-patch-for-queue_limits.features.patch
+Patch0025:  0025-drbd-Annotate-struct-fifo_buffer-with-__counted_by.patch
+Patch0026:  0026-compat-test-and-patch-for-__counted_by.patch
+Patch0027:  0027-drbd-fix-function-cast-warnings-in-state-machine.patch
+Patch0028:  0028-Add-missing-documentation-of-peer_device-parameter-t.patch
+#  0029-ci-update-build-helpers.patch is fedora special, we ignore it.
+Patch0029:  0030-drbd-kref_put-path-when-kernel_accept-fails.patch
+Patch0030:  0031-build-fix-typo-in-Makefile.spatch.patch
+Patch0031:  0032-drbd-open-do-not-delay-open-if-already-Primary.patch
 
 # suse special patch
 Patch1001:   bsc-1025089_fix-resync-finished-with-syncs-have-bits-set.patch
 Patch1002:   suse-coccinelle.patch
-Patch1003:   bsc1226510-fix-build-err-against-6.9.3.patch
-Patch1004:   boo1229062-re-enable-blk_queue_max_hw_sectors.patch
+Patch1003:  boo1231290_fix_drbd_build_error_against_kernel_v6.11.0.patch
 ########################
 
 #https://github.com/openSUSE/rpmlint-checks/blob/master/KMPPolicyCheck.py
@@ -78,6 +81,7 @@
 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
@@ -106,10 +110,6 @@
 %prep
 %autosetup -p1 -n drbd-%{version}
 
-mkdir source
-cp -a drbd/. source/. || :
-cp $RPM_SOURCE_DIR/drbd_git_revision source/.drbd_git_revision
-
 %build
 rm -rf obj
 mkdir obj
@@ -124,22 +124,29 @@
 
 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}

++++++ 0001-drbd-properly-rate-limit-resync-progress-reports.patch ++++++
>From aab03bfc73a62f95011316545a5c0fbb4817741b Mon Sep 17 00:00:00 2001
From: Lars Ellenberg <[email protected]>
Date: Wed, 14 Aug 2024 11:49:42 +0200
Subject: [PATCH 01/32] drbd: properly rate-limit resync progress reports

A peer_device in "paused" sync would have flooded the "drbd events2"
generic netlink broadcast with "resync progress reports",
if it cleared significant out-of-sync bits,
as is the case with application writes,
or several peers syncing from the same sync source
and having a "paused sync" replication state between themselves.

If you have "many" such resources, this storm may even overflow receive buffers.
At most one progress report every three seconds should be enough,
and is what was intended.

Use a new "last progress report time stamp" to throttle
advancing resync progress marks and progress report broadcasts.
---
 drbd/drbd_actlog.c   | 35 +++++++++++++++++++++++------------
 drbd/drbd_int.h      |  1 +
 drbd/drbd_receiver.c |  1 +
 drbd/drbd_state.c    |  2 ++
 4 files changed, 27 insertions(+), 12 deletions(-)

diff --git a/drbd/drbd_actlog.c b/drbd/drbd_actlog.c
index b96560843878..646dcb29e1d9 100644
--- a/drbd/drbd_actlog.c
+++ b/drbd/drbd_actlog.c
@@ -1020,19 +1020,30 @@ static bool update_rs_extent(struct drbd_peer_device 
*peer_device,
 
 void drbd_advance_rs_marks(struct drbd_peer_device *peer_device, unsigned long 
still_to_go)
 {
-       unsigned long now = jiffies;
-       unsigned long last = 
peer_device->rs_mark_time[peer_device->rs_last_mark];
-       int next = (peer_device->rs_last_mark + 1) % DRBD_SYNC_MARKS;
-       if (time_after_eq(now, last + DRBD_SYNC_MARK_STEP)) {
-               if (peer_device->rs_mark_left[peer_device->rs_last_mark] != 
still_to_go &&
-                   peer_device->repl_state[NOW] != L_PAUSED_SYNC_T &&
-                   peer_device->repl_state[NOW] != L_PAUSED_SYNC_S) {
-                       peer_device->rs_mark_time[next] = now;
-                       peer_device->rs_mark_left[next] = still_to_go;
-                       peer_device->rs_last_mark = next;
-               }
-               drbd_peer_device_post_work(peer_device, RS_PROGRESS);
+       unsigned long now;
+       int next;
+
+       /* report progress and advance marks only if we made progress */
+       if (peer_device->rs_mark_left[peer_device->rs_last_mark] == still_to_go)
+               return;
+
+       /* report progress and advance marks at most once every 
DRBD_SYNC_MARK_STEP (3 seconds) */
+       now = jiffies;
+       if (!time_after_eq(now, peer_device->rs_last_progress_report_ts + 
DRBD_SYNC_MARK_STEP))
+               return;
+
+       /* Do not advance marks if we are "paused" */
+       if (peer_device->repl_state[NOW] != L_PAUSED_SYNC_T &&
+           peer_device->repl_state[NOW] != L_PAUSED_SYNC_S) {
+               next = (peer_device->rs_last_mark + 1) % DRBD_SYNC_MARKS;
+               peer_device->rs_mark_time[next] = now;
+               peer_device->rs_mark_left[next] = still_to_go;
+               peer_device->rs_last_mark = next;
        }
+
+       /* But still report progress even if paused. */
+       peer_device->rs_last_progress_report_ts = now;
+       drbd_peer_device_post_work(peer_device, RS_PROGRESS);
 }
 
 /* It is called lazy update, so don't do write-out too often. */
diff --git a/drbd/drbd_int.h b/drbd/drbd_int.h
index 49bd7b0c407c..c18407899f59 100644
--- a/drbd/drbd_int.h
+++ b/drbd/drbd_int.h
@@ -1285,6 +1285,7 @@ struct drbd_peer_device {
        unsigned long rs_paused;
        /* skipped because csum was equal [unit BM_BLOCK_SIZE] */
        unsigned long rs_same_csum;
+       unsigned long rs_last_progress_report_ts;
 #define DRBD_SYNC_MARKS 8
 #define DRBD_SYNC_MARK_STEP (3*HZ)
        /* block not up-to-date at mark [unit BM_BLOCK_SIZE] */
diff --git a/drbd/drbd_receiver.c b/drbd/drbd_receiver.c
index 19634f6423bd..ee54cf3ac116 100644
--- a/drbd/drbd_receiver.c
+++ b/drbd/drbd_receiver.c
@@ -3409,6 +3409,7 @@ static int receive_DataRequest(struct drbd_connection 
*connection, struct packet
                        peer_device->ov_skipped = 0;
                        peer_device->rs_total = ov_left;
                        peer_device->rs_last_writeout = now;
+                       peer_device->rs_last_progress_report_ts = now;
                        for (i = 0; i < DRBD_SYNC_MARKS; i++) {
                                peer_device->rs_mark_left[i] = ov_left;
                                peer_device->rs_mark_time[i] = now;
diff --git a/drbd/drbd_state.c b/drbd/drbd_state.c
index be1de8f0653b..44f55ee5c939 100644
--- a/drbd/drbd_state.c
+++ b/drbd/drbd_state.c
@@ -2483,6 +2483,7 @@ static void initialize_resync_progress_marks(struct 
drbd_peer_device *peer_devic
        unsigned long now = jiffies;
        int i;
 
+       peer_device->rs_last_progress_report_ts = now;
        for (i = 0; i < DRBD_SYNC_MARKS; i++) {
                peer_device->rs_mark_left[i] = tw;
                peer_device->rs_mark_time[i] = now;
@@ -2730,6 +2731,7 @@ static void finish_state_change(struct drbd_resource 
*resource, const char *tag)
                                peer_device->ov_last_skipped_size = 0;
                                peer_device->ov_last_skipped_start = 0;
                                peer_device->rs_last_writeout = now;
+                               peer_device->rs_last_progress_report_ts = now;
                                for (i = 0; i < DRBD_SYNC_MARKS; i++) {
                                        peer_device->rs_mark_left[i] = 
peer_device->rs_total;
                                        peer_device->rs_mark_time[i] = now;
-- 
2.35.3


++++++ 0002-drbd-inherit-history-UUIDs-from-sync-source-when-res.patch ++++++
>From f6613104a37c1d43cb50fd619afccba370db47a0 Mon Sep 17 00:00:00 2001
From: Joel Colledge <[email protected]>
Date: Tue, 20 Aug 2024 12:28:09 +0100
Subject: [PATCH 02/32] drbd: inherit history UUIDs from sync source when
 resync finishes

This prevents unexpected "unrelated data" or "split-brain" situations
from occurring later. For example with nodes A, B and C:
* A diskless, B, C with disk, all connected, on UUID X
* Down B
* Write on C, new UUID Y generated
* Add disk on A, resyncs from C
* Down C
* Up B, connects to A, should resync from A

Without this change, "unrelated data" or "split-brain" occurs between A
and B.
Node A has current UUID Y, but knows nothing about X.
Node B has current UUID X, but knows nothing about Y.

This scenario is also possible with "quorum majority".

Fix this by adding the history and bitmap UUIDs from the sync source
into the history on the sync target when a resync finishes. In the above
scenario, this adds the UUID X into the history on A and so has the
effect that a full sync from A to B occurs in the final step.
---
 drbd/drbd_main.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/drbd/drbd_main.c b/drbd/drbd_main.c
index 7968be7c4c3f..862438885f35 100644
--- a/drbd/drbd_main.c
+++ b/drbd/drbd_main.c
@@ -5030,11 +5030,22 @@ u64 drbd_uuid_resync_finished(struct drbd_peer_device 
*peer_device) __must_hold(
 {
        struct drbd_device *device = peer_device->device;
        unsigned long flags;
+       int i;
        u64 ss_nz_bm; /* sync_source has non zero bitmap for. expressed as 
nodemask */
        u64 pwcu; /* peers with current uuid */
        u64 newer;
 
        spin_lock_irqsave(&device->ldev->md.uuid_lock, flags);
+       // Inherit history from the sync source
+       for (i = 0; i < ARRAY_SIZE(peer_device->history_uuids); i++)
+               _drbd_uuid_push_history(device, peer_device->history_uuids[i] & 
~UUID_PRIMARY);
+
+       // Inherit history in bitmap UUIDs from the sync source
+       for (i = 0; i < DRBD_PEERS_MAX; i++)
+               if (peer_device->bitmap_uuids[i] != -1)
+                       _drbd_uuid_push_history(device,
+                                       peer_device->bitmap_uuids[i] & 
~UUID_PRIMARY);
+
        ss_nz_bm = __test_bitmap_slots_of_peer(peer_device);
        pwcu = peers_with_current_uuid(device, peer_device->current_uuid);
 
-- 
2.35.3


++++++ 0003-build-compat-fix-line-offset-in-annotation-pragmas-p.patch ++++++
>From d6f2b71109f6a589fbc3d5c571c840a6bd142943 Mon Sep 17 00:00:00 2001
From: Lars Ellenberg <[email protected]>
Date: Thu, 22 Aug 2024 16:05:25 +0200
Subject: [PATCH 03/32] build,compat: fix line offset in annotation pragmas
 pointing to patched sources

I forgot to update the "new position" by the two output pragma lines
for each non-context to context line transition per chunk.

Offsets would accumultate within the chunk, but reset with the next chunk.

Pragmas pointing into the "patched" file would be off by two lines
(per such transition within a chunk), pointing to some line 2 (4,6,8) lines
above the actual offending line.

Noticed during recent compat work when the backward compat cocci rules
where still incomplete.
---
 .../annotate-diff-with-original-file-position-pragmas.pl         | 1 +
 1 file changed, 1 insertion(+)

diff --git 
a/drbd/drbd-kernel-compat/annotate-diff-with-original-file-position-pragmas.pl 
b/drbd/drbd-kernel-compat/annotate-diff-with-original-file-position-pragmas.pl
index c28265e6dd9d..de95689a6ef0 100644
--- 
a/drbd/drbd-kernel-compat/annotate-diff-with-original-file-position-pragmas.pl
+++ 
b/drbd/drbd-kernel-compat/annotate-diff-with-original-file-position-pragmas.pl
@@ -91,6 +91,7 @@ m{^--- (?:\./)?(\S+)$} and do {
                        $chunk .= qq{+# $. "$patch_name"\n};
                        $chunk .= qq{+# $o_pos "$ABS_NAME"\n};
                        $n_count += 2;
+                       $n_pos += 2;
                        $extra_ncount += 2;
                        $file_line_context_points_to_orig = 1;
                        $state = ' ';
-- 
2.35.3


++++++ 0004-drbd-fix-exposed_uuid-going-backward.patch ++++++
>From 2f464b8e8235efe2c5d972cf8054dcc2010b100e Mon Sep 17 00:00:00 2001
From: Philipp Reisner <[email protected]>
Date: Wed, 14 Aug 2024 17:42:44 +0200
Subject: [PATCH 04/32] drbd: fix exposed_uuid going backward

When a diskless node in the primary role creates a new current UUID,
it sends it all its UpToDate peers and sets it as its own exposed
UUID. If there is only one UpToDate node in the secondary role and it
sends its current UUID to the diskless primary at about the same time,
then with the following state change, through the function
ensure_expose_data_uuid(), the diskless primary sets its exposed_uuid
back to the previous one.

Avoid this problem by not accepting a current_uuid update from a peer
when I am primary (authoritative), and I have told the peer the latest
update, and that peer is already on that latest (authoritative) value.
---
 drbd/drbd_main.c     |  1 +
 drbd/drbd_receiver.c | 10 +++++++++-
 2 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/drbd/drbd_main.c b/drbd/drbd_main.c
index 862438885f35..bc3283b045c9 100644
--- a/drbd/drbd_main.c
+++ b/drbd/drbd_main.c
@@ -1484,6 +1484,7 @@ int drbd_send_current_uuid(struct drbd_peer_device 
*peer_device, u64 current_uui
        if (!p)
                return -EIO;
 
+       peer_device->comm_current_uuid = current_uuid;
        p->uuid = cpu_to_be64(current_uuid);
        p->weak_nodes = cpu_to_be64(weak_nodes);
        return drbd_send_command(peer_device, P_CURRENT_UUID, DATA_STREAM);
diff --git a/drbd/drbd_receiver.c b/drbd/drbd_receiver.c
index ee54cf3ac116..985fac8e69b3 100644
--- a/drbd/drbd_receiver.c
+++ b/drbd/drbd_receiver.c
@@ -5815,7 +5815,15 @@ static int receive_uuids110(struct drbd_connection 
*connection, struct packet_in
                peer_md = device->ldev->md.peers;
                spin_lock_irq(&device->ldev->md.uuid_lock);
        }
-       peer_device->current_uuid = be64_to_cpu(p->current_uuid);
+
+       if (device->resource->role[NOW] != R_PRIMARY ||
+           device->disk_state[NOW] != D_DISKLESS ||
+           (peer_device->current_uuid & ~UUID_PRIMARY) !=
+                                               (device->exposed_data_uuid & 
~UUID_PRIMARY) ||
+           (peer_device->comm_current_uuid & ~UUID_PRIMARY) !=
+                                               (device->exposed_data_uuid & 
~UUID_PRIMARY))
+               peer_device->current_uuid = be64_to_cpu(p->current_uuid);
+
        peer_device->dirty_bits = be64_to_cpu(p->dirty_bits);
        peer_device->uuid_flags = be64_to_cpu(p->uuid_flags);
        if (peer_device->uuid_flags & UUID_FLAG_HAS_UNALLOC) {
-- 
2.35.3


++++++ 0005-drbd-Proper-locking-around-new_current_uuid-on-a-dis.patch ++++++
>From c7384276634be7c5b49ef0b8d7fa064927a207f8 Mon Sep 17 00:00:00 2001
From: Philipp Reisner <[email protected]>
Date: Wed, 14 Aug 2024 19:42:40 +0200
Subject: [PATCH 05/32] drbd: Proper locking around new_current_uuid on a
 diskless

Like the current UUID of a diskful node, changing the exposed_uuid of
a diskless node needs to be serialized with the UUID exchange when
establishing new connections.
---
 drbd/drbd_main.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/drbd/drbd_main.c b/drbd/drbd_main.c
index bc3283b045c9..2792b9896271 100644
--- a/drbd/drbd_main.c
+++ b/drbd/drbd_main.c
@@ -4827,7 +4827,10 @@ void drbd_uuid_new_current(struct drbd_device *device, 
bool forced)
                        current_uuid |= UUID_PRIMARY;
                else
                        current_uuid &= ~UUID_PRIMARY;
+
+               down_write(&device->uuid_sem);
                drbd_uuid_set_exposed(device, current_uuid, false);
+               downgrade_write(&device->uuid_sem);
                drbd_info(device, "sending new current UUID: %016llX\n", 
current_uuid);
 
                weak_nodes = drbd_weak_nodes_device(device);
@@ -4837,6 +4840,7 @@ void drbd_uuid_new_current(struct drbd_device *device, 
bool forced)
                                peer_device->current_uuid = current_uuid;
                        }
                }
+               up_read(&device->uuid_sem);
        }
 }
 
-- 
2.35.3


++++++ 0006-build-CycloneDX-fix-bom-ref-add-purl.patch ++++++
>From 18795749745baa4b8b37cb56eb12a57a7bd55da7 Mon Sep 17 00:00:00 2001
From: Roland Kammerer <[email protected]>
Date: Tue, 27 Aug 2024 09:08:31 +0200
Subject: [PATCH 06/32] build: CycloneDX: fix bom-ref, add purl

---
 Makefile              | 4 ++--
 drbd-kmod.cdx.json.in | 1 +
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/Makefile b/Makefile
index 83a2ed8a42f7..3f58568cc138 100644
--- a/Makefile
+++ b/Makefile
@@ -238,11 +238,11 @@ drbd-kmod_rhel.spdx drbd-kmod_sles.spdx:
 # only call this wrapper from drbd-kmod.cdx.json
 .PHONY: cdx-sub
 cdx-sub:
-       cat $(CDX_FILE).in | jq --args '.metadata.timestamp = "$(CDX_DATE)" | 
.metadata.component.version = "$(FDIST_VERSION)" | 
.metadata.component."bom-ref" = 
"https://github.com/LINBIT/drbd/releases/tag/drbd-$(FDIST_VERSION)"' > 
$(CDX_FILE)
+       cat $(CDX_FILE).in | jq --args '.metadata.timestamp = "$(CDX_DATE)" | 
.metadata.component.version = "$(FDIST_VERSION)" | 
.metadata.component."bom-ref" = "$(PURL)" | .metadata.component.purl = 
"$(PURL)"' > $(CDX_FILE)
 
 .PHONY: drbd-kmod.cdx.json
 drbd-kmod.cdx.json:
-       $(MAKE) -s cdx-sub CDX_DATE="$$(date --utc +%FT%TZ)" CDX_FILE="$@"
+       $(MAKE) -s cdx-sub CDX_DATE="$$(date --utc +%FT%TZ)" 
PURL="pkg:github/LINBIT/drbd@drbd-$(FDIST_VERSION)" CDX_FILE="$@"
        ! grep -q __PLACEHOLDER__ $@
 
 # update of .filelist is forced:
diff --git a/drbd-kmod.cdx.json.in b/drbd-kmod.cdx.json.in
index f7a4c4a46aa6..ab4e05a43187 100644
--- a/drbd-kmod.cdx.json.in
+++ b/drbd-kmod.cdx.json.in
@@ -18,6 +18,7 @@
       "name": "kmod-drbd",
       "version": "__PLACEHOLDER__",
       "bom-ref": "__PLACEHOLDER__",
+      "purl": "__PLACEHOLDER__",
       "licenses": [
         {
           "licenses": {
-- 
2.35.3


++++++ 0007-build-Another-update-to-the-spdx-files.patch ++++++
>From c4dd27cc69b99e13d4117fa348f968cf2199db6b Mon Sep 17 00:00:00 2001
From: Philipp Reisner <[email protected]>
Date: Wed, 28 Aug 2024 18:43:31 +0200
Subject: [PATCH 07/32] build: Another update to the spdx files

Some enterprise customers require these files to contain a
"PackageCopyrightText" tag. Apart from that they require the
SPDX in JSON format. That will come in another commit.
---
 Makefile | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/Makefile b/Makefile
index 3f58568cc138..80c20d24ab54 100644
--- a/Makefile
+++ b/Makefile
@@ -205,6 +205,8 @@ PackageSupplier: Organization: LINBIT HA-Solutions GmbH
 PackageDownloadLocation: https://github.com/LINBIT/drbd
 FilesAnalyzed: false
 PackageLicenseDeclared: GPL-2.0-only
+PackageCopyrightText: <text>2001-2008, LINBIT Information Technologies GmbH
+2008-$(SPDX_YEAR), LINBIT HA-Solutions GmbH</text>
 Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-Package-$(SPDX_PKG_NAME)
 endef
 
@@ -219,6 +221,7 @@ drbd-kmod_rhel.spdx drbd-kmod_sles.spdx:
                SPDX_DATE="$$(date --utc +%FT%TZ)"; \
                SPDX_UUID="$$(cat /proc/sys/kernel/random/uuid)"; \
                SPDX_VERSION="$(REL_VERSION)"; \
+               SPDX_YEAR="$$(date --utc +%Y)"; \
                case "$@" in \
                        drbd-kmod_rhel.spdx) SPDX_PKG_NAME=kmod-drbd;; \
                        drbd-kmod_sles.spdx) SPDX_PKG_NAME=drbd-kmp-default;; \
@@ -228,11 +231,13 @@ drbd-kmod_rhel.spdx drbd-kmod_sles.spdx:
                test -n "$$SPDX_DATE"; \
                test -n "$$SPDX_UUID"; \
                test -n "$$SPDX_VERSION"; \
+               test -n "$$SPDX_YEAR"; \
                $(MAKE) spdx-file SPDX_UUID="$$SPDX_UUID" \
                        SPDX_DATE="$$SPDX_DATE" \
                        SPDX_FILE_TMP="[email protected]" \
                        SPDX_PKG_NAME="$$SPDX_PKG_NAME" \
-                       SPDX_VERSION="$$SPDX_VERSION"; \
+                       SPDX_VERSION="$$SPDX_VERSION" \
+                       SPDX_YEAR="$$SPDX_YEAR"; \
                mv [email protected] $@; )
 
 # only call this wrapper from drbd-kmod.cdx.json
-- 
2.35.3


++++++ 0008-build-generate-spdx.json-not-tag-value-format.patch ++++++
>From ca3589743378a7750b9e6a8e19b904d57986cce4 Mon Sep 17 00:00:00 2001
From: Lars Ellenberg <[email protected]>
Date: Wed, 28 Aug 2024 20:00:36 +0200
Subject: [PATCH 08/32] build: generate spdx.json, not "tag value" format

Generates .spdx.json files in SPDX-json format instead of tag/value.
This appears to be more machine friendly.

Use jq with "null" input and \(env.<environment-variable-name>) string 
interpolation in templates.

Move all this to a new ./sbom/ subdirectory.
---
 Makefile                                      | 74 ++-----------------
 sbom/Makefile                                 | 24 ++++++
 .../drbd-kmod.cdx.json.in                     |  8 +-
 sbom/drbd-kmod.spdx.json.in                   | 32 ++++++++
 4 files changed, 68 insertions(+), 70 deletions(-)
 create mode 100644 sbom/Makefile
 rename drbd-kmod.cdx.json.in => sbom/drbd-kmod.cdx.json.in (84%)
 create mode 100644 sbom/drbd-kmod.spdx.json.in

diff --git a/Makefile b/Makefile
index 80c20d24ab54..37ffcd777d09 100644
--- a/Makefile
+++ b/Makefile
@@ -92,6 +92,8 @@ ifndef FDIST_VERSION
 FDIST_VERSION := $(DIST_VERSION)
 endif
 
+export REL_VERSION FDIST_VERSION
+
 all: module tools
 
 .PHONY: all tools module
@@ -189,76 +191,15 @@ drbd/.drbd_git_revision: FORCE
        @echo >&2 "Need a git checkout to regenerate $@"; test -s $@
 endif
 
-export define SPDX_TEMPLATE
-SPDXVersion: SPDX-2.3
-DataLicense: CC0-1.0
-SPDXID: SPDXRef-DOCUMENT
-DocumentName: drbd kernel module SBOM (software bill of materials)
-DocumentNamespace: 
https://linbit.org/spdx-docs/drbd-kmod-$(SPDX_VERSION)-$(SPDX_UUID)
-Creator: Person: Philipp Reisner ([email protected])
-Created: $(SPDX_DATE)
-
-PackageName: $(SPDX_PKG_NAME)
-SPDXID: SPDXRef-Package-$(SPDX_PKG_NAME)
-PackageVersion: $(SPDX_VERSION)
-PackageSupplier: Organization: LINBIT HA-Solutions GmbH
-PackageDownloadLocation: https://github.com/LINBIT/drbd
-FilesAnalyzed: false
-PackageLicenseDeclared: GPL-2.0-only
-PackageCopyrightText: <text>2001-2008, LINBIT Information Technologies GmbH
-2008-$(SPDX_YEAR), LINBIT HA-Solutions GmbH</text>
-Relationship: SPDXRef-DOCUMENT DESCRIBES SPDXRef-Package-$(SPDX_PKG_NAME)
-endef
-
-# only call this wrapper from drbd-kmod_{sles,rhel}.spdx
-.PHONY: spdx-file
-spdx-file:
-       @echo "$$SPDX_TEMPLATE" > $(SPDX_FILE_TMP)
-
-.PHONY: drbd-kmod_rhel.spdx drbd-kmod_sles.spdx
-drbd-kmod_rhel.spdx drbd-kmod_sles.spdx:
-       @set -e; ( truncate -s0 [email protected]; \
-               SPDX_DATE="$$(date --utc +%FT%TZ)"; \
-               SPDX_UUID="$$(cat /proc/sys/kernel/random/uuid)"; \
-               SPDX_VERSION="$(REL_VERSION)"; \
-               SPDX_YEAR="$$(date --utc +%Y)"; \
-               case "$@" in \
-                       drbd-kmod_rhel.spdx) SPDX_PKG_NAME=kmod-drbd;; \
-                       drbd-kmod_sles.spdx) SPDX_PKG_NAME=drbd-kmp-default;; \
-                       *) false;; \
-               esac; \
-               test -n "$$SPDX_TEMPLATE"; \
-               test -n "$$SPDX_DATE"; \
-               test -n "$$SPDX_UUID"; \
-               test -n "$$SPDX_VERSION"; \
-               test -n "$$SPDX_YEAR"; \
-               $(MAKE) spdx-file SPDX_UUID="$$SPDX_UUID" \
-                       SPDX_DATE="$$SPDX_DATE" \
-                       SPDX_FILE_TMP="[email protected]" \
-                       SPDX_PKG_NAME="$$SPDX_PKG_NAME" \
-                       SPDX_VERSION="$$SPDX_VERSION" \
-                       SPDX_YEAR="$$SPDX_YEAR"; \
-               mv [email protected] $@; )
-
-# only call this wrapper from drbd-kmod.cdx.json
-.PHONY: cdx-sub
-cdx-sub:
-       cat $(CDX_FILE).in | jq --args '.metadata.timestamp = "$(CDX_DATE)" | 
.metadata.component.version = "$(FDIST_VERSION)" | 
.metadata.component."bom-ref" = "$(PURL)" | .metadata.component.purl = 
"$(PURL)"' > $(CDX_FILE)
-
-.PHONY: drbd-kmod.cdx.json
-drbd-kmod.cdx.json:
-       $(MAKE) -s cdx-sub CDX_DATE="$$(date --utc +%FT%TZ)" 
PURL="pkg:github/LINBIT/drbd@drbd-$(FDIST_VERSION)" CDX_FILE="$@"
-       ! grep -q __PLACEHOLDER__ $@
-
 # update of .filelist is forced:
 .fdist_version: FORCE
        @test -s $@ && test "$$(cat $@)" = "$(FDIST_VERSION)" || echo 
"$(FDIST_VERSION)" > $@
 
 .filelist: .fdist_version FORCE
        @$(GIT) ls-files --recurse -- ':!:.git*' $(if 
$(PRESERVE_DEBIAN),,':!:debian') > [email protected]
+       @test -s [email protected] # assert there is something in .filelist.new now
        @mkdir -p drbd/drbd-kernel-compat/cocci_cache/
        @find drbd/drbd-kernel-compat/cocci_cache/ -type f -not -path '*/\.*' 
>> [email protected]
-       @test -s [email protected] # assert there is something in .filelist.new now
        @mv [email protected] $@
        @echo "./.filelist updated."
 
@@ -273,9 +214,10 @@ drbd-kmod.cdx.json:
 comma := ,
 backslash_comma := \,
 escape_comma = $(subst $(comma),$(backslash_comma),$(1))
-tgz-extra-files := \
-       .fdist_version drbd/.drbd_git_revision .filelist \
-       drbd-kmod_rhel.spdx drbd-kmod_sles.spdx drbd-kmod.cdx.json
+tgz-extra-files := .fdist_version drbd/.drbd_git_revision .filelist
+tgz-extra-files += sbom/drbd-kmod_rhel.spdx.json
+tgz-extra-files += sbom/drbd-kmod_sles.spdx.json
+tgz-extra-files += sbom/drbd-kmod.cdx.json
 tgz:
        test -s .filelist          # .filelist must be present
        test -n "$(FDIST_VERSION)" # FDIST_VERSION must be known
@@ -318,7 +260,7 @@ debrelease:
 tarball:
        $(MAKE) distclean
        $(MAKE) check-submods check_all_committed drbd/.drbd_git_revision
-       $(MAKE) drbd-kmod_rhel.spdx drbd-kmod_sles.spdx drbd-kmod.cdx.json
+       $(MAKE) -C sbom drbd-kmod_rhel.spdx.json drbd-kmod_sles.spdx.json 
drbd-kmod.cdx.json
        $(MAKE) .filelist
        $(MAKE) tgz
 
diff --git a/sbom/Makefile b/sbom/Makefile
new file mode 100644
index 000000000000..757f57e4db60
--- /dev/null
+++ b/sbom/Makefile
@@ -0,0 +1,24 @@
+
+# we inherit some variables from our "parent" Makefile
+THIS_MAKEFILE := $(lastword $(MAKEFILE_LIST))
+$(foreach v,REL_VERSION FDIST_VERSION,$(if $($(v)),,$(error "Do not use this 
Makefile ($(THIS_MAKEFILE)) directly! ($(v) missing))))
+
+all: drbd-kmod.cdx.json drbd-kmod_rhel.spdx.json drbd-kmod_sles.spdx.json
+
+export SPDX_VERSION SPDX_DATE SPDX_YEAR SPDX_UUID SPDX_PKG_NAME
+SPDX_VERSION:=$(REL_VERSION)
+SPDX_DATE:=$(shell date --utc +%FT%TZ)
+SPDX_YEAR:=$(firstword $(subst -, ,$(SPDX_DATE)))
+drbd-kmod_rhel.spdx.json drbd-kmod_sles.spdx.json: SPDX_UUID:=$(shell cat 
/proc/sys/kernel/random/uuid)
+drbd-kmod_rhel.spdx.json: SPDX_PKG_NAME:=kmod-drbd
+drbd-kmod_sles.spdx.json: SPDX_PKG_NAME:=drbd-kmp-default
+drbd-kmod_rhel.spdx.json drbd-kmod_sles.spdx.json: FORCE
+       @rm -f $@; jq -n -f drbd-kmod.spdx.json.in > [email protected] && mv [email protected] $@
+
+# uses:
+# SPDX_DATE from above and FDIST_VERSION from parent Makefile
+drbd-kmod.cdx.json: FORCE
+       @rm -f $@; jq -n -f drbd-kmod.cdx.json.in > [email protected] && mv [email protected] $@
+
+.PHONY: FORCE
+FORCE:
diff --git a/drbd-kmod.cdx.json.in b/sbom/drbd-kmod.cdx.json.in
similarity index 84%
rename from drbd-kmod.cdx.json.in
rename to sbom/drbd-kmod.cdx.json.in
index ab4e05a43187..99858e8b9b43 100644
--- a/drbd-kmod.cdx.json.in
+++ b/sbom/drbd-kmod.cdx.json.in
@@ -2,7 +2,7 @@
   "bomFormat": "CycloneDX",
   "specVersion": "1.5",
   "metadata": {
-    "timestamp": "__PLACEHOLDER__",
+    "timestamp": "\(env.SPDX_DATE)",
     "authors": [
       {
         "name": "Philipp Reisner",
@@ -16,9 +16,9 @@
     "component": {
       "type": "application",
       "name": "kmod-drbd",
-      "version": "__PLACEHOLDER__",
-      "bom-ref": "__PLACEHOLDER__",
-      "purl": "__PLACEHOLDER__",
+      "version": "\(env.FDIST_VERSION)",
+      "bom-ref": "pkg:github/LINBIT/drbd@drbd-\(env.FDIST_VERSION)",
+      "purl": "pkg:github/LINBIT/drbd@drbd-\(env.FDIST_VERSION)",
       "licenses": [
         {
           "licenses": {
diff --git a/sbom/drbd-kmod.spdx.json.in b/sbom/drbd-kmod.spdx.json.in
new file mode 100644
index 000000000000..07c1003f8834
--- /dev/null
+++ b/sbom/drbd-kmod.spdx.json.in
@@ -0,0 +1,32 @@
+{
+  "SPDXID": "SPDXRef-DOCUMENT",
+  "spdxVersion": "SPDX-2.3",
+  "creationInfo": {
+    "created": "\(env.SPDX_DATE)",
+    "creators": [
+      "Person: Philipp Reisner ([email protected])"
+    ]
+  },
+  "name": "drbd kernel module SBOM (software bill of materials)",
+  "dataLicense": "CC0-1.0",
+  "documentNamespace": 
"https://linbit.org/spdx-docs/drbd-kmod-\(env.SPDX_VERSION)-\(env.SPDX_UUID)",
+  "packages": [
+    {
+      "SPDXID": "SPDXRef-Package-\(env.SPDX_PKG_NAME)",
+      "copyrightText": "2001-2008, LINBIT Information Technologies 
GmbH\n2008-\(env.SPDX_YEAR), LINBIT HA-Solutions GmbH",
+      "downloadLocation": "https://github.com/LINBIT/drbd";,
+      "filesAnalyzed": false,
+      "licenseDeclared": "GPL-2.0-only",
+      "name": "\(env.SPDX_PKG_NAME)",
+      "supplier": "Organization: LINBIT HA-Solutions GmbH",
+      "versionInfo": "\(env.SPDX_VERSION)"
+    }
+  ],
+  "relationships": [
+    {
+      "spdxElementId": "SPDXRef-DOCUMENT",
+      "relationshipType": "DESCRIBES",
+      "relatedSpdxElement": "SPDXRef-Package-\(env.SPDX_PKG_NAME)"
+    }
+  ]
+}
-- 
2.35.3


++++++ 0009-compat-fix-gen_patch_names-for-bdev_file_open_by_pat.patch ++++++
>From 98325293e7d64ffae0e5e70620c5040ab0c76179 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Christoph=20B=C3=B6hmwalder?=
 <[email protected]>
Date: Tue, 13 Aug 2024 12:23:52 +0200
Subject: [PATCH 09/32] compat: fix gen_patch_names for bdev_file_open_by_path

---
 drbd/drbd-kernel-compat/gen_patch_names.c | 12 +++++-------
 1 file changed, 5 insertions(+), 7 deletions(-)

diff --git a/drbd/drbd-kernel-compat/gen_patch_names.c 
b/drbd/drbd-kernel-compat/gen_patch_names.c
index a9781bbd04e5..7549ee39afb7 100644
--- a/drbd/drbd-kernel-compat/gen_patch_names.c
+++ b/drbd/drbd-kernel-compat/gen_patch_names.c
@@ -564,14 +564,17 @@ int main(int argc, char **argv)
        patch(1, "__bio_add_page", true, false,
              COMPAT_HAVE___BIO_ADD_PAGE, "present");
 
+       /* blkdev_put is oldest, then bdev_open_by_path, then 
bdev_file_open_by_path */
        patch(1, "bdev_file_open_by_path", true, false,
              COMPAT_HAVE_BDEV_FILE_OPEN_BY_PATH, "present");
-
 #if !defined(COMPAT_HAVE_BDEV_FILE_OPEN_BY_PATH)
+       /* middle ground: bdev_open_by_path */
        patch(1, "bdev_open_by_path", true, false,
              COMPAT_HAVE_BDEV_OPEN_BY_PATH, "present");
-
 # if !defined(COMPAT_HAVE_BDEV_OPEN_BY_PATH)
+       /* old: blkdev_get_by_* and blkdev_put */
+       patch(1, "blkdev_put", true, false,
+             COMPAT_BLKDEV_PUT_HAS_HOLDER, "has_holder");
        patch(1, "blkdev_get_by_path", true, false,
              COMPAT_BLKDEV_GET_BY_PATH_HAS_HOLDER_OPS, "has_holder_ops");
 # endif
@@ -586,11 +589,6 @@ int main(int argc, char **argv)
        patch(1, "blk_mode_t", true, false,
              COMPAT_HAVE_BLK_MODE_T, "present");
 
-#if !defined(COMPAT_HAVE_BDEV_OPEN_BY_PATH)
-       patch(1, "blkdev_put", true, false,
-             COMPAT_BLKDEV_PUT_HAS_HOLDER, "has_holder");
-#endif
-
        patch(1, "genl_info_userhdr", true, false,
              COMPAT_HAVE_GENL_INFO_USERHDR, "present");
 
-- 
2.35.3


++++++ boo1230635_01-compat-fix-nla_nest_start_noflag-test.patch -> 
0010-compat-fix-nla_nest_start_noflag-test.patch ++++++
--- 
/work/SRC/openSUSE:Factory/drbd/boo1230635_01-compat-fix-nla_nest_start_noflag-test.patch
   2024-09-17 18:20:27.344561854 +0200
+++ 
/work/SRC/openSUSE:Factory/.drbd.new.19354/0010-compat-fix-nla_nest_start_noflag-test.patch
 2024-10-11 17:02:47.511869473 +0200
@@ -2,7 +2,7 @@
 From: =?UTF-8?q?Christoph=20B=C3=B6hmwalder?=
  <[email protected]>
 Date: Tue, 13 Aug 2024 12:40:27 +0200
-Subject: [PATCH] compat: fix nla_nest_start_noflag test
+Subject: [PATCH 10/32] compat: fix nla_nest_start_noflag test
 MIME-Version: 1.0
 Content-Type: text/plain; charset=UTF-8
 Content-Transfer-Encoding: 8bit

++++++ 0011-compat-fix-blk_alloc_disk-rule.patch ++++++
>From 32b84f7b4d071312e5e812eab6b26e4aad2899e4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Christoph=20B=C3=B6hmwalder?=
 <[email protected]>
Date: Mon, 19 Aug 2024 16:19:47 +0200
Subject: [PATCH 11/32] compat: fix blk_alloc_disk rule

---
 drbd/drbd-kernel-compat/gen_patch_names.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drbd/drbd-kernel-compat/gen_patch_names.c 
b/drbd/drbd-kernel-compat/gen_patch_names.c
index 7549ee39afb7..c21a43b39488 100644
--- a/drbd/drbd-kernel-compat/gen_patch_names.c
+++ b/drbd/drbd-kernel-compat/gen_patch_names.c
@@ -155,9 +155,10 @@ int main(int argc, char **argv)
 
        patch(1, "blk_alloc_disk", true, false,
              COMPAT_BLK_ALLOC_DISK_TAKES_QUEUE_LIMITS, "takes_queue_limits");
-
+#if !defined(COMPAT_BLK_ALLOC_DISK_TAKES_QUEUE_LIMITS)
        patch(1, "blk_alloc_disk", true, false,
              COMPAT_HAVE_BLK_ALLOC_DISK, "present");
+#endif
 
 
/*******************************************************************************/
        /*
-- 
2.35.3


++++++ 0012-drbd-remove-const-from-function-return-type.patch ++++++
>From 392743b95ab0aaff13d5c91eaaab5ae24388384f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Christoph=20B=C3=B6hmwalder?=
 <[email protected]>
Date: Tue, 13 Aug 2024 12:29:35 +0200
Subject: [PATCH 12/32] drbd: remove const from function return type

Linux 6.10 enables some compiler flag that errors out with:

error: type qualifiers ignored on function return type
---
 drbd/drbd_receiver.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drbd/drbd_receiver.c b/drbd/drbd_receiver.c
index 985fac8e69b3..1b9f80de6f41 100644
--- a/drbd/drbd_receiver.c
+++ b/drbd/drbd_receiver.c
@@ -272,7 +272,7 @@ static const char *drbd_sync_rule_str(enum sync_rule rule)
        return sync_rule_names[rule];
 }
 
-static const struct sync_descriptor strategy_descriptor(enum sync_strategy 
strategy)
+static struct sync_descriptor strategy_descriptor(enum sync_strategy strategy)
 {
        if (strategy < 0 || strategy > ARRAY_SIZE(sync_descriptors)) {
                WARN_ON(true);
-- 
2.35.3


++++++ 0013-drbd-don-t-set-max_write_zeroes_sectors-in-decide_on.patch ++++++
>From 3672388dc75cbcdb5f3821b5f4354b55333004f5 Mon Sep 17 00:00:00 2001
From: Christoph Hellwig <[email protected]>
Date: Wed, 6 Mar 2024 15:03:30 +0100
Subject: [PATCH 13/32] drbd: don't set max_write_zeroes_sectors in
 decide_on_discard_support
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

fixup_write_zeroes always overrides the max_write_zeroes_sectors value
a little further down the callchain, so don't bother to setup a limit
in decide_on_discard_support.

Signed-off-by: Christoph Hellwig <[email protected]>
Reviewed-by: Philipp Reisner <[email protected]>
Reviewed-by: Lars Ellenberg <[email protected]>
Tested-by: Christoph Böhmwalder <[email protected]>
Link: 
https://lore.kernel.org/r/[email protected]
Signed-off-by: Jens Axboe <[email protected]>
Signed-off-by: Christoph Böhmwalder <[email protected]>
---
 drbd/drbd_nl.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/drbd/drbd_nl.c b/drbd/drbd_nl.c
index ef315e02f437..a0c3534d8996 100644
--- a/drbd/drbd_nl.c
+++ b/drbd/drbd_nl.c
@@ -2070,7 +2070,6 @@ static void decide_on_discard_support(struct drbd_device 
*device,
        blk_queue_discard_granularity(q, 512);
        max_discard_sectors = drbd_max_discard_sectors(device->resource);
        blk_queue_max_discard_sectors(q, max_discard_sectors);
-       blk_queue_max_write_zeroes_sectors(q, max_discard_sectors);
        return;
 
 not_supported:
-- 
2.35.3


++++++ 0014-drbd-split-out-a-drbd_discard_supported-helper.patch ++++++
>From 78d5d462c2bdac350921c114caca588c606d7c0b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Christoph=20B=C3=B6hmwalder?=
 <[email protected]>
Date: Mon, 1 Jul 2024 17:56:08 +0200
Subject: [PATCH 14/32] drbd: split out a drbd_discard_supported helper

Add a helper to check if discard is supported for a given connection /
backing device combination.

Similar idea to upstream kernel commit 5eaee6e9c8f9
("drbd: split out a drbd_discard_supported helper"), but also get rid of
the goto.
---
 drbd/drbd_nl.c | 29 ++++++++++++++++++-----------
 1 file changed, 18 insertions(+), 11 deletions(-)

diff --git a/drbd/drbd_nl.c b/drbd/drbd_nl.c
index a0c3534d8996..e3f508cd0421 100644
--- a/drbd/drbd_nl.c
+++ b/drbd/drbd_nl.c
@@ -2044,19 +2044,31 @@ static unsigned int drbd_max_discard_sectors(struct 
drbd_resource *resource)
        return s;
 }
 
-static void decide_on_discard_support(struct drbd_device *device,
+static bool drbd_discard_supported(struct drbd_device *device,
                struct drbd_backing_dev *bdev)
 {
-       struct request_queue *q = device->rq_queue;
-       unsigned int max_discard_sectors;
-
        if (bdev && !bdev_max_discard_sectors(bdev->backing_bdev))
-               goto not_supported;
+               return false;
 
        if (!(common_connection_features(device->resource) & DRBD_FF_TRIM)) {
                drbd_info(device,
                        "peer DRBD too old, does not support TRIM: disabling 
discards\n");
-               goto not_supported;
+               return false;
+       }
+
+       return true;
+}
+
+static void decide_on_discard_support(struct drbd_device *device,
+               struct drbd_backing_dev *bdev)
+{
+       struct request_queue *q = device->rq_queue;
+       unsigned int max_discard_sectors;
+
+       if (!drbd_discard_supported(device, bdev)) {
+               blk_queue_discard_granularity(q, 0);
+               blk_queue_max_discard_sectors(q, 0);
+               return;
        }
 
        /*
@@ -2070,11 +2082,6 @@ static void decide_on_discard_support(struct drbd_device 
*device,
        blk_queue_discard_granularity(q, 512);
        max_discard_sectors = drbd_max_discard_sectors(device->resource);
        blk_queue_max_discard_sectors(q, max_discard_sectors);
-       return;
-
-not_supported:
-       blk_queue_discard_granularity(q, 0);
-       blk_queue_max_discard_sectors(q, 0);
 }
 
 static void fixup_write_zeroes(struct drbd_device *device, struct 
request_queue *q)
-- 
2.35.3


++++++ 0015-drbd-atomically-update-queue-limits-in-drbd_reconsid.patch ++++++
>From 5931286cb71114c0f34e51fc7f357dceec139ca1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Christoph=20B=C3=B6hmwalder?=
 <[email protected]>
Date: Tue, 13 Aug 2024 12:26:02 +0200
Subject: [PATCH 15/32] drbd: atomically update queue limits in
 drbd_reconsider_queue_parameters

Switch drbd_reconsider_queue_parameters to set up the queue parameters
in an on-stack queue_limits structure and apply the limits atomically.
Remove various helpers that have become so trivial that they can be
folded into drbd_reconsider_queue_parameters.

Same idea as upstream kernel commit e6dfe748f09e ("drbd: atomically
update queue limits in drbd_reconsider_queue_parameters"), but with some
adaptations to DRBD 9.
---
 drbd/drbd_nl.c | 136 ++++++++++++++++++++++---------------------------
 1 file changed, 60 insertions(+), 76 deletions(-)

diff --git a/drbd/drbd_nl.c b/drbd/drbd_nl.c
index e3f508cd0421..7193ba0c77e3 100644
--- a/drbd/drbd_nl.c
+++ b/drbd/drbd_nl.c
@@ -2018,11 +2018,6 @@ static u32 common_connection_features(struct 
drbd_resource *resource)
        return features;
 }
 
-static void blk_queue_discard_granularity(struct request_queue *q, unsigned 
int granularity)
-{
-       q->limits.discard_granularity = granularity;
-}
-
 static unsigned int drbd_max_discard_sectors(struct drbd_resource *resource)
 {
        struct drbd_connection *connection;
@@ -2059,73 +2054,20 @@ static bool drbd_discard_supported(struct drbd_device 
*device,
        return true;
 }
 
-static void decide_on_discard_support(struct drbd_device *device,
-               struct drbd_backing_dev *bdev)
-{
-       struct request_queue *q = device->rq_queue;
-       unsigned int max_discard_sectors;
-
-       if (!drbd_discard_supported(device, bdev)) {
-               blk_queue_discard_granularity(q, 0);
-               blk_queue_max_discard_sectors(q, 0);
-               return;
-       }
-
-       /*
-        * We don't care for the granularity, really.
-        *
-        * Stacking limits below should fix it for the local device.  Whether or
-        * not it is a suitable granularity on the remote device is not our
-        * problem, really. If you care, you need to use devices with similar
-        * topology on all peers.
-        */
-       blk_queue_discard_granularity(q, 512);
-       max_discard_sectors = drbd_max_discard_sectors(device->resource);
-       blk_queue_max_discard_sectors(q, max_discard_sectors);
-}
-
-static void fixup_write_zeroes(struct drbd_device *device, struct 
request_queue *q)
-{
-       /* Fixup max_write_zeroes_sectors after blk_stack_limits():
-        * if we can handle "zeroes" efficiently on the protocol,
-        * we want to do that, even if our backend does not announce
-        * max_write_zeroes_sectors itself. */
-
-       /* If all peers announce WZEROES support, use it.  Otherwise, rather
-        * send explicit zeroes than rely on some discard-zeroes-data magic. */
-       if (common_connection_features(device->resource) & DRBD_FF_WZEROES)
-               q->limits.max_write_zeroes_sectors = DRBD_MAX_BBIO_SECTORS;
-       else
-               q->limits.max_write_zeroes_sectors = 0;
-}
-
-static void fixup_discard_support(struct drbd_device *device, struct 
request_queue *q)
-{
-       unsigned int max_discard = device->rq_queue->limits.max_discard_sectors;
-       unsigned int discard_granularity = 
device->rq_queue->limits.discard_granularity >> SECTOR_SHIFT;
-
-       if (discard_granularity > max_discard) {
-               blk_queue_discard_granularity(q, 0);
-               blk_queue_max_discard_sectors(q, 0);
-       }
-}
-
-void drbd_reconsider_queue_parameters(struct drbd_device *device, struct 
drbd_backing_dev *bdev)
+static void get_common_queue_limits(struct queue_limits *common_limits,
+               struct drbd_device *device)
 {
-       struct request_queue * const q = device->rq_queue;
-       struct queue_limits common_limits = { 0 }; /* sizeof(struct 
queue_limits) ~ 110 bytes */
-       struct queue_limits peer_limits = { 0 };
        struct drbd_peer_device *peer_device;
-       struct request_queue *b = NULL;
+       struct queue_limits peer_limits = { 0 };
 
-       blk_set_stacking_limits(&common_limits);
+       blk_set_stacking_limits(common_limits);
        /* This is the workaround for "bio would need to, but cannot, be split" 
*/
-       common_limits.seg_boundary_mask = PAGE_SIZE - 1;
-       common_limits.max_hw_sectors = device->device_conf.max_bio_size >> 
SECTOR_SHIFT;
-       common_limits.max_sectors = device->device_conf.max_bio_size >> 
SECTOR_SHIFT;
-       common_limits.physical_block_size = device->device_conf.block_size;
-       common_limits.logical_block_size = device->device_conf.block_size;
-       common_limits.io_min = device->device_conf.block_size;
+       common_limits->seg_boundary_mask = PAGE_SIZE - 1;
+       common_limits->max_hw_sectors = device->device_conf.max_bio_size >> 
SECTOR_SHIFT;
+       common_limits->max_sectors = device->device_conf.max_bio_size >> 
SECTOR_SHIFT;
+       common_limits->physical_block_size = device->device_conf.block_size;
+       common_limits->logical_block_size = device->device_conf.block_size;
+       common_limits->io_min = device->device_conf.block_size;
 
        rcu_read_lock();
        for_each_peer_device_rcu(peer_device, device) {
@@ -2140,21 +2082,63 @@ void drbd_reconsider_queue_parameters(struct 
drbd_device *device, struct drbd_ba
                peer_limits.io_opt = peer_device->q_limits.io_opt;
                peer_limits.max_hw_sectors = peer_device->q_limits.max_bio_size 
>> SECTOR_SHIFT;
                peer_limits.max_sectors = peer_device->q_limits.max_bio_size >> 
SECTOR_SHIFT;
-               blk_stack_limits(&common_limits, &peer_limits, 0);
+               blk_stack_limits(common_limits, &peer_limits, 0);
        }
        rcu_read_unlock();
+}
+
+void drbd_reconsider_queue_parameters(struct drbd_device *device, struct 
drbd_backing_dev *bdev)
+{
+       struct request_queue * const q = device->rq_queue;
+       struct queue_limits lim;
+       struct request_queue *b = NULL;
+
+       lim = queue_limits_start_update(q);
+       get_common_queue_limits(&lim, device);
+
+       /*
+        * We don't care for the granularity, really.
+        * Stacking limits below should fix it for the local device. Whether or
+        * not it is a suitable granularity on the remote device is not our
+        * problem, really. If you care, you need to use devices with similar
+        * topology on all peers.
+        */
+       if (drbd_discard_supported(device, bdev)) {
+               lim.discard_granularity = 512;
+               lim.max_hw_discard_sectors = 
drbd_max_discard_sectors(device->resource);
+       } else {
+               lim.discard_granularity = 0;
+               lim.max_hw_discard_sectors = 0;
+       }
 
        if (bdev) {
                b = bdev->backing_bdev->bd_disk->queue;
-               blk_stack_limits(&common_limits, &b->limits, 0);
-               disk_update_readahead(device->vdisk);
+               blk_stack_limits(&lim, &b->limits, 0);
+       }
+
+       /*
+        * If we can handle "zeroes" efficiently on the protocol,
+        * we want to do that, even if our backend does not announce
+        * max_write_zeroes_sectors itself.
+        */
+       if (common_connection_features(device->resource) & DRBD_FF_WZEROES)
+               lim.max_write_zeroes_sectors = DRBD_MAX_BBIO_SECTORS;
+       else
+               lim.max_write_zeroes_sectors = 0;
+
+       if ((lim.discard_granularity >> SECTOR_SHIFT) >
+           lim.max_hw_discard_sectors) {
+               /*
+                * discard_granularity is the smallest supported unit of a
+                * discard. If that is larger than the maximum supported discard
+                * size, we need to disable discards altogether.
+                */
+               lim.discard_granularity = 0;
+               lim.max_hw_discard_sectors = 0;
        }
-       q->limits = common_limits;
-       blk_queue_max_hw_sectors(q, common_limits.max_hw_sectors);
-       decide_on_discard_support(device, bdev);
 
-       fixup_write_zeroes(device, q);
-       fixup_discard_support(device, q);
+       if (queue_limits_commit_update(q, &lim))
+               drbd_err(device, "setting new queue limits failed\n");
 }
 
 /* Make sure IO is suspended before calling this function(). */
-- 
2.35.3


++++++ 0016-compat-test-and-patch-for-queue_limits_start_update.patch ++++++
>From fef08ee4fac426f5dfbec124bd2bd58fbd390cb2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Christoph=20B=C3=B6hmwalder?=
 <[email protected]>
Date: Thu, 22 Aug 2024 12:09:42 +0200
Subject: [PATCH 16/32] compat: test and patch for queue_limits_start_update

---
 ...ueue_limits_start_update__no_present.cocci | 20 +++++++++++++++++++
 drbd/drbd-kernel-compat/gen_patch_names.c     |  3 +++
 .../tests/have_queue_limits_start_update.c    |  8 ++++++++
 3 files changed, 31 insertions(+)
 create mode 100644 
drbd/drbd-kernel-compat/cocci/queue_limits_start_update__no_present.cocci
 create mode 100644 
drbd/drbd-kernel-compat/tests/have_queue_limits_start_update.c

diff --git 
a/drbd/drbd-kernel-compat/cocci/queue_limits_start_update__no_present.cocci 
b/drbd/drbd-kernel-compat/cocci/queue_limits_start_update__no_present.cocci
new file mode 100644
index 000000000000..4e34f5887181
--- /dev/null
+++ b/drbd/drbd-kernel-compat/cocci/queue_limits_start_update__no_present.cocci
@@ -0,0 +1,20 @@
+@@
+identifier lim;
+identifier q;
+identifier device;
+identifier bdev;
+@@
+void drbd_reconsider_queue_parameters(struct drbd_device *device, struct 
drbd_backing_dev *bdev)
+{
+...
+       lim =
+-      queue_limits_start_update(q);
++      q->limits;
+...
+-      if (queue_limits_commit_update(q, &lim)) { ... }
++      blk_queue_max_hw_sectors(q, lim.max_hw_sectors);
++      q->limits = lim;
++      if (bdev)
++              disk_update_readahead(device->vdisk);
+...
+}
diff --git a/drbd/drbd-kernel-compat/gen_patch_names.c 
b/drbd/drbd-kernel-compat/gen_patch_names.c
index c21a43b39488..13aec5c8bd5f 100644
--- a/drbd/drbd-kernel-compat/gen_patch_names.c
+++ b/drbd/drbd-kernel-compat/gen_patch_names.c
@@ -393,6 +393,9 @@ int main(int argc, char **argv)
              COMPAT_HAVE_WB_CONGESTED_ENUM, "present");
 #endif
 
+       patch(1, "queue_limits_start_update", true, false,
+             COMPAT_HAVE_QUEUE_LIMITS_START_UPDATE, "present");
+
        patch(1, "disk_update_readahead", true, false,
              COMPAT_HAVE_DISK_UPDATE_READAHEAD, "present");
 
diff --git a/drbd/drbd-kernel-compat/tests/have_queue_limits_start_update.c 
b/drbd/drbd-kernel-compat/tests/have_queue_limits_start_update.c
new file mode 100644
index 000000000000..a867d1675218
--- /dev/null
+++ b/drbd/drbd-kernel-compat/tests/have_queue_limits_start_update.c
@@ -0,0 +1,8 @@
+/* { "version": "v6.9-rc1", "commit": 
"d690cb8ae14bd377d422b7905b6959c7e7a45b95", "comment": "block: add an API to 
atomically update queue limits", "author": "Christoph Hellwig <[email protected]>", 
"date": "Tue Feb 13 08:34:14 2024 +0100" } */
+
+#include <linux/blkdev.h>
+
+static struct queue_limits foo(struct request_queue *q)
+{
+       return queue_limits_start_update(q);
+}
-- 
2.35.3


++++++ 0017-compat-specify-which-essential-change-was-not-made.patch ++++++
>From 4352ece8e85da43090be171276a0d45d83c55a00 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Christoph=20B=C3=B6hmwalder?=
 <[email protected]>
Date: Thu, 22 Aug 2024 12:25:39 +0200
Subject: [PATCH 17/32] compat: specify which essential change was not made

---
 drbd/drbd-kernel-compat/cocci/bdi_congested__yes_present.cocci  | 2 +-
 drbd/drbd-kernel-compat/cocci/bio_op_shift__yes_present.cocci   | 2 +-
 .../cocci/blk_queue_max_write_same_sectors__yes_present.cocci   | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/drbd/drbd-kernel-compat/cocci/bdi_congested__yes_present.cocci 
b/drbd/drbd-kernel-compat/cocci/bdi_congested__yes_present.cocci
index 8a0260321ab5..fdf6afc8355f 100644
--- a/drbd/drbd-kernel-compat/cocci/bdi_congested__yes_present.cocci
+++ b/drbd/drbd-kernel-compat/cocci/bdi_congested__yes_present.cocci
@@ -21,7 +21,7 @@ struct device_statistics *s;
 @ script:python depends on !(add_bdi_read_congested_congested_remote && 
add_bdi_read_congested_device_to_statistics) @
 @@
 import sys
-print('ERROR: A rule making an essential change was not executed!', 
file=sys.stderr)
+print('ERROR: A rule making an essential change was not executed! 
(bdi_read_congested)', file=sys.stderr)
 print('ERROR: This would not show up as a compiler error, but would still 
break DRBD.', file=sys.stderr)
 print('ERROR: Check bdi_congested__yes_present.cocci', file=sys.stderr)
 print('ERROR: As a precaution, the build will be aborted here.', 
file=sys.stderr)
diff --git a/drbd/drbd-kernel-compat/cocci/bio_op_shift__yes_present.cocci 
b/drbd/drbd-kernel-compat/cocci/bio_op_shift__yes_present.cocci
index cc02f5b91c2e..3225291f7dbd 100644
--- a/drbd/drbd-kernel-compat/cocci/bio_op_shift__yes_present.cocci
+++ b/drbd/drbd-kernel-compat/cocci/bio_op_shift__yes_present.cocci
@@ -57,7 +57,7 @@ combine_opf(wire_flags_to_bio_op(dpf),
 @ script:python depends on !combine_wire_flags @
 @@
 import sys
-print('ERROR: A rule making an essential change was not executed!', 
file=sys.stderr)
+print('ERROR: A rule making an essential change was not executed! 
(combine_opf)', file=sys.stderr)
 print('ERROR: This would not show up as a compiler error, but would still 
break DRBD.', file=sys.stderr)
 print('ERROR: As a precaution, the build will be aborted here.', 
file=sys.stderr)
 sys.exit(1)
diff --git 
a/drbd/drbd-kernel-compat/cocci/blk_queue_max_write_same_sectors__yes_present.cocci
 
b/drbd/drbd-kernel-compat/cocci/blk_queue_max_write_same_sectors__yes_present.cocci
index 8eb4eef7dfd5..9202ee9c2dc4 100644
--- 
a/drbd/drbd-kernel-compat/cocci/blk_queue_max_write_same_sectors__yes_present.cocci
+++ 
b/drbd/drbd-kernel-compat/cocci/blk_queue_max_write_same_sectors__yes_present.cocci
@@ -7,7 +7,7 @@ blk_queue_max_hw_sectors(q, ...);
 @ script:python depends on !add_blk_queue_max_write_same_sectors @
 @@
 import sys
-print('ERROR: A rule making an essential change was not executed!', 
file=sys.stderr)
+print('ERROR: A rule making an essential change was not executed! 
(blk_queue_max_write_same_sectors)', file=sys.stderr)
 print('ERROR: This would not show up as a compiler error, but would still 
break DRBD.', file=sys.stderr)
 print('ERROR: Check blk_queue_max_write_same_sectors_yes_present.cocci', 
file=sys.stderr)
 print('ERROR: As a precaution, the build will be aborted here.', 
file=sys.stderr)
-- 
2.35.3


++++++ 0018-gen_patch_names-reorder-blk_mode_t.patch ++++++
>From b340c96d60065f08397d14360e7f045005c587e8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Christoph=20B=C3=B6hmwalder?=
 <[email protected]>
Date: Fri, 23 Aug 2024 12:30:45 +0200
Subject: [PATCH 18/32] gen_patch_names: reorder blk_mode_t

And match against bdev_file_open_by_path.
---
 drbd/drbd-kernel-compat/cocci/blk_mode_t__no_present.cocci | 7 +------
 drbd/drbd-kernel-compat/gen_patch_names.c                  | 6 +++---
 2 files changed, 4 insertions(+), 9 deletions(-)

diff --git a/drbd/drbd-kernel-compat/cocci/blk_mode_t__no_present.cocci 
b/drbd/drbd-kernel-compat/cocci/blk_mode_t__no_present.cocci
index d1312a093ffe..cde4430478e5 100644
--- a/drbd/drbd-kernel-compat/cocci/blk_mode_t__no_present.cocci
+++ b/drbd/drbd-kernel-compat/cocci/blk_mode_t__no_present.cocci
@@ -22,12 +22,7 @@ identifier mode;
 @@
 // special case: bdev_open_by_path takes a blk_mode_t, so convert that too. I 
can't seem to get
 // coccinelle to match the "READ | WRITE" condition generically, so just hard 
code it.
-// NOTE: we use blkdev_get_by_path instead of bdev_open_by_path in some compat 
cases, so support that too.
-(
-bdev_open_by_path
-|
-blkdev_get_by_path
-)
+bdev_file_open_by_path
  (...,
 - BLK_OPEN_READ | BLK_OPEN_WRITE
 + FMODE_READ | FMODE_WRITE
diff --git a/drbd/drbd-kernel-compat/gen_patch_names.c 
b/drbd/drbd-kernel-compat/gen_patch_names.c
index 13aec5c8bd5f..6f62ea5827b7 100644
--- a/drbd/drbd-kernel-compat/gen_patch_names.c
+++ b/drbd/drbd-kernel-compat/gen_patch_names.c
@@ -568,6 +568,9 @@ int main(int argc, char **argv)
        patch(1, "__bio_add_page", true, false,
              COMPAT_HAVE___BIO_ADD_PAGE, "present");
 
+       patch(1, "blk_mode_t", true, false,
+             COMPAT_HAVE_BLK_MODE_T, "present");
+
        /* blkdev_put is oldest, then bdev_open_by_path, then 
bdev_file_open_by_path */
        patch(1, "bdev_file_open_by_path", true, false,
              COMPAT_HAVE_BDEV_FILE_OPEN_BY_PATH, "present");
@@ -590,9 +593,6 @@ int main(int argc, char **argv)
        patch(1, "block_device_operations_release", true, false,
              COMPAT_BLOCK_DEVICE_OPERATIONS_RELEASE_TAKES_SINGLE_ARGUMENT, 
"takes_single_argument");
 
-       patch(1, "blk_mode_t", true, false,
-             COMPAT_HAVE_BLK_MODE_T, "present");
-
        patch(1, "genl_info_userhdr", true, false,
              COMPAT_HAVE_GENL_INFO_USERHDR, "present");
 
-- 
2.35.3


++++++ 0019-compat-fix-blk_queue_update_readahead-patch.patch ++++++
>From 37edd6c75cccba9b151e8b834c83832ae0382484 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Christoph=20B=C3=B6hmwalder?=
 <[email protected]>
Date: Thu, 29 Aug 2024 13:27:31 +0200
Subject: [PATCH 19/32] compat: fix blk_queue_update_readahead patch

Did not match anymore
---
 .../cocci/blk_queue_update_readahead__no_present.cocci   | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git 
a/drbd/drbd-kernel-compat/cocci/blk_queue_update_readahead__no_present.cocci 
b/drbd/drbd-kernel-compat/cocci/blk_queue_update_readahead__no_present.cocci
index ed62a3426ad6..2e78f626261d 100644
--- a/drbd/drbd-kernel-compat/cocci/blk_queue_update_readahead__no_present.cocci
+++ b/drbd/drbd-kernel-compat/cocci/blk_queue_update_readahead__no_present.cocci
@@ -1,8 +1,10 @@
 @@
-expression e;
-struct request_queue *q, b;
+identifier q, b;
 @@
-blk_stack_limits(e, &b->limits, 0);
+struct request_queue *q;
+...
+struct request_queue *b;
+<...
 - blk_queue_update_readahead(q);
 + if (q->backing_dev_info->ra_pages !=
 +     b->backing_dev_info->ra_pages) {
@@ -12,3 +14,4 @@ blk_stack_limits(e, &b->limits, 0);
 +      q->backing_dev_info->ra_pages =
 +                              b->backing_dev_info->ra_pages;
 + }
+...>
\ No newline at end of file
-- 
2.35.3


++++++ 0020-compat-test-and-patch-for-que_limits-max_hw_discard_.patch ++++++
>From f2a779276e7b0918c8592da8254a044c291f1778 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Christoph=20B=C3=B6hmwalder?=
 <[email protected]>
Date: Thu, 29 Aug 2024 16:15:27 +0200
Subject: [PATCH 20/32] compat: test and patch for
 que_limits->max_hw_discard_sectors

---
 .../queue_limits__no_has_max_hw_discard_sectors.cocci     | 5 +++++
 drbd/drbd-kernel-compat/gen_patch_names.c                 | 3 +++
 .../tests/queue_limits_has_max_hw_discard_sectors.c       | 8 ++++++++
 3 files changed, 16 insertions(+)
 create mode 100644 
drbd/drbd-kernel-compat/cocci/queue_limits__no_has_max_hw_discard_sectors.cocci
 create mode 100644 
drbd/drbd-kernel-compat/tests/queue_limits_has_max_hw_discard_sectors.c

diff --git 
a/drbd/drbd-kernel-compat/cocci/queue_limits__no_has_max_hw_discard_sectors.cocci
 
b/drbd/drbd-kernel-compat/cocci/queue_limits__no_has_max_hw_discard_sectors.cocci
new file mode 100644
index 000000000000..bf96b80a003d
--- /dev/null
+++ 
b/drbd/drbd-kernel-compat/cocci/queue_limits__no_has_max_hw_discard_sectors.cocci
@@ -0,0 +1,5 @@
+@@
+struct queue_limits lim;
+@@
+- lim.max_hw_discard_sectors
++ lim.max_discard_sectors
diff --git a/drbd/drbd-kernel-compat/gen_patch_names.c 
b/drbd/drbd-kernel-compat/gen_patch_names.c
index 6f62ea5827b7..5abc32725daf 100644
--- a/drbd/drbd-kernel-compat/gen_patch_names.c
+++ b/drbd/drbd-kernel-compat/gen_patch_names.c
@@ -296,6 +296,9 @@ int main(int argc, char **argv)
        patch(1, "write_zeroes", true, false,
              COMPAT_HAVE_REQ_OP_WRITE_ZEROES, "capable");
 
+       patch(1, "queue_limits", true, false,
+             COMPAT_QUEUE_LIMITS_HAS_MAX_HW_DISCARD_SECTORS, 
"has_max_hw_discard_sectors");
+
        patch(1, "bio_bi_opf", true, false,
              COMPAT_HAVE_BIO_BI_OPF, "present");
 
diff --git 
a/drbd/drbd-kernel-compat/tests/queue_limits_has_max_hw_discard_sectors.c 
b/drbd/drbd-kernel-compat/tests/queue_limits_has_max_hw_discard_sectors.c
new file mode 100644
index 000000000000..5dcf9c48667b
--- /dev/null
+++ b/drbd/drbd-kernel-compat/tests/queue_limits_has_max_hw_discard_sectors.c
@@ -0,0 +1,8 @@
+/* { "version": "v6.9-rc1", "commit": 
"4f563a64732dabb2677c7d1232a8f714a18b41b3", "comment": 
"lim.max_hw_discard_sectors was added", "author": "Christoph Hellwig 
<[email protected]>", "date": "Tue Feb 13 08:34:16 2024 +0100" } */
+
+#include <linux/blkdev.h>
+
+int foo(struct queue_limits *lim)
+{
+       return lim->max_hw_discard_sectors;
+}
-- 
2.35.3


++++++ 0021-compat-fixup-write_zeroes__no_capable.patch ++++++
>From 4578726d3b0e5b7c699659c1ecd26194060e7be7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Christoph=20B=C3=B6hmwalder?=
 <[email protected]>
Date: Thu, 29 Aug 2024 16:15:47 +0200
Subject: [PATCH 21/32] compat: fixup write_zeroes__no_capable

We now access the field directly instead of using this helper
---
 drbd/drbd-kernel-compat/cocci/write_zeroes__no_capable.cocci | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drbd/drbd-kernel-compat/cocci/write_zeroes__no_capable.cocci 
b/drbd/drbd-kernel-compat/cocci/write_zeroes__no_capable.cocci
index 4fa6d9e249d7..2b060e2abd16 100644
--- a/drbd/drbd-kernel-compat/cocci/write_zeroes__no_capable.cocci
+++ b/drbd/drbd-kernel-compat/cocci/write_zeroes__no_capable.cocci
@@ -30,5 +30,6 @@ expression e;
 +WARN_ON_ONCE(e); /* WRITE_ZEROES not supported on this kernel */
 
 @@
+struct queue_limits lim;
 @@
-- blk_queue_max_write_zeroes_sectors(...);
+- lim.max_write_zeroes_sectors = ...;
-- 
2.35.3


++++++ 0022-compat-fixup-queue_flag_discard__yes_present.patch ++++++
>From ce06250eb289e98bf97940104c92751282704783 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Christoph=20B=C3=B6hmwalder?=
 <[email protected]>
Date: Wed, 4 Sep 2024 19:05:06 +0200
Subject: [PATCH 22/32] compat: fixup queue_flag_discard__yes_present

blk_queue_discard_granularity does not exist anymore, just use the field
in queue_limits.
Match directly do drbd_reconsider_queue_parameters instead of trying to
guess the right function.
---
 .../queue_flag_discard__yes_present.cocci     | 30 ++++++-------------
 1 file changed, 9 insertions(+), 21 deletions(-)

diff --git 
a/drbd/drbd-kernel-compat/cocci/queue_flag_discard__yes_present.cocci 
b/drbd/drbd-kernel-compat/cocci/queue_flag_discard__yes_present.cocci
index cc28c3d02d82..e0ecc697b10a 100644
--- a/drbd/drbd-kernel-compat/cocci/queue_flag_discard__yes_present.cocci
+++ b/drbd/drbd-kernel-compat/cocci/queue_flag_discard__yes_present.cocci
@@ -1,27 +1,19 @@
 @@
-struct request_queue *q;
-@@
-(
-q->limits.max_discard_sectors = 0;
-+ blk_queue_flag_clear(QUEUE_FLAG_DISCARD, q);
-|
-q->limits.max_discard_sectors = ...;
-+ blk_queue_flag_set(QUEUE_FLAG_DISCARD, q);
-)
-
-@@
-struct request_queue *q;
+struct queue_limits lim;
+identifier q;
 @@
+struct request_queue *q = device->rq_queue;
+...
 (
-blk_queue_discard_granularity(q, 0);
+lim.max_hw_discard_sectors = 0;
 + blk_queue_flag_clear(QUEUE_FLAG_DISCARD, q);
 |
-blk_queue_discard_granularity(q, 512);
+lim.max_hw_discard_sectors = ...;
 + blk_queue_flag_set(QUEUE_FLAG_DISCARD, q);
 )
 
 @@
-identifier q, device, fn;
+identifier q, device;
 @@
 +static void fixup_discard_if_not_supported(struct request_queue *q)
 +{
@@ -31,18 +23,14 @@ identifier q, device, fn;
 +       * */
 +      if (!blk_queue_discard(q)) {
 +              blk_queue_max_discard_sectors(q, 0);
-+              blk_queue_discard_granularity(q, 0);
++              q->limits.discard_granularity = 0;
 +      }
 +}
 
-fn (struct drbd_device *device, ...)
+void drbd_reconsider_queue_parameters(struct drbd_device *device, ...)
 {
 ...
 struct request_queue *q = device->rq_queue;
 ...
-decide_on_discard_support(...);
-<+...
-blk_stack_limits(...);
-...+>
 + fixup_discard_if_not_supported(q);
 }
-- 
2.35.3


++++++ 0023-drbd-move-flags-to-queue_limits.patch ++++++
>From ac4e2f85066d2da306ec0e3fed8db4e945be6f6d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Christoph=20B=C3=B6hmwalder?=
 <[email protected]>
Date: Thu, 5 Sep 2024 13:03:07 +0200
Subject: [PATCH 23/32] drbd: move flags to queue_limits

Roughly equivalent to the following commits from upstream Linux:

1122c0c1 block: move cache control settings out of queue->flags
bd4a633b block: move the nonrot flag to queue_limits
1a02f3a7 block: move the stable_writes flag to queue_limits
---
 drbd/drbd_main.c | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/drbd/drbd_main.c b/drbd/drbd_main.c
index 2792b9896271..407b0a1d1773 100644
--- a/drbd/drbd_main.c
+++ b/drbd/drbd_main.c
@@ -3886,6 +3886,11 @@ enum drbd_ret_code drbd_create_device(struct 
drbd_config_context *adm_ctx, unsig
        int vnr = adm_ctx->volume;
        enum drbd_ret_code err = ERR_NOMEM;
        bool locked = false;
+       struct queue_limits lim = {
+               .features = BLK_FEAT_WRITE_CACHE | BLK_FEAT_FUA |
+                           BLK_FEAT_ROTATIONAL |
+                           BLK_FEAT_STABLE_WRITES,
+       };
 
        lockdep_assert_held(&resource->conf_update);
 
@@ -3948,7 +3953,7 @@ enum drbd_ret_code drbd_create_device(struct 
drbd_config_context *adm_ctx, unsig
 
        init_rwsem(&device->uuid_sem);
 
-       disk = blk_alloc_disk(NULL, NUMA_NO_NODE);
+       disk = blk_alloc_disk(&lim, NUMA_NO_NODE);
        if (IS_ERR(disk)) {
                err = PTR_ERR(disk);
                goto out_no_disk;
@@ -3967,9 +3972,6 @@ enum drbd_ret_code drbd_create_device(struct 
drbd_config_context *adm_ctx, unsig
        sprintf(disk->disk_name, "drbd%d", minor);
        disk->private_data = device;
 
-       blk_queue_flag_set(QUEUE_FLAG_STABLE_WRITES, disk->queue);
-       blk_queue_write_cache(disk->queue, true, true);
-
        device->md_io.page = alloc_page(GFP_KERNEL);
        if (!device->md_io.page)
                goto out_no_io_page;
-- 
2.35.3


++++++ 0024-compat-test-and-patch-for-queue_limits.features.patch ++++++
>From 3c18af1a3e8d67833e3ea8a2d38408501c9ee6be Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Christoph=20B=C3=B6hmwalder?=
 <[email protected]>
Date: Thu, 5 Sep 2024 13:05:59 +0200
Subject: [PATCH 24/32] compat: test and patch for queue_limits.features

And fixup compat patches that rely on blk_queue_write_cache being there.
Match to disk->private_data = ... instead.
---
 .../blk_queue_make_request__yes_present.cocci |  3 ++-
 .../blk_queue_merge_bvec__yes_present.cocci   | 21 +++++++++++-----
 .../cocci/congested_fn__yes_present.cocci     |  3 ++-
 .../queue_limits_features__no_present.cocci   | 25 +++++++++++++++++++
 drbd/drbd-kernel-compat/gen_patch_names.c     | 15 ++++++-----
 .../tests/queue_limits_has_features.c         |  8 ++++++
 6 files changed, 61 insertions(+), 14 deletions(-)
 create mode 100644 
drbd/drbd-kernel-compat/cocci/queue_limits_features__no_present.cocci
 create mode 100644 drbd/drbd-kernel-compat/tests/queue_limits_has_features.c

diff --git 
a/drbd/drbd-kernel-compat/cocci/blk_queue_make_request__yes_present.cocci 
b/drbd/drbd-kernel-compat/cocci/blk_queue_make_request__yes_present.cocci
index 63c65d21cb32..665e10cbaa1a 100644
--- a/drbd/drbd-kernel-compat/cocci/blk_queue_make_request__yes_present.cocci
+++ b/drbd/drbd-kernel-compat/cocci/blk_queue_make_request__yes_present.cocci
@@ -5,12 +5,13 @@ identifier make_request_fn;
 + blk_alloc_queue(GFP_KERNEL)
 
 @@
+struct gendisk *disk;
 identifier rm_blk_alloc_queue.make_request_fn;
 @@
 drbd_create_device(...)
 {
        ...
+       disk->private_data = ...;
 +      blk_queue_make_request(q, make_request_fn);
-       blk_queue_write_cache(...);
        ...
 }
diff --git 
a/drbd/drbd-kernel-compat/cocci/blk_queue_merge_bvec__yes_present.cocci 
b/drbd/drbd-kernel-compat/cocci/blk_queue_merge_bvec__yes_present.cocci
index d4c0d85810e8..bedb09f8b375 100644
--- a/drbd/drbd-kernel-compat/cocci/blk_queue_merge_bvec__yes_present.cocci
+++ b/drbd/drbd-kernel-compat/cocci/blk_queue_merge_bvec__yes_present.cocci
@@ -1,10 +1,10 @@
-@@
+@ add_drbd_merge_bvec_definition @
 identifier ws;
 @@
 +extern int drbd_merge_bvec(struct request_queue *, struct bvec_merge_data *, 
struct bio_vec *);
 extern void do_submit(struct work_struct *ws);
 
-@@
+@ add_drbd_merge_bvec @
 @@
 +/* This is called by bio_add_page().
 + *
@@ -44,9 +44,10 @@ extern void do_submit(struct work_struct *ws);
 do_submit(...)
 { ... }
 
-@@
+@ add_blk_queue_merge_bvec @
 symbol true;
 identifier q, resource, dev;
+struct gendisk *disk;
 @@
 drbd_create_device(...)
 {
@@ -68,9 +69,17 @@ struct request_queue *q;
 // also want to store it in queuedata for the compat.
 dev->rq_queue = q;
 + q->queuedata = dev;
-<...
-blk_queue_write_cache(q, true, true);
+...
+disk->private_data = ...;
 + blk_queue_merge_bvec(q, drbd_merge_bvec);
-...>
+...
 }
 
+@ script:python depends on !(add_drbd_merge_bvec_definition && 
add_drbd_merge_bvec && add_blk_queue_merge_bvec) @
+@@
+import sys
+print('ERROR: A rule making an essential change was not executed! 
(blk_queue_merge_bvec)', file=sys.stderr)
+print('ERROR: This would not show up as a compiler error, but would still 
break DRBD.', file=sys.stderr)
+print('ERROR: As a precaution, the build will be aborted here.', 
file=sys.stderr)
+sys.exit(1)
+
diff --git a/drbd/drbd-kernel-compat/cocci/congested_fn__yes_present.cocci 
b/drbd/drbd-kernel-compat/cocci/congested_fn__yes_present.cocci
index d0b55c3dffbf..a697311af6bd 100644
--- a/drbd/drbd-kernel-compat/cocci/congested_fn__yes_present.cocci
+++ b/drbd/drbd-kernel-compat/cocci/congested_fn__yes_present.cocci
@@ -63,14 +63,15 @@ drbd_cleanup(...)
 
 @@
 identifier dev;
+struct gendisk *disk;
 @@
 drbd_create_device(...)
 {
 ...
        struct drbd_device *dev;
 ...
+       disk->private_data = ...;
 +      q->backing_dev_info->congested_fn = drbd_congested;
 +      q->backing_dev_info->congested_data = dev;
-       blk_queue_write_cache(...);
 ...
 }
diff --git 
a/drbd/drbd-kernel-compat/cocci/queue_limits_features__no_present.cocci 
b/drbd/drbd-kernel-compat/cocci/queue_limits_features__no_present.cocci
new file mode 100644
index 000000000000..b9017351302b
--- /dev/null
+++ b/drbd/drbd-kernel-compat/cocci/queue_limits_features__no_present.cocci
@@ -0,0 +1,25 @@
+// NOTE this actually encompasses three patches:
+// 1122c0c1 block: move cache control settings out of queue->flags
+// bd4a633b block: move the nonrot flag to queue_limits
+// 1a02f3a7 block: move the stable_writes flag to queue_limits
+//
+// They add "BLK_FEAT_WRITE_CACHE | BLK_FEAT_FUA", "BLK_FEAT_ROTATIONAL", and
+// "BLK_FEAT_STABLE_WRITES", respectively.
+// Since these commits are all from the same series, just patch them together.
+@@
+expression e;
+struct gendisk *disk;
+identifier lim;
+@@
+-struct queue_limits lim = {
+-      .features = e,
+-};
+...
+blk_alloc_disk(
+-      &lim
++      NULL
+       , ...)
+...
+disk->private_data = ...;
++ blk_queue_flag_set(QUEUE_FLAG_STABLE_WRITES, disk->queue);
++ blk_queue_write_cache(disk->queue, true, true);
diff --git a/drbd/drbd-kernel-compat/gen_patch_names.c 
b/drbd/drbd-kernel-compat/gen_patch_names.c
index 5abc32725daf..cc3bad2d84e4 100644
--- a/drbd/drbd-kernel-compat/gen_patch_names.c
+++ b/drbd/drbd-kernel-compat/gen_patch_names.c
@@ -153,6 +153,9 @@ int main(int argc, char **argv)
        patch(1, "blk_cleanup_disk", false, true,
              COMPAT_HAVE_BLK_CLEANUP_DISK, "present");
 
+       patch(1, "queue_limits_features", true, false,
+             COMPAT_QUEUE_LIMITS_HAS_FEATURES, "present");
+
        patch(1, "blk_alloc_disk", true, false,
              COMPAT_BLK_ALLOC_DISK_TAKES_QUEUE_LIMITS, "takes_queue_limits");
 #if !defined(COMPAT_BLK_ALLOC_DISK_TAKES_QUEUE_LIMITS)
@@ -267,13 +270,13 @@ int main(int argc, char **argv)
        patch(1, "security_netlink_recv", false, true,
              COMPAT_HAVE_SECURITY_NETLINK_RECV, "present");
 
-#if defined(COMPAT_HAVE_QUEUE_FLAG_STABLE_WRITES)
-       /* in versions >=5.9, there is QUEUE_FLAG_STABLE_WRITES */
-#else
-       /* for <5.9 but >=3.9, fall back to BDI_CAP_STABLE_WRITES */
+       /*
+        * >= 6.10:  BLK_FEAT_STABLE_WRITES
+        * 5.9-6.10: QUEUE_FLAG_STABLE_WRITES
+        * <5.9:     BDI_CAP_STABLE_WRITES
+        */
        patch(1, "queue_flag_stable_writes", true, false,
-             NO, "present");
-#endif
+             COMPAT_HAVE_QUEUE_FLAG_STABLE_WRITES, "present");
 
        patch(1, "queue_flag_discard", false, true,
              COMPAT_HAVE_QUEUE_FLAG_DISCARD, "present");
diff --git a/drbd/drbd-kernel-compat/tests/queue_limits_has_features.c 
b/drbd/drbd-kernel-compat/tests/queue_limits_has_features.c
new file mode 100644
index 000000000000..e566a34bdda6
--- /dev/null
+++ b/drbd/drbd-kernel-compat/tests/queue_limits_has_features.c
@@ -0,0 +1,8 @@
+/* { "version": "v6.10", "commit": "1122c0c1cc71f740fa4d5f14f239194e06a1d5e7", 
"comment": "features field was introduced", "author": "Christoph Hellwig 
<[email protected]>", "date": "Mon Jun 17 08:04:40 2024 +0200" } */
+
+#include <linux/blkdev.h>
+
+unsigned int foo(struct queue_limits lim)
+{
+       return lim.features;
+}
-- 
2.35.3


++++++ 0025-drbd-Annotate-struct-fifo_buffer-with-__counted_by.patch ++++++
>From 85afbf893a6c7cd55e04407731e52d495b6f228f Mon Sep 17 00:00:00 2001
From: Kees Cook <[email protected]>
Date: Fri, 15 Sep 2023 13:03:16 -0700
Subject: [PATCH 25/32] drbd: Annotate struct fifo_buffer with __counted_by
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Prepare for the coming implementation by GCC and Clang of the __counted_by
attribute. Flexible array members annotated with __counted_by can have
their accesses bounds-checked at run-time checking via CONFIG_UBSAN_BOUNDS
(for array indexing) and CONFIG_FORTIFY_SOURCE (for strcpy/memcpy-family
functions).

As found with Coccinelle[1], add __counted_by for struct fifo_buffer.

[1] 
https://github.com/kees/kernel-tools/blob/trunk/coccinelle/examples/counted_by.cocci

Cc: Philipp Reisner <[email protected]>
Cc: Lars Ellenberg <[email protected]>
Cc: Christoph Böhmwalder <[email protected]>
Cc: Jens Axboe <[email protected]>
Cc: [email protected]
Cc: [email protected]
Reviewed-by: "Gustavo A. R. Silva" <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Kees Cook <[email protected]>
---
 drbd/drbd_int.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drbd/drbd_int.h b/drbd/drbd_int.h
index c18407899f59..182593257c6a 100644
--- a/drbd/drbd_int.h
+++ b/drbd/drbd_int.h
@@ -746,7 +746,7 @@ struct fifo_buffer {
        unsigned int head_index;
        unsigned int size;
        int total; /* sum of all values */
-       int values[];
+       int values[] __counted_by(size);
 };
 extern struct fifo_buffer *fifo_alloc(unsigned int fifo_size);
 
-- 
2.35.3


++++++ 0026-compat-test-and-patch-for-__counted_by.patch ++++++
>From 3a1d6d3e2bd0e1506995e316b183cef8abc0034b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Christoph=20B=C3=B6hmwalder?=
 <[email protected]>
Date: Fri, 6 Sep 2024 11:14:43 +0200
Subject: [PATCH 26/32] compat: test and patch for __counted_by

Unfortunately, the "attribute name" variable type only works with very
recent coccinelle versions (>=1.1.1). So add a hint about that in the
README.
---
 README.md                                            |  9 ++++-----
 .../cocci/counted_by__no_present.cocci               | 12 ++++++++++++
 drbd/drbd-kernel-compat/gen_patch_names.c            |  3 +++
 drbd/drbd-kernel-compat/tests/have_counted_by.c      |  8 ++++++++
 4 files changed, 27 insertions(+), 5 deletions(-)
 create mode 100644 drbd/drbd-kernel-compat/cocci/counted_by__no_present.cocci
 create mode 100644 drbd/drbd-kernel-compat/tests/have_counted_by.c

diff --git a/README.md b/README.md
index ec513d19438e..b63286db0113 100644
--- a/README.md
+++ b/README.md
@@ -38,7 +38,7 @@ Since version 9.0.20, DRBD has been using a kernel backwards 
compatibility syste
 based on [Coccinelle](https://github.com/coccinelle/coccinelle) semantic 
patches.
 While this has many advantages, it also makes it a little harder for "casual"
 developers to build DRBD from the git sources. The problem is that we require a
-very recent version of `spatch` (at least 1.0.8 at time of writing), and most
+very recent version of `spatch` (at least 1.1.1 at time of writing), and most
 distributions only have relatively old versions in their repositories.
 
 ## From git
@@ -48,10 +48,9 @@ For users wishing to build DRBD from its git sources, here 
are a few options:
    chances are you won't even have to use any of the compat features, which
    means you won't require compatibility patches and in turn don't need spatch
    installed.
-2. On Ubuntu 18.04 and newer, use a recent spatch version from the
-   [Coccinelle PPA](https://launchpad.net/~npalix/+archive/ubuntu/coccinelle).
-   This provides (at time of writing) version 1.0.8, which is recent enough to
-   build DRBD.
+2. Fedora >=39 packages Coccinelle 1.1.1, which is recent enough to build 
DRBD. **Warning**: while
+   Ubuntu also ships Coccinelle with supposedly the same version number 
(1.1.1), this version
+   is *not* able to build DRBD.
 3. Build and install spatch from source. This will also give you a version that
    is recent enough to build DRBD.
 
diff --git a/drbd/drbd-kernel-compat/cocci/counted_by__no_present.cocci 
b/drbd/drbd-kernel-compat/cocci/counted_by__no_present.cocci
new file mode 100644
index 000000000000..40db31bece0c
--- /dev/null
+++ b/drbd/drbd-kernel-compat/cocci/counted_by__no_present.cocci
@@ -0,0 +1,12 @@
+@@
+type T;
+identifier s, x;
+attribute name __counted_by;
+@@
+struct s {
+...
+       T x
+-      __counted_by(...)
+       ;
+...
+};
diff --git a/drbd/drbd-kernel-compat/gen_patch_names.c 
b/drbd/drbd-kernel-compat/gen_patch_names.c
index cc3bad2d84e4..72c1e25512ea 100644
--- a/drbd/drbd-kernel-compat/gen_patch_names.c
+++ b/drbd/drbd-kernel-compat/gen_patch_names.c
@@ -605,6 +605,9 @@ int main(int argc, char **argv)
        patch(1, "need_recalc_sigpending", false, true,
                COMPAT_NEED_RECALC_SIGPENDING, "need");
 
+       patch(1, "counted_by", true, false,
+               COMPAT_HAVE_COUNTED_BY, "present");
+
 /* #define BLKDEV_ISSUE_ZEROOUT_EXPORTED */
 /* #define BLKDEV_ZERO_NOUNMAP */
 
diff --git a/drbd/drbd-kernel-compat/tests/have_counted_by.c 
b/drbd/drbd-kernel-compat/tests/have_counted_by.c
new file mode 100644
index 000000000000..07fac32aad16
--- /dev/null
+++ b/drbd/drbd-kernel-compat/tests/have_counted_by.c
@@ -0,0 +1,8 @@
+/* { "version": "v6.4", "commit": "dd06e72e68bcb4070ef211be100d2896e236c8fb", 
"comment": "add __counted_by macro", "author": "Kees Cook 
<[email protected]>", "date": "Wed May 17 12:08:44 2023 -0700" } */
+
+#include <linux/compiler_attributes.h>
+
+struct foo {
+       int a;
+       int b[] __counted_by(a);
+};
-- 
2.35.3


++++++ 0027-drbd-fix-function-cast-warnings-in-state-machine.patch ++++++
>From fa5329fb2c7e089cbe712acecb2c75ba8887754e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Christoph=20B=C3=B6hmwalder?=
 <[email protected]>
Date: Fri, 6 Sep 2024 15:16:49 +0200
Subject: [PATCH 27/32] drbd: fix function cast warnings in state machine

Equivalent to upstream commit fe0b1e9a ("drbd: fix function cast
warnings in state machine").
---
 drbd/drbd_state.c        | 16 ++++++++++------
 drbd/drbd_state_change.h |  8 ++++----
 2 files changed, 14 insertions(+), 10 deletions(-)

diff --git a/drbd/drbd_state.c b/drbd/drbd_state.c
index 44f55ee5c939..100e32ba037f 100644
--- a/drbd/drbd_state.c
+++ b/drbd/drbd_state.c
@@ -3212,10 +3212,11 @@ static union drbd_state state_change_word(struct 
drbd_state_change *state_change
 
 int notify_resource_state_change(struct sk_buff *skb,
                                  unsigned int seq,
-                                 struct drbd_state_change *state_change,
+                                 void *state_change,
                                  enum drbd_notification_type type)
 {
-       struct drbd_resource_state_change *resource_state_change = 
state_change->resource;
+       struct drbd_resource_state_change *resource_state_change =
+               ((struct drbd_state_change *)state_change)->resource;
        struct drbd_resource *resource = resource_state_change->resource;
        struct resource_info resource_info = {
                .res_role = resource_state_change->role[NEW],
@@ -3232,9 +3233,10 @@ int notify_resource_state_change(struct sk_buff *skb,
 
 int notify_connection_state_change(struct sk_buff *skb,
                                    unsigned int seq,
-                                   struct drbd_connection_state_change 
*connection_state_change,
+                                   void *state_change,
                                    enum drbd_notification_type type)
 {
+       struct drbd_connection_state_change *connection_state_change = 
state_change;
        struct drbd_connection *connection = 
connection_state_change->connection;
        struct connection_info connection_info = {
                .conn_connection_state = connection_state_change->cstate[NEW],
@@ -3246,9 +3248,10 @@ int notify_connection_state_change(struct sk_buff *skb,
 
 int notify_device_state_change(struct sk_buff *skb,
                                unsigned int seq,
-                               struct drbd_device_state_change 
*device_state_change,
+                               void *state_change,
                                enum drbd_notification_type type)
 {
+       struct drbd_device_state_change *device_state_change = state_change;
        struct drbd_device *device = device_state_change->device;
        struct device_info device_info;
        device_state_change_to_info(&device_info, device_state_change);
@@ -3258,10 +3261,11 @@ int notify_device_state_change(struct sk_buff *skb,
 
 int notify_peer_device_state_change(struct sk_buff *skb,
                                     unsigned int seq,
-                                    struct drbd_peer_device_state_change 
*state_change,
+                                    void *state_change,
                                     enum drbd_notification_type type)
 {
-       struct drbd_peer_device *peer_device = state_change->peer_device;
+       struct drbd_peer_device_state_change *peer_device_state_change = 
state_change;
+       struct drbd_peer_device *peer_device = 
peer_device_state_change->peer_device;
        struct peer_device_info peer_device_info;
        peer_device_state_change_to_info(&peer_device_info, state_change);
 
diff --git a/drbd/drbd_state_change.h b/drbd/drbd_state_change.h
index 3dc8616dedd4..40687d40b222 100644
--- a/drbd/drbd_state_change.h
+++ b/drbd/drbd_state_change.h
@@ -69,19 +69,19 @@ extern void forget_state_change(struct drbd_state_change *);
 
 extern int notify_resource_state_change(struct sk_buff *,
                                         unsigned int,
-                                        struct drbd_state_change *,
+                                        void *,
                                         enum drbd_notification_type type);
 extern int notify_connection_state_change(struct sk_buff *,
                                           unsigned int,
-                                          struct drbd_connection_state_change 
*,
+                                          void *,
                                           enum drbd_notification_type type);
 extern int notify_device_state_change(struct sk_buff *,
                                       unsigned int,
-                                      struct drbd_device_state_change *,
+                                      void *,
                                       enum drbd_notification_type type);
 extern int notify_peer_device_state_change(struct sk_buff *,
                                            unsigned int,
-                                           struct 
drbd_peer_device_state_change *,
+                                           void *,
                                            enum drbd_notification_type type);
 
 #endif  /* DRBD_STATE_CHANGE_H */
-- 
2.35.3


++++++ 0028-Add-missing-documentation-of-peer_device-parameter-t.patch ++++++
>From 11e96ecc0575eb0d6d4e29caaffb70d1e299908d Mon Sep 17 00:00:00 2001
From: Simon Horman <[email protected]>
Date: Tue, 23 Jul 2024 10:41:52 +0100
Subject: [PATCH 28/32] Add missing documentation of peer_device parameter to
 Kernel doc.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

These parameters were added in commit 8164dd6c8ae1 ("drbd: Add peer
device parameter to whole-bitmap I/O handlers")

Flagged by W=1 builds.

Signed-off-by: Simon Horman <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Jens Axboe <[email protected]>
Signed-off-by: Christoph Böhmwalder <[email protected]>
---
 drbd/drbd_main.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/drbd/drbd_main.c b/drbd/drbd_main.c
index 407b0a1d1773..a216b725e66c 100644
--- a/drbd/drbd_main.c
+++ b/drbd/drbd_main.c
@@ -5356,6 +5356,7 @@ int drbd_bmio_set_all_n_write(struct drbd_device *device,
 /**
  * drbd_bmio_set_n_write() - io_fn for drbd_queue_bitmap_io() or 
drbd_bitmap_io()
  * @device:    DRBD device.
+ * @peer_device: Peer DRBD device.
  *
  * Sets all bits in the bitmap towards one peer and writes the whole bitmap to 
stable storage.
  */
@@ -5408,6 +5409,7 @@ int drbd_bmio_set_allocated_n_write(struct drbd_device 
*device,
 /**
  * drbd_bmio_clear_all_n_write() - io_fn for drbd_queue_bitmap_io() or 
drbd_bitmap_io()
  * @device:    DRBD device.
+ * @peer_device: Peer DRBD device.
  *
  * Clears all bits in the bitmap and writes the whole bitmap to stable storage.
  */
@@ -5474,6 +5476,7 @@ void drbd_queue_pending_bitmap_work(struct drbd_device 
*device)
  * @io_fn:     IO callback to be called when bitmap IO is possible
  * @done:      callback to be called after the bitmap IO was performed
  * @why:       Descriptive text of the reason for doing the IO
+ * @peer_device: Peer DRBD device.
  *
  * While IO on the bitmap happens we freeze application IO thus we ensure
  * that drbd_set_out_of_sync() can not be called. This function MAY ONLY be
@@ -5549,6 +5552,7 @@ void drbd_queue_bitmap_io(struct drbd_device *device,
  * @device:    DRBD device.
  * @io_fn:     IO callback to be called when bitmap IO is possible
  * @why:       Descriptive text of the reason for doing the IO
+ * @peer_device: Peer DRBD device.
  *
  * freezes application IO while that the actual IO operations runs. This
  * functions MAY NOT be called from sender context.
-- 
2.35.3


++++++ 0030-drbd-kref_put-path-when-kernel_accept-fails.patch ++++++
>From 9fe2be655a793d2f9425b96e53a7e1e7feec067e Mon Sep 17 00:00:00 2001
From: Joel Colledge <[email protected]>
Date: Wed, 18 Sep 2024 15:08:55 +0200
Subject: [PATCH 30/32] drbd: kref_put() path when kernel_accept() fails

We need to put the reference that dtt_wait_connect_cond() gets.

This is an unusual situation. The function dtt_wait_connect_cond() only
returns a path when pending_accepts is positive or there is a socket in
the path->sockets list. So if the code reaches the kernel_accept() call,
we expect it to succeed. However, it has been observed to fail, so we
need to handle that case cleanly.

Without the kref_put(), it is impossible to rmmod drbd.

For any error other than -EAGAIN, the error is be passed up and is
logged by conn_connect(). However, when -EAGAIN is returned,
dtt_connect() continues trying to connect and the error from
kernel_accept() leaves no traces in the logs.
---
 drbd/drbd_transport_tcp.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drbd/drbd_transport_tcp.c b/drbd/drbd_transport_tcp.c
index df144fcb4522..d59f68d83c58 100644
--- a/drbd/drbd_transport_tcp.c
+++ b/drbd/drbd_transport_tcp.c
@@ -625,8 +625,10 @@ retry:
 
                s_estab = NULL;
                err = kernel_accept(listener->s_listen, &s_estab, O_NONBLOCK);
-               if (err < 0)
+               if (err < 0) {
+                       kref_put(&path->path.kref, drbd_destroy_path);
                        return err;
+               }
 
                /* The established socket inherits the sk_state_change callback
                   from the listening socket. */
-- 
2.35.3


++++++ 0031-build-fix-typo-in-Makefile.spatch.patch ++++++
>From 903779df9a65ac04814afb1530423914bdfe305c Mon Sep 17 00:00:00 2001
From: Lars Ellenberg <[email protected]>
Date: Sun, 6 Oct 2024 01:14:19 +0200
Subject: [PATCH 31/32] build: fix typo in Makefile.spatch

The variable name should be cached_compat_h, compat_h does not exist.
Noticed when built with `make -j`:
Because of the empty prerequisites, sometimes make would try to build
kernelrelease.txt before the directory was created.
---
 drbd/Makefile.spatch | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drbd/Makefile.spatch b/drbd/Makefile.spatch
index bbcf10dc0603..a5cc774c18b5 100644
--- a/drbd/Makefile.spatch
+++ b/drbd/Makefile.spatch
@@ -42,7 +42,7 @@ cached_compat_patch := $(cache_dir)/compat.patch
 
 # Remember which kernel releases this supposedly works for.
 # If KERNELRELEASE is not known, will add an empty line (at most once).
-$(cache_dir)/kernelrelease.txt: $(compat_h) FORCE
+$(cache_dir)/kernelrelease.txt: $(cached_compat_h) FORCE
        $(Q)set -e;                                             \
        grep -sqxFe "$(KERNELRELEASE)" $@ < /dev/null ||        \
        echo $(KERNELRELEASE) >> $@;
-- 
2.35.3


++++++ 0032-drbd-open-do-not-delay-open-if-already-Primary.patch ++++++
>From 13ada1be201eb14ff8295a17194de8db5cdccd7f Mon Sep 17 00:00:00 2001
From: Lars Ellenberg <[email protected]>
Date: Wed, 2 Oct 2024 14:34:02 +0200
Subject: [PATCH 32/32] drbd: open: do not delay open() if already Primary

Since 48376549f (drbd: When a remote state change is active to not touch the 
open_counts, 2017-10-30)
if a remote state change is pending when someone tries to open() a DRBD volume,
we wait, interruptible, for "auto-promote-timeout",
until that state change is finalized (committed or aborted),
or give up with EAGAIN if the auto-promote timeout is reached.

auto-promote-timeout by default is much smaller than twopc-timeout,
so we may get spurious open() failures.

This could be mitigated with auto-promote-timeout > twopc-timeout.

But we can just ignore the pending state change,
if changing the open_cnt won't make a difference:
if we are already Primary, or we already have openers anyways.

If
- we have some remote state change pending,
- and we are not Primary already,
- and we do not have any openers, or this is an open with write intent,
we reject NDELAY openers immediately.
Normal openers wait for the state change to be finalized
(or give up after auto-promote-timeout).

We do not need to wait if:
- there is no remote state change pending,
- or we are already Primary anyways,
- or we are Secondary, this is a read-only open, and we have openers already.

Note: we may still want to immediately reject NDELAY open if
there is a remote state change pending, even if we have an
open count != 0. These are typically short lived openers
triggered via udev. If they overlap (new open comes in
before previous close), these may still accumulate enough
time to mess with state changes.
For now, I decide to allow them.
---
 drbd/drbd_main.c | 22 ++++++++++++++++++++--
 1 file changed, 20 insertions(+), 2 deletions(-)

diff --git a/drbd/drbd_main.c b/drbd/drbd_main.c
index a216b725e66c..258be3b9c10d 100644
--- a/drbd/drbd_main.c
+++ b/drbd/drbd_main.c
@@ -2583,10 +2583,21 @@ enum ioc_rv {
        IOC_ABORT = 2,
 };
 
+/* If we are in the middle of a cluster wide state change, we don't want
+ * to change (open_cnt == 0), as that then could cause a failure to commit
+ * some already promised peer auto-promote locally.
+ * So we wait until the pending remote_state_change is finalized,
+ * or give up when the timeout is reached.
+ *
+ * But we don't want to fail an open on a Primary just because it happens
+ * during some unrelated remote state change.
+ * If we are already Primary, or already have an open count != 0,
+ * we don't need to wait, it won't change anything.
+ */
 static enum ioc_rv inc_open_count(struct drbd_device *device, blk_mode_t mode)
 {
        struct drbd_resource *resource = device->resource;
-       enum ioc_rv r = mode & BLK_OPEN_NDELAY ? IOC_ABORT : IOC_SLEEP;
+       enum ioc_rv r;
 
        if (test_bit(DOWN_IN_PROGRESS, &resource->flags))
                return IOC_ABORT;
@@ -2594,7 +2605,14 @@ static enum ioc_rv inc_open_count(struct drbd_device 
*device, blk_mode_t mode)
        read_lock_irq(&resource->state_rwlock);
        if (test_bit(UNREGISTERED, &device->flags))
                r = IOC_ABORT;
-       else if (!resource->remote_state_change) {
+       else if (resource->remote_state_change &&
+               resource->role[NOW] != R_PRIMARY &&
+               (device->open_cnt == 0 || mode & BLK_OPEN_WRITE)) {
+               if (mode & BLK_OPEN_NDELAY)
+                       r = IOC_ABORT;
+               else
+                       r = IOC_SLEEP;
+       } else {
                r = IOC_OK;
                device->open_cnt++;
                if (mode & BLK_OPEN_WRITE)
-- 
2.35.3


++++++ boo1231290_fix_drbd_build_error_against_kernel_v6.11.0.patch ++++++
Oct 11, 2024. by [email protected]

This patch includes the following 4 changes for passing the build on v6.11.0.

-------------
for 'queue_flag_stable_writes__no_present', modifying
drbd-kernel-compat/cocci/queue_flag_stable_writes__no_present.cocci

upstream kernel:
commit 1a02f3a73f8c670eddeb44bf52a75ae7f67cfc11
Author: Christoph Hellwig <[email protected]>
Date:   Mon Jun 17 08:04:44 2024 +0200

    block: move the stable_writes flag to queue_limits

-------------
for 'disk_update_readahead__no_present', modifying
drbd-kernel-compat/cocci/disk_update_readahead__no_present.cocci

upstream kernel:
commit 73781b3b81e76583708a652c853d54d03dce031d
Author: Christoph Hellwig <[email protected]>
Date:   Wed Jun 26 16:26:27 2024 +0200

    block: remove disk_update_readahead

--------------
for 'blk_queue_update_readahead__no_present', modifying
'drbd-kernel-compat/gen_patch_names.c', which bypasses the
testing of COMPAT_HAVE_BLK_QUEUE_UPDATE_READAHEAD.

---------------
for 'blk_queue_write_cache__no_present__yes_flush', modifying 
drbd-kernel-compat/tests/have_blk_queue_write_cache.c

upstream kernel:
commit 62e35f942231e372f8e465d8484de66a60221226
Author: Christoph Hellwig <[email protected]>
Date:   Thu Jun 27 13:14:03 2024 +0200

    block: pass a gendisk to the queue_sysfs_entry methods

---------------

diff -Nupr 
a/drbd/drbd-kernel-compat/cocci/disk_update_readahead__no_present.cocci 
b/drbd/drbd-kernel-compat/cocci/disk_update_readahead__no_present.cocci
--- a/drbd/drbd-kernel-compat/cocci/disk_update_readahead__no_present.cocci     
2024-10-11 09:23:43.340688884 +0800
+++ b/drbd/drbd-kernel-compat/cocci/disk_update_readahead__no_present.cocci     
2024-10-11 09:27:53.755206413 +0800
@@ -6,5 +6,5 @@ type T;
 T q = dev->rq_queue;
 <...
 - disk_update_readahead(dev->vdisk);
-+ blk_queue_update_readahead(q);
++ blk_apply_bdi_limits(dev->vdisk->bdi, &dev->vdisk->queue->limits);
 ...>
diff -Nupr 
a/drbd/drbd-kernel-compat/cocci/queue_flag_stable_writes__no_present.cocci 
b/drbd/drbd-kernel-compat/cocci/queue_flag_stable_writes__no_present.cocci
--- a/drbd/drbd-kernel-compat/cocci/queue_flag_stable_writes__no_present.cocci  
2024-10-11 09:23:25.420604140 +0800
+++ b/drbd/drbd-kernel-compat/cocci/queue_flag_stable_writes__no_present.cocci  
2024-10-11 09:28:33.265393250 +0800
@@ -2,4 +2,4 @@
 expression q;
 @@
 - blk_queue_flag_set(QUEUE_FLAG_STABLE_WRITES, q);
-+ q->backing_dev_info->capabilities |= BDI_CAP_STABLE_WRITES;
++ q->limits.features |= BLK_FEAT_STABLE_WRITES;
diff -Nupr a/drbd/drbd-kernel-compat/gen_patch_names.c 
b/drbd/drbd-kernel-compat/gen_patch_names.c
--- a/drbd/drbd-kernel-compat/gen_patch_names.c 2024-10-11 09:24:54.021023132 
+0800
+++ b/drbd/drbd-kernel-compat/gen_patch_names.c 2024-10-11 09:26:48.508231197 
+0800
@@ -405,6 +405,7 @@ int main(int argc, char **argv)
        patch(1, "disk_update_readahead", true, false,
              COMPAT_HAVE_DISK_UPDATE_READAHEAD, "present");
 
+#if 0
 #if !defined(COMPAT_HAVE_DISK_UPDATE_READAHEAD)
        /* disk_update_readahead is the "new version" of
         * blk_queue_update_readahead. we only need to consider compat
@@ -412,6 +413,7 @@ int main(int argc, char **argv)
        patch(1, "blk_queue_update_readahead", true, false,
              COMPAT_HAVE_BLK_QUEUE_UPDATE_READAHEAD, "present");
 #endif
+#endif
 
        patch(1, "struct_gendisk", true, false,
              COMPAT_STRUCT_GENDISK_HAS_BACKING_DEV_INFO, 
"has_backing_dev_info");
diff -Nupr a/drbd/drbd-kernel-compat/tests/have_blk_queue_write_cache.c 
b/drbd/drbd-kernel-compat/tests/have_blk_queue_write_cache.c
--- a/drbd/drbd-kernel-compat/tests/have_blk_queue_write_cache.c        
2024-10-11 09:25:57.557990258 +0800
+++ b/drbd/drbd-kernel-compat/tests/have_blk_queue_write_cache.c        
2024-10-11 09:27:17.571701979 +0800
@@ -2,5 +2,5 @@
 
 void dummy(struct request_queue *q, bool enabled, bool fua)
 {
-       blk_queue_write_cache(q, enabled, fua);
+       blk_queue_write_cache(q);
 }

++++++ drbd-9.1.16.tar.gz -> drbd-9.1.22.tar.gz ++++++
++++ 202402 lines of diff (skipped)

++++++ drbd_git_revision ++++++
--- /var/tmp/diff_new_pack.dOzgE3/_old  2024-10-11 17:02:50.131980458 +0200
+++ /var/tmp/diff_new_pack.dOzgE3/_new  2024-10-11 17:02:50.135980629 +0200
@@ -1,2 +1,2 @@
-GIT-hash: 288abda1fb8c93e385960af01ab28729fefdaa38
+GIT-hash: 13ada1be201eb14ff8295a17194de8db5cdccd7f
 

++++++ suse-coccinelle.patch ++++++
--- /var/tmp/diff_new_pack.dOzgE3/_old  2024-10-11 17:02:50.167981984 +0200
+++ /var/tmp/diff_new_pack.dOzgE3/_new  2024-10-11 17:02:50.171982154 +0200
@@ -1,77 +1,72 @@
-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 "  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 "  -------------------   ";
-+
-     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
++      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 "  APPLIED_COCCI_FILES   ";
++      cat $incdir/applied_cocci_files.txt;
++      echo "  -------------------   ";
++
+       rm $incdir/gen_patch_names
+       # truncat them all
+       : > $incdir/.compat.cocci
+@@ -72,15 +82,28 @@ if hash spatch && spatch_is_recent; then
+                       >> $incdir/.compat.cocci.tmp
+       done
  
-       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  ";
-+
-       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
-+
-+    echo "  GENSPATCHFILE $compat_patch.tmp  ";
-+    cat $compat_patch.tmp;
-+
-     if [ -e $incdir/.compat.patch ]; then
-+      echo "  EXIST $incdir/.compat.patch  ";
-       cat $incdir/.compat.patch >> $compat_patch.tmp
+       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;
++
+               # sources=( ... ) passed in via environment
+               echo "  SPATCH   $chksum  "$K
+               set +e
++
++              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  ";
++
+               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
-+
-     mv $compat_patch.tmp $compat_patch
-     # keep it around
-     # to better be able to match the "stderr" warnings to their source files
+       if [ -s $incdir/.compat.patch ]; then
++              echo "  EXIST $incdir/.compat.patch  ";
+               cat $incdir/.compat.patch >> $compat_patch.tmp
++              cat $compat_patch.tmp;
++      fi
++
++      if [ -e $incdir/.spatch.stderr ]; then
++              echo "  GENSPATCHERR .spatch.stderr";
++              cat $incdir/.spatch.stderr;
+       fi
+ 
+       if [ -s $compat_patch.tmp ]; then
 

Reply via email to