diff options
-rw-r--r-- | drivers/block/drbd/drbd_int.h | 1 | ||||
-rw-r--r-- | drivers/block/drbd/drbd_receiver.c | 5 | ||||
-rw-r--r-- | drivers/block/drbd/drbd_state.c | 3 |
3 files changed, 9 insertions, 0 deletions
diff --git a/drivers/block/drbd/drbd_int.h b/drivers/block/drbd/drbd_int.h index 8001b7a2063b..e8461f8cb046 100644 --- a/drivers/block/drbd/drbd_int.h +++ b/drivers/block/drbd/drbd_int.h | |||
@@ -811,6 +811,7 @@ enum { | |||
811 | SEND_PING, /* whether asender should send a ping asap */ | 811 | SEND_PING, /* whether asender should send a ping asap */ |
812 | SIGNAL_ASENDER, /* whether asender wants to be interrupted */ | 812 | SIGNAL_ASENDER, /* whether asender wants to be interrupted */ |
813 | GOT_PING_ACK, /* set when we receive a ping_ack packet, ping_wait gets woken */ | 813 | GOT_PING_ACK, /* set when we receive a ping_ack packet, ping_wait gets woken */ |
814 | CONN_WD_ST_CHG_REQ, /* A cluster wide state change on the connection is active */ | ||
814 | CONN_WD_ST_CHG_OKAY, | 815 | CONN_WD_ST_CHG_OKAY, |
815 | CONN_WD_ST_CHG_FAIL, | 816 | CONN_WD_ST_CHG_FAIL, |
816 | CONN_DRY_RUN, /* Expect disconnect after resync handshake. */ | 817 | CONN_DRY_RUN, /* Expect disconnect after resync handshake. */ |
diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c index c8d3f38d539f..9b83f88c0e82 100644 --- a/drivers/block/drbd/drbd_receiver.c +++ b/drivers/block/drbd/drbd_receiver.c | |||
@@ -4827,6 +4827,11 @@ static int got_RqSReply(struct drbd_tconn *tconn, struct packet_info *pi) | |||
4827 | if (!mdev) | 4827 | if (!mdev) |
4828 | return -EIO; | 4828 | return -EIO; |
4829 | 4829 | ||
4830 | if (test_bit(CONN_WD_ST_CHG_REQ, &tconn->flags)) { | ||
4831 | D_ASSERT(tconn->agreed_pro_version < 100); | ||
4832 | return got_conn_RqSReply(tconn, pi); | ||
4833 | } | ||
4834 | |||
4830 | if (retcode >= SS_SUCCESS) { | 4835 | if (retcode >= SS_SUCCESS) { |
4831 | set_bit(CL_ST_CHG_SUCCESS, &mdev->flags); | 4836 | set_bit(CL_ST_CHG_SUCCESS, &mdev->flags); |
4832 | } else { | 4837 | } else { |
diff --git a/drivers/block/drbd/drbd_state.c b/drivers/block/drbd/drbd_state.c index 70aa9603e368..05ed131a5a87 100644 --- a/drivers/block/drbd/drbd_state.c +++ b/drivers/block/drbd/drbd_state.c | |||
@@ -1671,7 +1671,9 @@ conn_cl_wide(struct drbd_tconn *tconn, union drbd_state mask, union drbd_state v | |||
1671 | spin_unlock_irq(&tconn->req_lock); | 1671 | spin_unlock_irq(&tconn->req_lock); |
1672 | mutex_lock(&tconn->cstate_mutex); | 1672 | mutex_lock(&tconn->cstate_mutex); |
1673 | 1673 | ||
1674 | set_bit(CONN_WD_ST_CHG_REQ, &tconn->flags); | ||
1674 | if (conn_send_state_req(tconn, mask, val)) { | 1675 | if (conn_send_state_req(tconn, mask, val)) { |
1676 | clear_bit(CONN_WD_ST_CHG_REQ, &tconn->flags); | ||
1675 | rv = SS_CW_FAILED_BY_PEER; | 1677 | rv = SS_CW_FAILED_BY_PEER; |
1676 | /* if (f & CS_VERBOSE) | 1678 | /* if (f & CS_VERBOSE) |
1677 | print_st_err(mdev, os, ns, rv); */ | 1679 | print_st_err(mdev, os, ns, rv); */ |
@@ -1679,6 +1681,7 @@ conn_cl_wide(struct drbd_tconn *tconn, union drbd_state mask, union drbd_state v | |||
1679 | } | 1681 | } |
1680 | 1682 | ||
1681 | wait_event(tconn->ping_wait, (rv = _conn_rq_cond(tconn, mask, val))); | 1683 | wait_event(tconn->ping_wait, (rv = _conn_rq_cond(tconn, mask, val))); |
1684 | clear_bit(CONN_WD_ST_CHG_REQ, &tconn->flags); | ||
1682 | 1685 | ||
1683 | abort: | 1686 | abort: |
1684 | mutex_unlock(&tconn->cstate_mutex); | 1687 | mutex_unlock(&tconn->cstate_mutex); |