Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:hmzhao:branches:openSUSE:Factory
drbd
0004-drbd-fix-exposed_uuid-going-backward.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 0004-drbd-fix-exposed_uuid-going-backward.patch of Package drbd
From 2f464b8e8235efe2c5d972cf8054dcc2010b100e Mon Sep 17 00:00:00 2001 From: Philipp Reisner <philipp.reisner@linbit.com> 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
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor