summaryrefslogtreecommitdiff
path: root/drivers/block
diff options
context:
space:
mode:
authorPhilipp Reisner <philipp.reisner@linbit.com>2012-08-27 19:20:12 +0400
committerPhilipp Reisner <philipp.reisner@linbit.com>2012-11-09 17:08:22 +0400
commit892fdd1aee35803bfa41ccf4df850ddb70f0811c (patch)
treeda4150805ff7aa465af7668b138384407b0b09e7 /drivers/block
parent88f79ec4ae22a82d7b9a0cd4c9f3ee1def2a382c (diff)
downloadlinux-892fdd1aee35803bfa41ccf4df850ddb70f0811c.tar.xz
drbd: Improve readability of IO resuming after freeze due to no data access
The previous way of doing the state change was also okay since the state change on the susp flag gets propagated from the mdev to the tconn. Fortunately all this goes away in drbd-9.0 Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com> Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
Diffstat (limited to 'drivers/block')
-rw-r--r--drivers/block/drbd/drbd_state.c18
1 files changed, 11 insertions, 7 deletions
diff --git a/drivers/block/drbd/drbd_state.c b/drivers/block/drbd/drbd_state.c
index 60dde030123b..f3e6090d462b 100644
--- a/drivers/block/drbd/drbd_state.c
+++ b/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) {