mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-14 09:09:56 +00:00
drbd: Fixes from the drbd-8.3 branch
* drbd-8.3: drbd: fix spurious meta data IO "error" drbd: Fixed a race condition between detach and start of resync drbd: fix harmless race to not trigger an ASSERT drbd: Derive sync-UUIDs only from the bitmap-uuid if it is non-zero drbd: Fixed current UUID generation (regression introduced recently, after 8.3.11) Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com> Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
This commit is contained in:
parent
376694a054
commit
0cfac5dd90
@ -1087,7 +1087,11 @@ void drbd_gen_and_send_sync_uuid(struct drbd_conf *mdev)
|
||||
|
||||
D_ASSERT(mdev->state.disk == D_UP_TO_DATE);
|
||||
|
||||
uuid = mdev->ldev->md.uuid[UI_BITMAP] + UUID_NEW_BM_OFFSET;
|
||||
uuid = mdev->ldev->md.uuid[UI_BITMAP];
|
||||
if (uuid && uuid != UUID_JUST_CREATED)
|
||||
uuid = uuid + UUID_NEW_BM_OFFSET;
|
||||
else
|
||||
get_random_bytes(&uuid, sizeof(u64));
|
||||
drbd_uuid_set(mdev, UI_BITMAP, uuid);
|
||||
drbd_print_uuids(mdev, "updated sync UUID");
|
||||
drbd_md_sync(mdev);
|
||||
|
@ -1666,7 +1666,9 @@ static int adm_detach(struct drbd_conf *mdev, int force)
|
||||
}
|
||||
|
||||
drbd_suspend_io(mdev); /* so no-one is stuck in drbd_al_begin_io */
|
||||
drbd_md_get_buffer(mdev); /* make sure there is no in-flight meta-data IO */
|
||||
retcode = drbd_request_state(mdev, NS(disk, D_FAILED));
|
||||
drbd_md_put_buffer(mdev);
|
||||
/* D_FAILED will transition to DISKLESS. */
|
||||
ret = wait_event_interruptible(mdev->misc_wait,
|
||||
mdev->state.disk != D_FAILED);
|
||||
|
@ -1231,6 +1231,11 @@ static void after_state_ch(struct drbd_conf *mdev, union drbd_state os,
|
||||
}
|
||||
|
||||
if (ns.pdsk < D_INCONSISTENT && get_ldev(mdev)) {
|
||||
if (os.peer == R_SECONDARY && ns.peer == R_PRIMARY &&
|
||||
mdev->ldev->md.uuid[UI_BITMAP] == 0 && ns.disk >= D_UP_TO_DATE) {
|
||||
drbd_uuid_new_current(mdev);
|
||||
drbd_send_uuids(mdev);
|
||||
}
|
||||
/* D_DISKLESS Peer becomes secondary */
|
||||
if (os.peer == R_PRIMARY && ns.peer == R_SECONDARY)
|
||||
/* We may still be Primary ourselves.
|
||||
|
@ -74,10 +74,21 @@ void drbd_md_io_complete(struct bio *bio, int error)
|
||||
|
||||
md_io->error = error;
|
||||
|
||||
/* We grabbed an extra reference in _drbd_md_sync_page_io() to be able
|
||||
* to timeout on the lower level device, and eventually detach from it.
|
||||
* If this io completion runs after that timeout expired, this
|
||||
* drbd_md_put_buffer() may allow us to finally try and re-attach.
|
||||
* During normal operation, this only puts that extra reference
|
||||
* down to 1 again.
|
||||
* Make sure we first drop the reference, and only then signal
|
||||
* completion, or we may (in drbd_al_read_log()) cycle so fast into the
|
||||
* next drbd_md_sync_page_io(), that we trigger the
|
||||
* ASSERT(atomic_read(&mdev->md_io_in_use) == 1) there.
|
||||
*/
|
||||
drbd_md_put_buffer(mdev);
|
||||
md_io->done = 1;
|
||||
wake_up(&mdev->misc_wait);
|
||||
bio_put(bio);
|
||||
drbd_md_put_buffer(mdev);
|
||||
put_ldev(mdev);
|
||||
}
|
||||
|
||||
@ -1581,12 +1592,13 @@ void drbd_start_resync(struct drbd_conf *mdev, enum drbd_conns side)
|
||||
}
|
||||
clear_bit(B_RS_H_DONE, &mdev->flags);
|
||||
|
||||
write_lock_irq(&global_state_lock);
|
||||
if (!get_ldev_if_state(mdev, D_NEGOTIATING)) {
|
||||
write_unlock_irq(&global_state_lock);
|
||||
mutex_unlock(mdev->state_mutex);
|
||||
return;
|
||||
}
|
||||
|
||||
write_lock_irq(&global_state_lock);
|
||||
ns = drbd_read_state(mdev);
|
||||
|
||||
ns.aftr_isp = !_drbd_may_sync_now(mdev);
|
||||
|
Loading…
x
Reference in New Issue
Block a user