Hello community, here is the log from the commit of package drbd for openSUSE:Factory checked in at 2019-03-13 09:16:36 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/drbd (Old) and /work/SRC/openSUSE:Factory/.drbd.new.28833 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "drbd" Wed Mar 13 09:16:36 2019 rev:74 rq:684507 version:9.0.16+git.ab9777df Changes: -------- --- /work/SRC/openSUSE:Factory/drbd/drbd.changes 2018-12-11 15:48:04.170190724 +0100 +++ /work/SRC/openSUSE:Factory/.drbd.new.28833/drbd.changes 2019-03-13 09:16:42.115377618 +0100 @@ -1,0 +2,6 @@ +Thu Jan 10 02:16:03 UTC 2019 - [email protected] + +- bsc#1118732, split brain handles malfunction when 2 primaries. +- Add patch rely-on-sb-handlers.patch + +------------------------------------------------------------------- New: ---- rely-on-sb-handlers.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ drbd.spec ++++++ --- /var/tmp/diff_new_pack.UjDTJa/_old 2019-03-13 09:16:43.031377523 +0100 +++ /var/tmp/diff_new_pack.UjDTJa/_new 2019-03-13 09:16:43.035377523 +0100 @@ -37,6 +37,7 @@ Source3: drbd_git_revision Patch1: fix-resync-finished-with-syncs-have-bits-set.patch Patch2: compat_no_bioset_initialized.patch +Patch3: rely-on-sb-handlers.patch BuildRequires: kernel-source BuildRequires: kernel-syms BuildRequires: libelf-devel @@ -71,6 +72,7 @@ %setup -q -n drbd-%{version} %patch1 -p1 %patch2 -p1 +%patch3 -p1 mkdir source cp -a drbd/. source/. || : ++++++ rely-on-sb-handlers.patch ++++++ diff -Naur drbd-9.0.15+git.c46d2790.orig/drbd/drbd_state.c drbd-9.0.15+git.c46d2790/drbd/drbd_state.c --- drbd-9.0.15+git.c46d2790.orig/drbd/drbd_state.c 2019-01-10 13:10:28.152414247 +0800 +++ drbd-9.0.15+git.c46d2790/drbd/drbd_state.c 2019-01-10 13:10:38.140407675 +0800 @@ -251,6 +251,27 @@ return rv; } +static bool is_sb_handlers_configured(struct drbd_connection *connection) +{ + bool configured = false; + + enum drbd_after_sb_p after_sb_0p = -1; + enum drbd_after_sb_p after_sb_1p = -1; + enum drbd_after_sb_p after_sb_2p = -1; + + after_sb_0p = rcu_dereference(connection->transport.net_conf)->after_sb_0p; + after_sb_1p = rcu_dereference(connection->transport.net_conf)->after_sb_1p; + after_sb_2p = rcu_dereference(connection->transport.net_conf)->after_sb_2p; + + if (after_sb_2p != 0 || after_sb_0p != 0 || after_sb_1p != 0) { + drbd_info(connection, "Split-brain handler configured, rely on it.\n"); + configured = true; + } + + return configured; +} + + bool resource_is_suspended(struct drbd_resource *resource, enum which_state which) { bool rv = resource->susp_user[which] || resource->susp_nod[which]; @@ -1465,7 +1486,8 @@ if (!nc || nc->two_primaries) continue; if (connection->peer_role[NEW] == R_PRIMARY) - return SS_TWO_PRIMARIES; + if (!is_sb_handlers_configured(connection)) + return SS_TWO_PRIMARIES; } } @@ -1500,10 +1522,10 @@ nc = rcu_dereference(connection->transport.net_conf); two_primaries = nc ? nc->two_primaries : false; if (peer_role[NEW] == R_PRIMARY && peer_role[OLD] != R_PRIMARY && !two_primaries) { - if (role[NOW] == R_PRIMARY) + if (role[NOW] == R_PRIMARY && !is_sb_handlers_configured(connection)) return SS_TWO_PRIMARIES; idr_for_each_entry(&resource->devices, device, vnr) { - if (device->open_ro_cnt) + if (device->open_ro_cnt && !is_sb_handlers_configured(connection)) return SS_PRIMARY_READER; } } @@ -3785,8 +3807,10 @@ mask = NODE_MASK(connection->peer_node_id); if ((resource->twopc_reply.primary_nodes & mask) && !(connection->transport.net_conf->two_primaries)) { - rv = SS_TWO_PRIMARIES; - break; + if (!is_sb_handlers_configured(connection)){ + rv = SS_TWO_PRIMARIES; + break; + } } } rcu_read_unlock(); @@ -3829,10 +3853,13 @@ rcu_read_lock(); nc = rcu_dereference(connection->transport.net_conf); two_primaries = nc ? nc->two_primaries : false; - rcu_read_unlock(); - if (!two_primaries) + if (!two_primaries && !is_sb_handlers_configured(connection)) { + rcu_read_unlock(); return SS_TWO_PRIMARIES; + } + + rcu_read_unlock(); } return SS_SUCCESS; @@ -3859,8 +3886,10 @@ nc = rcu_dereference(connection->transport.net_conf); if (!nc->two_primaries && NODE_MASK(connection->peer_node_id) & reply->primary_nodes) { - rv = SS_PRIMARY_READER; - break; + if (!is_sb_handlers_configured(connection)){ + rv = SS_PRIMARY_READER; + break; + } } } rcu_read_unlock();
