diff --git a/[refs] b/[refs] index 6c3a8c82202f..c3611f96178e 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 88f79ec4ae22a82d7b9a0cd4c9f3ee1def2a382c +refs/heads/master: 892fdd1aee35803bfa41ccf4df850ddb70f0811c diff --git a/trunk/drivers/block/drbd/drbd_state.c b/trunk/drivers/block/drbd/drbd_state.c index 60dde030123b..f3e6090d462b 100644 --- a/trunk/drivers/block/drbd/drbd_state.c +++ b/trunk/drivers/block/drbd/drbd_state.c @@ -1187,21 +1187,25 @@ static void after_state_ch(struct drbd_conf *mdev, union drbd_state os, state change. This function might sleep */ if (ns.susp_nod) { + struct drbd_tconn *tconn = mdev->tconn; enum drbd_req_event what = NOTHING; - if (os.conn < C_CONNECTED && conn_lowest_conn(mdev->tconn) >= C_CONNECTED) + spin_lock_irq(&tconn->req_lock); + if (os.conn < C_CONNECTED && conn_lowest_conn(tconn) >= C_CONNECTED) what = RESEND; if ((os.disk == D_ATTACHING || os.disk == D_NEGOTIATING) && - conn_lowest_disk(mdev->tconn) > D_NEGOTIATING) + conn_lowest_disk(tconn) > D_NEGOTIATING) what = RESTART_FROZEN_DISK_IO; - if (what != NOTHING) { - spin_lock_irq(&mdev->tconn->req_lock); - _tl_restart(mdev->tconn, what); - _drbd_set_state(_NS(mdev, susp_nod, 0), CS_VERBOSE, NULL); - spin_unlock_irq(&mdev->tconn->req_lock); + if (tconn->susp_nod && what != NOTHING) { + _tl_restart(tconn, what); + _conn_request_state(tconn, + (union drbd_state) { { .susp_nod = 1 } }, + (union drbd_state) { { .susp_nod = 0 } }, + CS_VERBOSE); } + spin_unlock_irq(&tconn->req_lock); } if (ns.susp_fen) {