mirror of
https://github.com/torvalds/linux.git
synced 2026-11-06 21:58:01 +01:00
drbd: take req_lock to skip the initial sync as peer
_drbd_set_state() must be called with req_lock held. drbd_adm_new_c_uuid()
does, receive_uuids() on the peer doesn't, so a concurrent state change
gets lost: the device is Secondary again, or its failed disk UpToDate,
while the work for the lost change is already queued.
Fixes: b411b3637f ("The DRBD driver")
Cc: Philipp Reisner <philipp.reisner@linbit.com>
Cc: Lars Ellenberg <lars.ellenberg@linbit.com>
Cc: "Christoph Böhmwalder" <christoph.boehmwalder@linbit.com>
Signed-off-by: Josef Bacik <josef@toxicpanda.com>
Link: https://patch.msgid.link/20261028164415.1262013-15-axboe@kernel.dk
Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
a439d3fe3e
commit
bf7fff620c
|
|
@ -4096,8 +4096,10 @@ static int receive_uuids(struct drbd_connection *connection, struct packet_info
|
|||
BM_LOCKED_TEST_ALLOWED, NULL);
|
||||
_drbd_uuid_set(device, UI_CURRENT, p_uuid[UI_CURRENT]);
|
||||
_drbd_uuid_set(device, UI_BITMAP, 0);
|
||||
spin_lock_irq(&device->resource->req_lock);
|
||||
_drbd_set_state(_NS2(device, disk, D_UP_TO_DATE, pdsk, D_UP_TO_DATE),
|
||||
CS_VERBOSE, NULL);
|
||||
spin_unlock_irq(&device->resource->req_lock);
|
||||
drbd_md_sync(device);
|
||||
updated_uuids = 1;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user