File disconnect-invalid-two-primaries.patch of Package drbd.24680

diff -Naur drbd-9.0.22~1+git.fe2b5983.orig/drbd/drbd_receiver.c drbd-9.0.22~1+git.fe2b5983/drbd/drbd_receiver.c
--- drbd-9.0.22~1+git.fe2b5983.orig/drbd/drbd_receiver.c	2021-04-07 11:02:28.654652864 +0800
+++ drbd-9.0.22~1+git.fe2b5983/drbd/drbd_receiver.c	2021-04-07 11:05:17.984003440 +0800
@@ -4202,10 +4202,11 @@
 	enum drbd_disk_state disk_state;
 	struct net_conf *nc;
 	enum sync_strategy strategy;
-	int rule_nr, rr_conflict, always_asbp, peer_node_id = 0, r;
+	int rule_nr, rr_conflict, always_asbp, peer_node_id = 0, r, pcount;
 	enum drbd_role peer_role = peer_state.role;
 	enum drbd_disk_state peer_disk_state = peer_state.disk;
 	int required_protocol;
+	bool two_primaries;
 
 	strategy = drbd_handshake(peer_device, &rule_nr, &peer_node_id, true);
 
@@ -4240,11 +4241,18 @@
 	nc = rcu_dereference(connection->transport.net_conf);
 	always_asbp = nc->always_asbp;
 	rr_conflict = nc->rr_conflict;
+	two_primaries = nc ? nc->two_primaries : false;
 	rcu_read_unlock();
 
+	pcount = (device->resource->role[NOW] == R_PRIMARY)
+		   + (peer_role == R_PRIMARY);
+
+	if (strategy == NO_SYNC && pcount == 2 && !two_primaries) {
+		drbd_alert(device, "Dual primaries detected with unified UUID but not allowed, drop connection!\n");
+		return -1;
+	}
+
 	if (strategy == SPLIT_BRAIN_AUTO_RECOVER || (strategy == SPLIT_BRAIN_DISCONNECT && always_asbp)) {
-		int pcount = (device->resource->role[NOW] == R_PRIMARY)
-			   + (peer_role == R_PRIMARY);
 		int forced = (strategy == SPLIT_BRAIN_DISCONNECT);
 
 		if (device->resource->res_opts.quorum != QOU_OFF &&
openSUSE Build Service is sponsored by