drbd: Fix a potential issue with the DISCARD_CONCURRENT flag
authorLars Ellenberg <lars.ellenberg@linbit.com>
Fri, 3 Aug 2012 23:07:55 +0000 (01:07 +0200)
committerPhilipp Reisner <philipp.reisner@linbit.com>
Fri, 9 Nov 2012 13:05:47 +0000 (14:05 +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>
drivers/block/drbd/drbd_receiver.c

index 26c30fd..d507700 100644 (file)
@@ -901,8 +901,6 @@ static int conn_connect(struct drbd_tconn *tconn)
        msock.rbuf = tconn->meta.rbuf;
        msock.socket = NULL;
 
-       clear_bit(DISCARD_CONCURRENT, &tconn->flags);
-
        /* Assume that the peer only understands protocol 80 until we know better.  */
        tconn->agreed_pro_version = 80;
 
@@ -918,6 +916,7 @@ static int conn_connect(struct drbd_tconn *tconn)
                                sock.socket = s;
                                send_first_packet(tconn, &sock, P_INITIAL_DATA);
                        } else if (!msock.socket) {
+                               clear_bit(DISCARD_CONCURRENT, &tconn->flags);
                                msock.socket = s;
                                send_first_packet(tconn, &msock, P_INITIAL_META);
                        } else {