diff options
author | Lars Ellenberg | 2011-02-23 16:10:01 +0100 |
---|---|---|
committer | Philipp Reisner | 2011-10-14 16:48:04 +0200 |
commit | 3c13b680ce210313c6f7ad163435b62979958c09 (patch) | |
tree | 16b2cf96f885d1b478980afd4544fabf60323d28 /drivers/block/drbd/drbd_receiver.c | |
parent | drbd: default to detach on-io-error (diff) | |
download | kernel-qcow2-linux-3c13b680ce210313c6f7ad163435b62979958c09.tar.gz kernel-qcow2-linux-3c13b680ce210313c6f7ad163435b62979958c09.tar.xz kernel-qcow2-linux-3c13b680ce210313c6f7ad163435b62979958c09.zip |
drbd: only wakeup if something changed in update_peer_seq
This commit got it wrong:
drbd: Make the peer_seq updating code more obvious
Make it more clear that update_peer_seq() is supposed to wake up the
seq_wait queue whenever the sequence number changes.
We don't need to wake up everytime we receive a sequence number
that is _different_ from our currently stored "newest" sequence number,
but only if we receive a sequence number _newer_ than what we already
have, when we actually change mdev->peer_seq.
Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
Diffstat (limited to 'drivers/block/drbd/drbd_receiver.c')
-rw-r--r-- | drivers/block/drbd/drbd_receiver.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c index e44bf3c25718..cd78ebfefe52 100644 --- a/drivers/block/drbd/drbd_receiver.c +++ b/drivers/block/drbd/drbd_receiver.c @@ -1734,14 +1734,15 @@ static bool need_peer_seq(struct drbd_conf *mdev) static void update_peer_seq(struct drbd_conf *mdev, unsigned int peer_seq) { - unsigned int old_peer_seq; + unsigned int newest_peer_seq; if (need_peer_seq(mdev)) { spin_lock(&mdev->peer_seq_lock); - old_peer_seq = mdev->peer_seq; - mdev->peer_seq = seq_max(mdev->peer_seq, peer_seq); + newest_peer_seq = seq_max(mdev->peer_seq, peer_seq); + mdev->peer_seq = newest_peer_seq; spin_unlock(&mdev->peer_seq_lock); - if (old_peer_seq != peer_seq) + /* wake up only if we actually changed mdev->peer_seq */ + if (peer_seq == newest_peer_seq) wake_up(&mdev->seq_wait); } } |