Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit aaae506d authored by Philipp Reisner's avatar Philipp Reisner
Browse files

drbd: Fixed a race condition between detach and start of resync



drbd_state_lock() is only there to serialize cluster wide state
changes. Testing the local disk state needs to happen while
holding the global_state_lock.

Otherwise you might see something like this (Oct 6 on kugel)
14:20:24 drbd0: conn( WFSyncUUID -> Connected ) disk( Inconsistent -> Failed )
14:20:24 drbd0: helper command: /sbin/drbdadm before-resync-target minor-0 exit code 0 (0x0)
14:20:24 drbd0: conn( Connected -> SyncTarget ) disk( Failed -> Inconsistent )

Signed-off-by: default avatarPhilipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: default avatarLars Ellenberg <lars.ellenberg@linbit.com>
parent 6a9a92f4
Loading
Loading
Loading
Loading
+3 −3
Original line number Original line Diff line number Diff line
@@ -1537,14 +1537,14 @@ void drbd_start_resync(struct drbd_conf *mdev, enum drbd_conns side)
	}
	}


	drbd_state_lock(mdev);
	drbd_state_lock(mdev);

	write_lock_irq(&global_state_lock);
	if (!get_ldev_if_state(mdev, D_NEGOTIATING)) {
	if (!get_ldev_if_state(mdev, D_NEGOTIATING)) {
		write_unlock_irq(&global_state_lock);
		drbd_state_unlock(mdev);
		drbd_state_unlock(mdev);
		return;
		return;
	}
	}


	write_lock_irq(&global_state_lock);
	ns.i = mdev->state.i;
	ns = mdev->state;


	ns.aftr_isp = !_drbd_may_sync_now(mdev);
	ns.aftr_isp = !_drbd_may_sync_now(mdev);