drbd: Fix a potential issue with the DISCARD_CONCURRENT flag
authorPhilipp Reisner <philipp.reisner@linbit.com>
Fri, 3 Aug 2012 13:14:04 +0000 (15:14 +0200)
committerJens Axboe <axboe@kernel.dk>
Tue, 30 Oct 2012 07:39:01 +0000 (08:39 +0100)
The DISCARD_CONCURRENT flag should be set on one node and cleared on the
other node.
As the code was before it was theoretical possible that a node accepts the
meta socket, but has to close it later on, and keeps the DISCARD_CONCURRENT
flag.
Correct this by moving the clear_bit(DISCARD_CONCURRENT) where the packet
gets sent.

Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/block/drbd/drbd_receiver.c

index 280735d..55c359a 100644 (file)
@@ -763,8 +763,6 @@ static int drbd_connect(struct drbd_conf *mdev)
        if (drbd_request_state(mdev, NS(conn, C_WF_CONNECTION)) < SS_SUCCESS)
                return -2;
 
-       clear_bit(DISCARD_CONCURRENT, &mdev->flags);
-
        sock  = NULL;
        msock = NULL;
 
@@ -784,6 +782,7 @@ static int drbd_connect(struct drbd_conf *mdev)
                                sock = s;
                                s = NULL;
                        } else if (!msock) {
+                               clear_bit(DISCARD_CONCURRENT, &mdev->flags);
                                drbd_send_fp(mdev, s, P_HAND_SHAKE_M);
                                msock = s;
                                s = NULL;