diff --git a/_service b/_service index acf2f53..23ec09d 100644 --- a/_service +++ b/_service @@ -9,9 +9,9 @@ This will download branch first instead of tag. drbd-9.0 - 9.0.20~1 + 9.0.22~1 --> - 9.0.20~1+git.%h + 9.0.22~1+git.%h drbd-9.0 diff --git a/drbd-9.0.20~1+git.7dce3c8b.tar.bz2 b/drbd-9.0.20~1+git.7dce3c8b.tar.bz2 deleted file mode 100644 index ffc6e0f..0000000 --- a/drbd-9.0.20~1+git.7dce3c8b.tar.bz2 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d8e52116da1c4e6b4150251740944e1a0558ca69420785306c8492f6b40c58d1 -size 341239 diff --git a/drbd-9.0.22~1+git.fe2b5983.tar.bz2 b/drbd-9.0.22~1+git.fe2b5983.tar.bz2 new file mode 100644 index 0000000..281aa27 --- /dev/null +++ b/drbd-9.0.22~1+git.fe2b5983.tar.bz2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2882a9f5f0b03e5aeba74abdd6f5abf0430fdc7865220ac5b93c18a2070ca461 +size 346017 diff --git a/drbd-update-resync-target-s-dagtag.patch b/drbd-update-resync-target-s-dagtag.patch deleted file mode 100644 index 970ca1a..0000000 --- a/drbd-update-resync-target-s-dagtag.patch +++ /dev/null @@ -1,118 +0,0 @@ -From 215814e03ee59e8aa1c69084732d7036c06b564f Mon Sep 17 00:00:00 2001 -From: Philipp Reisner -Date: Wed, 6 Nov 2019 13:29:24 +0100 -Subject: [PATCH] drbd: Update resync target's dagtag after a reconciliation - resync - -Updating the resync target's dagtag towards the lost node after a -reconciliation resync is the right way to avoid that the reconciliation -resync is done multiple times. ---- - drbd/drbd_int.h | 5 +++++ - drbd/drbd_main.c | 1 + - drbd/drbd_receiver.c | 7 +++++++ - drbd/drbd_sender.c | 21 ++++++++++++++++++++- - 4 files changed, 33 insertions(+), 1 deletion(-) - -diff --git a/drbd/drbd_int.h b/drbd/drbd_int.h -index 0b13ecd6..7db21238 100644 ---- a/drbd/drbd_int.h -+++ b/drbd/drbd_int.h -@@ -1058,6 +1058,11 @@ struct drbd_connection { - u64 current_dagtag_sector; - } send; - -+ struct { -+ u64 dagtag_sector; -+ int lost_node_id; -+ } after_reconciliation; -+ - unsigned int peer_node_id; - struct list_head twopc_parent_list; - struct rcu_head rcu; -diff --git a/drbd/drbd_main.c b/drbd/drbd_main.c -index 2d52681e..a7294639 100644 ---- a/drbd/drbd_main.c -+++ b/drbd/drbd_main.c -@@ -3488,6 +3488,7 @@ struct drbd_connection *drbd_create_connection(struct drbd_resource *resource, - kref_get(&resource->kref); - kref_debug_get(&resource->kref_debug, 3); - connection->resource = resource; -+ connection->after_reconciliation.lost_node_id = -1; - - INIT_LIST_HEAD(&connection->transport.paths); - connection->transport.log_prefix = resource->name; -diff --git a/drbd/drbd_receiver.c b/drbd/drbd_receiver.c -index 82abd9c4..f69fc7b8 100644 ---- a/drbd/drbd_receiver.c -+++ b/drbd/drbd_receiver.c -@@ -7486,6 +7486,11 @@ static int receive_peer_dagtag(struct drbd_connection *connection, struct packet - if (new_repl_state != L_ESTABLISHED) { - unsigned long irq_flags; - -+ if (new_repl_state == L_WF_BITMAP_T) { -+ connection->after_reconciliation.dagtag_sector = be64_to_cpu(p->dagtag); -+ connection->after_reconciliation.lost_node_id = be32_to_cpu(p->node_id); -+ } -+ - drbd_info(connection, "Reconciliation resync because \'%s\' disappeared. (o=%d)\n", - lost_peer->transport.net_conf->name, (int)dagtag_offset); - -@@ -7893,6 +7898,8 @@ void conn_disconnect(struct drbd_connection *connection) - - drain_resync_activity(connection); - -+ connection->after_reconciliation.lost_node_id = -1; -+ - /* Wait for current activity to cease. This includes waiting for - * peer_request queued to the submitter workqueue. */ - conn_wait_ee_empty(connection, &connection->active_ee); -diff --git a/drbd/drbd_sender.c b/drbd/drbd_sender.c -index f71ce5f6..ea6fa372 100644 ---- a/drbd/drbd_sender.c -+++ b/drbd/drbd_sender.c -@@ -1035,6 +1035,23 @@ static void init_resync_stable_bits(struct drbd_peer_device *first_target_pd) - clear_bit(STABLE_RESYNC, &device->flags); - } - -+static void after_reconciliation_resync(struct drbd_connection *connection) -+{ -+ struct drbd_connection *lost_peer = -+ drbd_get_connection_by_node_id(connection->resource, -+ connection->after_reconciliation.lost_node_id); -+ -+ if (lost_peer) { -+ if (lost_peer->cstate[NOW] < C_CONNECTED) -+ lost_peer->last_dagtag_sector = -+ connection->after_reconciliation.dagtag_sector; -+ -+ kref_put(&lost_peer->kref, drbd_destroy_connection); -+ } -+ -+ connection->after_reconciliation.lost_node_id = -1; -+} -+ - int drbd_resync_finished(struct drbd_peer_device *peer_device, - enum drbd_disk_state new_peer_disk_state) - { -@@ -1203,7 +1220,7 @@ int drbd_resync_finished(struct drbd_peer_device *peer_device, - } else if (repl_state[NOW] == L_SYNC_SOURCE || repl_state[NOW] == L_PAUSED_SYNC_S) { - if (new_peer_disk_state != D_MASK) - __change_peer_disk_state(peer_device, new_peer_disk_state); -- if (peer_device->connection->agreed_pro_version < 110) { -+ if (connection->agreed_pro_version < 110) { - drbd_uuid_set_bitmap(peer_device, 0UL); - drbd_print_uuids(peer_device, "updated UUIDs"); - } -@@ -1226,6 +1243,8 @@ out_unlock: - - resync_again(device, source_m, target_m); - spin_unlock_irq(&device->resource->req_lock); -+ if (connection->after_reconciliation.lost_node_id != -1) -+ after_reconciliation_resync(connection); - - out: - /* reset start sector, if we reached end of device */ --- -2.16.4 - diff --git a/drbd.changes b/drbd.changes index f311664..33472d9 100644 --- a/drbd.changes +++ b/drbd.changes @@ -1,3 +1,49 @@ +------------------------------------------------------------------- +Tue Mar 10 09:03:04 UTC 2020 - nick wang + +- bsc#1166298, Update to drbd-9.0.22-1 + * introduce locking to avoid connection retries when UUIDs or + relevant flags change during the exchange of this data + * improve serialization of events after loosing a primary + * fix a constraint in sanitize state that can caused a promote to be + deliced by some other node + * fix a case of a false positive detection of a split brain condition + * allow a resync target to switch to the resync source with less + bits out of sync + * fix bitmap UUID after resync to use current UUID from self rather + than sync source + * fix pushing bitmap UUID into history when changed + * fix regression introduced with 9.0.20, that can cause a missed + resync after a reconciliation resync + * fix regression introduced with 9.0.20, that can cause a missed + resync after a promote on a diskless node + * fix UUID handling in case a node promotes during (a short) + reconciliation resync + * fix removing of a diskless node when quorum is enabled + +------------------------------------------------------------------- +Tue Feb 25 07:03:39 UTC 2020 - nick wang + +- Update to drbd-9.0.21-1, require coccinelle >= 1.0.8 + * fix compat for write same on linux 4.9 and the Debian users + * fix kernel compat for linux 4.8 and 4.9; this mainly affected Debian + users; The symptoms where slow resync and resync getting stuck always at + the same point + * enable resync of lost and re-created backing devices (think lost node) when + the backing device was thinly provisioned and its current uuid is pre-set + to a 'day0 UUID' (by LINSTOR); that works by copying a unused bitmap slot + which tracks all changes since day 0 + * fix attach when bitmap is on PMEM; before it was set to + 'all blocks out-of-sync' upon attach + * avoid doing reconciliation resync multiple times by updating the + resync target's dagtag after if completed successfully + * return disk-state from Outdated to UpToDate when it loses connection + while in WFBitMapT and we have a stable and UpToDate peer + * new option --force-resync flag can be passed to new-current-uuid, that + can be used to trigger initial resync without touching the role +- Remove upstream drbd-update-resync-target-s-dagtag.patch +- Modify patch suse-coccinelle.patch to adopt spaas + ------------------------------------------------------------------- Fri Jan 3 08:52:14 UTC 2020 - nick wang diff --git a/drbd.spec b/drbd.spec index 3845fd9..47b80b7 100644 --- a/drbd.spec +++ b/drbd.spec @@ -23,7 +23,7 @@ %endif %endif Name: drbd -Version: 9.0.20~1+git.7dce3c8b +Version: 9.0.22~1+git.fe2b5983 Release: 0 Summary: Linux driver for the "Distributed Replicated Block Device" License: GPL-2.0-or-later @@ -36,12 +36,11 @@ Source3: drbd_git_revision Patch1: fix-resync-finished-with-syncs-have-bits-set.patch Patch2: rely-on-sb-handlers.patch Patch3: drbd-fix-zero-metadata-limit-by-page-size-misaligned.patch -Patch4: drbd-update-resync-target-s-dagtag.patch #In 61ff72f401680(v5.5-rc2), pr_warning is removed -Patch5: without_pr_warning.patch -Patch6: suse-coccinelle.patch +Patch4: without_pr_warning.patch +Patch99: suse-coccinelle.patch #https://github.com/openSUSE/rpmlint-checks/blob/master/KMPPolicyCheck.py -BuildRequires: coccinelle +BuildRequires: coccinelle >= 1.0.8 BuildRequires: kernel-source BuildRequires: kernel-syms BuildRequires: libelf-devel @@ -76,8 +75,7 @@ installed kernel. %patch2 -p1 %patch3 -p1 %patch4 -p1 -%patch5 -p1 -%patch6 -p1 +%patch99 -p1 mkdir source cp -a drbd/. source/. || : @@ -97,8 +95,8 @@ export SPAAS='false' for flavor in %{flavors_to_build}; do rm -rf $flavor - cp -r source $flavor - cp %{_sourcedir}/Module.supported $flavor + cp -a -r source $flavor + cp -a %{_sourcedir}/Module.supported $flavor export DRBDSRC="$PWD/obj/$flavor" # bsc#1160194, check the coccicheck work. #make coccicheck diff --git a/drbd_git_revision b/drbd_git_revision index b44ca2b..5b11edb 100644 --- a/drbd_git_revision +++ b/drbd_git_revision @@ -1 +1 @@ -GIT-hash: 7dce3c8be99f4912f1490f9bb37f5aff6c873335 +GIT-hash: fe2b59836bdf1c7c81ccbaad8ef8016d9c3ba582 diff --git a/suse-coccinelle.patch b/suse-coccinelle.patch index 5e07dc2..4c2b814 100644 --- a/suse-coccinelle.patch +++ b/suse-coccinelle.patch @@ -1,60 +1,73 @@ -diff -Naur drbd-9.0.20~1+git.7dce3c8b.orig/drbd/drbd-kernel-compat/gen_compat_patch.sh drbd-9.0.20~1+git.7dce3c8b/drbd/drbd-kernel-compat/gen_compat_patch.sh ---- drbd-9.0.20~1+git.7dce3c8b.orig/drbd/drbd-kernel-compat/gen_compat_patch.sh 2020-01-09 13:38:00.998984586 +0800 -+++ drbd-9.0.20~1+git.7dce3c8b/drbd/drbd-kernel-compat/gen_compat_patch.sh 2020-01-09 13:38:10.407036976 +0800 -@@ -41,6 +41,15 @@ +diff -Naur drbd-9.0.21~1+git.449d6bf2.orig/drbd/drbd-kernel-compat/gen_compat_patch.sh drbd-9.0.21~1+git.449d6bf2/drbd/drbd-kernel-compat/gen_compat_patch.sh +--- drbd-9.0.21~1+git.449d6bf2.orig/drbd/drbd-kernel-compat/gen_compat_patch.sh 2019-12-16 14:42:10.832866579 +0800 ++++ drbd-9.0.21~1+git.449d6bf2/drbd/drbd-kernel-compat/gen_compat_patch.sh 2019-12-16 15:11:08.209750606 +0800 +@@ -56,29 +56,49 @@ < drbd-kernel-compat/cocci/debugfs_compat_template.cocci.in \ - >> $incdir/.compat.cocci; - done; + >> $incdir/.compat.cocci + done + + echo " APPLIED_COCCI_FILES "; + cat $incdir/applied_cocci_files.txt; ++ + coccilibpath=$(rpm -ql coccinelle|grep standard.h|xargs dirname); + echo " SPATCH_SOURCES: "$*; + echo " COCCI_LIBPATH: "$coccilibpath; -+ 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 -@@ -49,7 +58,8 @@ - # argument away this is shell $@ respectively $* now. - # we know we don't have white-space in the argument list - -- command="spatch --sp-file $incdir/.compat.cocci $* --macro-file drbd-kernel-compat/cocci_macros.h --very-quiet > $compat_patch.tmp 2> $incdir/.spatch.stderr;" -+ 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 > $compat_patch.tmp 2> $incdir/.spatch.stderr;" -+ echo " SPATCH COMMAND $command "; - - if test -t 0; then - $SHELL -c "$command" -@@ -59,6 +69,14 @@ - # They may ignore INT and TERM; if you have to, use HUP. - /dev/null script --append $incdir/.spatch.tty.out --return --quiet --command "$command" - fi + if [ -e $incdir/.compat.cocci ]; then +- 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 +- # make $^, the source (and header) files spatch should operate on, +- # are "the rest of the shell argument array", so after shifting the first +- # argument away this is shell $@ respectively $* now. +- # we know we don't have white-space in the argument list +- +- command="spatch --sp-file $incdir/.compat.cocci $* --macro-file drbd-kernel-compat/cocci_macros.h --very-quiet > $compat_patch.tmp 2> $incdir/.spatch.stderr;" +- +- if test -t 0; then +- $SHELL -c "$command" +- else +- # spatch is broken in a way: it "requires" a tty. +- # provide a tty using "script", so I can have several spatch in parallel. +- # They may ignore INT and TERM; if you have to, use HUP. +- /dev/null script --append $incdir/.spatch.tty.out --return --quiet --command "$command" +- fi ++ 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 ++ # make $^, the source (and header) files spatch should operate on, ++ # are "the rest of the shell argument array", so after shifting the first ++ # argument away this is shell $@ respectively $* now. ++ # we know we don't have white-space in the argument list ++ ++ 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 > $compat_patch.tmp 2> $incdir/.spatch.stderr;" ++ echo " SPATCH COMMAND $command "; ++ ++ if test -t 0; then ++ $SHELL -c "$command" ++ else ++ # spatch is broken in a way: it "requires" a tty. ++ # provide a tty using "script", so I can have several spatch in parallel. ++ # They may ignore INT and TERM; if you have to, use HUP. ++ /dev/null script --append $incdir/.spatch.tty.out --return --quiet --command "$command" ++ fi + else +- echo " SPATCH $chksum "$K" - nothing to do" +- touch $compat_patch.tmp ++ echo " SPATCH $chksum "$K" - nothing to do" ++ touch $compat_patch.tmp ++ fi + + echo " GENSPATCHFILE $compat_patch.tmp "; + cat $compat_patch.tmp; + if [ -e $incdir/.spatch.stderr ]; then + echo " GENSPATCHERR .spatch.stderr"; + cat $incdir/.spatch.stderr; -+ fi + fi + if [ -e $incdir/.compat.patch ]; then - cat $incdir/.compat.patch >> $compat_patch.tmp; - fi; -diff -Naur drbd-9.0.20~1+git.7dce3c8b.orig/Makefile drbd-9.0.20~1+git.7dce3c8b/Makefile ---- drbd-9.0.20~1+git.7dce3c8b.orig/Makefile 2020-01-09 13:38:00.994984563 +0800 -+++ drbd-9.0.20~1+git.7dce3c8b/Makefile 2020-01-09 13:41:50.512262670 +0800 -@@ -310,9 +310,11 @@ - endif - - coccicheck: coccinelle/*.cocci -+ $(eval coccilibpath := $(shell rpm -ql coccinelle|grep standard.h|xargs dirname)) - @for file in $^ ; do \ - echo " COCCICHECK $$(basename $${file} .cocci)"; \ -- spatch --very-quiet drbd/drbd_*.c -D $(MODE) --sp-file $${file}; \ -+ spatch drbd/drbd_*.c --macro-file-builtins $(coccilibpath)/standard.h \ -+ --iso-file $(coccilibpath)/standard.iso -D $(MODE) --sp-file $${file}; \ - done - - Makefile: ; + cat $incdir/.compat.patch >> $compat_patch.tmp + fi