Skip to content

Commit

Permalink
drbd: Improve readability of IO resuming after freeze due to no data …
Browse files Browse the repository at this point in the history
…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>
  • Loading branch information
Philipp Reisner committed Nov 9, 2012
1 parent 88f79ec commit 892fdd1
Showing 1 changed file with 11 additions and 7 deletions.
18 changes: 11 additions & 7 deletions drivers/block/drbd/drbd_state.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down

0 comments on commit 892fdd1

Please sign in to comment.