]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
drbd: only wakeup if something changed in update_peer_seq
authorLars Ellenberg <lars.ellenberg@linbit.com>
Wed, 23 Feb 2011 15:10:01 +0000 (16:10 +0100)
committerPhilipp Reisner <philipp.reisner@linbit.com>
Fri, 14 Oct 2011 14:48:04 +0000 (16:48 +0200)
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>
drivers/block/drbd/drbd_receiver.c

index e44bf3c25718403eab632a7495bf7fbdfe98a94b..cd78ebfefe52d5cb78c6b55cf9a416588171c6f8 100644 (file)
@@ -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);
        }
 }