mirror of https://gitee.com/openkylin/linux.git
drbd: abort start of resync early, if it raced with connection breakage
We've seen a spurious full resync, because a connection breakage raced with drbd_start_resync(, C_SYNC_TARGET), and the resulting state change request intended to start the resync ended up looking like a local invalidate. Fix: Double check the state inside the lock, and don't even request that state change, if we had connection or IO problems. Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com> Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
2d56a974f3
commit
a700471bf3
|
@ -1653,7 +1653,9 @@ 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)) {
|
||||
/* Did some connection breakage or IO error race with us? */
|
||||
if (mdev->state.conn < C_CONNECTED
|
||||
|| !get_ldev_if_state(mdev, D_NEGOTIATING)) {
|
||||
write_unlock_irq(&global_state_lock);
|
||||
mutex_unlock(mdev->state_mutex);
|
||||
return;
|
||||
|
|
Loading…
Reference in New Issue