]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/commitdiff
drbd: Converted drbd_send_ping() and related functions from mdev to tconn
authorPhilipp Reisner <philipp.reisner@linbit.com>
Wed, 9 Feb 2011 13:10:32 +0000 (14:10 +0100)
committerPhilipp Reisner <philipp.reisner@linbit.com>
Wed, 28 Sep 2011 08:33:16 +0000 (10:33 +0200)
Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
drivers/block/drbd/drbd_int.h
drivers/block/drbd/drbd_main.c
drivers/block/drbd/drbd_receiver.c
drivers/block/drbd/drbd_state.c
drivers/block/drbd/drbd_worker.c

index 8f9cc9d1bf932461171459e9338bd7cc938db82c..e2b59f58a0aa20289a4acdc6f426bfb54b6bad48 100644 (file)
@@ -790,7 +790,6 @@ enum {
        RESIZE_PENDING,         /* Size change detected locally, waiting for the response from
                                 * the peer, if it changed there as well. */
        CONN_DRY_RUN,           /* Expect disconnect after resync handshake. */
-       GOT_PING_ACK,           /* set when we receive a ping_ack packet, misc wait gets woken */
        NEW_CUR_UUID,           /* Create new current UUID when thawing IO */
        AL_SUSPENDED,           /* Activity logging is currently suspended. */
        AHEAD_TO_SYNC_SOURCE,   /* Ahead -> SyncSource queued */
@@ -913,6 +912,7 @@ enum {
        DISCARD_CONCURRENT,     /* Set on one node, cleared on the peer! */
        SEND_PING,              /* whether asender should send a ping asap */
        SIGNAL_ASENDER,         /* whether asender wants to be interrupted */
+       GOT_PING_ACK,           /* set when we receive a ping_ack packet, ping_wait gets woken */
 };
 
 struct drbd_tconn {                    /* is a resource from the config file */
@@ -925,6 +925,7 @@ struct drbd_tconn {                 /* is a resource from the config file */
        struct net_conf *net_conf;      /* protected by get_net_conf() and put_net_conf() */
        atomic_t net_cnt;               /* Users of net_conf */
        wait_queue_head_t net_cnt_wait;
+       wait_queue_head_t ping_wait;            /* Woken upon reception of a ping, and a state change */
 
        struct drbd_socket data;        /* data/barrier/cstate/parameter packets */
        struct drbd_socket meta;        /* ping/ack (metadata) packets */
@@ -1180,12 +1181,12 @@ extern int drbd_send_state(struct drbd_conf *mdev);
 extern int _conn_send_cmd(struct drbd_tconn *tconn, int vnr, struct socket *sock,
                          enum drbd_packet cmd, struct p_header *h, size_t size,
                          unsigned msg_flags);
+extern int conn_send_cmd(struct drbd_tconn *tconn, int vnr, int use_data_socket,
+                        enum drbd_packet cmd, struct p_header *h, size_t size);
 extern int conn_send_cmd2(struct drbd_tconn *tconn, enum drbd_packet cmd,
                          char *data, size_t size);
 #define USE_DATA_SOCKET 1
 #define USE_META_SOCKET 0
-extern int drbd_send_cmd(struct drbd_conf *mdev, int use_data_socket,
-                        enum drbd_packet cmd, struct p_header *h, size_t size);
 extern int drbd_send_sync_param(struct drbd_conf *mdev, struct syncer_conf *sc);
 extern int drbd_send_b_ack(struct drbd_conf *mdev, u32 barrier_nr,
                        u32 set_size);
@@ -1886,6 +1887,12 @@ static inline int _drbd_send_cmd(struct drbd_conf *mdev, struct socket *sock,
        return _conn_send_cmd(mdev->tconn, mdev->vnr, sock, cmd, h, size, msg_flags);
 }
 
+static inline int drbd_send_cmd(struct drbd_conf *mdev, int use_data_socket,
+                               enum drbd_packet cmd, struct p_header *h, size_t size)
+{
+       return conn_send_cmd(mdev->tconn, mdev->vnr, use_data_socket, cmd, h, size);
+}
+
 static inline int drbd_send_short_cmd(struct drbd_conf *mdev,
                                      enum drbd_packet cmd)
 {
@@ -1893,16 +1900,16 @@ static inline int drbd_send_short_cmd(struct drbd_conf *mdev,
        return drbd_send_cmd(mdev, USE_DATA_SOCKET, cmd, &h, sizeof(h));
 }
 
-static inline int drbd_send_ping(struct drbd_conf *mdev)
+static inline int drbd_send_ping(struct drbd_tconn *tconn)
 {
        struct p_header h;
-       return drbd_send_cmd(mdev, USE_META_SOCKET, P_PING, &h, sizeof(h));
+       return conn_send_cmd(tconn, 0, USE_META_SOCKET, P_PING, &h, sizeof(h));
 }
 
-static inline int drbd_send_ping_ack(struct drbd_conf *mdev)
+static inline int drbd_send_ping_ack(struct drbd_tconn *tconn)
 {
        struct p_header h;
-       return drbd_send_cmd(mdev, USE_META_SOCKET, P_PING_ACK, &h, sizeof(h));
+       return conn_send_cmd(tconn, 0, USE_META_SOCKET, P_PING_ACK, &h, sizeof(h));
 }
 
 static inline void drbd_thread_stop(struct drbd_thread *thi)
index d418bca2bb147abaf6608cdfe6b7c8aca91228f6..b43ad87a536a49266fc9d61d2867c00cb36dca19 100644 (file)
@@ -707,29 +707,29 @@ int _conn_send_cmd(struct drbd_tconn *tconn, int vnr, struct socket *sock,
 /* don't pass the socket. we may only look at it
  * when we hold the appropriate socket mutex.
  */
-int drbd_send_cmd(struct drbd_conf *mdev, int use_data_socket,
+int conn_send_cmd(struct drbd_tconn *tconn, int vnr, int use_data_socket,
                  enum drbd_packet cmd, struct p_header *h, size_t size)
 {
        int ok = 0;
        struct socket *sock;
 
        if (use_data_socket) {
-               mutex_lock(&mdev->tconn->data.mutex);
-               sock = mdev->tconn->data.socket;
+               mutex_lock(&tconn->data.mutex);
+               sock = tconn->data.socket;
        } else {
-               mutex_lock(&mdev->tconn->meta.mutex);
-               sock = mdev->tconn->meta.socket;
+               mutex_lock(&tconn->meta.mutex);
+               sock = tconn->meta.socket;
        }
 
        /* drbd_disconnect() could have called drbd_free_sock()
         * while we were waiting in down()... */
        if (likely(sock != NULL))
-               ok = _drbd_send_cmd(mdev, sock, cmd, h, size, 0);
+               ok = _conn_send_cmd(tconn, vnr, sock, cmd, h, size, 0);
 
        if (use_data_socket)
-               mutex_unlock(&mdev->tconn->data.mutex);
+               mutex_unlock(&tconn->data.mutex);
        else
-               mutex_unlock(&mdev->tconn->meta.mutex);
+               mutex_unlock(&tconn->meta.mutex);
        return ok;
 }
 
@@ -2191,6 +2191,7 @@ struct drbd_tconn *drbd_new_tconn(char *name)
        spin_lock_init(&tconn->req_lock);
        atomic_set(&tconn->net_cnt, 0);
        init_waitqueue_head(&tconn->net_cnt_wait);
+       init_waitqueue_head(&tconn->ping_wait);
        idr_init(&tconn->volumes);
 
        drbd_init_workqueue(&tconn->data.work);
index 02fa1b25dce58aa33094f9492ae787afb2bc9757..2b69a15a55dd14c960106e6a20d8af9238065844 100644 (file)
@@ -4279,16 +4279,17 @@ static int got_RqSReply(struct drbd_conf *mdev, enum drbd_packet cmd)
 
 static int got_Ping(struct drbd_conf *mdev, enum drbd_packet cmd)
 {
-       return drbd_send_ping_ack(mdev);
+       return drbd_send_ping_ack(mdev->tconn);
 
 }
 
 static int got_PingAck(struct drbd_conf *mdev, enum drbd_packet cmd)
 {
+       struct drbd_tconn *tconn = mdev->tconn;
        /* restore idle timeout */
-       mdev->tconn->meta.socket->sk->sk_rcvtimeo = mdev->tconn->net_conf->ping_int*HZ;
-       if (!test_and_set_bit(GOT_PING_ACK, &mdev->flags))
-               wake_up(&mdev->misc_wait);
+       tconn->meta.socket->sk->sk_rcvtimeo = tconn->net_conf->ping_int*HZ;
+       if (!test_and_set_bit(GOT_PING_ACK, &tconn->flags))
+               wake_up(&tconn->ping_wait);
 
        return true;
 }
@@ -4610,7 +4611,7 @@ int drbd_asender(struct drbd_thread *thi)
        while (get_t_state(thi) == RUNNING) {
                drbd_thread_current_set_cpu(thi);
                if (test_and_clear_bit(SEND_PING, &tconn->flags)) {
-                       if (!drbd_send_ping(tconn->volume0)) {
+                       if (!drbd_send_ping(tconn)) {
                                conn_err(tconn, "drbd_send_ping has failed\n");
                                goto reconnect;
                        }
index 30a3a1de07cb7c6435123dc6b3704a61fcc8f931..d5777159a2b162dbe656247ea6d4dfe756091a4c 100644 (file)
@@ -737,6 +737,7 @@ __drbd_set_state(struct drbd_conf *mdev, union drbd_state ns,
 
        wake_up(&mdev->misc_wait);
        wake_up(&mdev->state_wait);
+       wake_up(&mdev->tconn->ping_wait);
 
        /* aborted verify run. log the last position */
        if ((os.conn == C_VERIFY_S || os.conn == C_VERIFY_T) &&
index 418f44ad9a862d849455ee2c12eb8310367c90d8..8539df25bc22851dc03994e5a03a6f33d48082f9 100644 (file)
@@ -730,10 +730,12 @@ static int w_resync_finished(struct drbd_work *w, int cancel)
 
 static void ping_peer(struct drbd_conf *mdev)
 {
-       clear_bit(GOT_PING_ACK, &mdev->flags);
-       request_ping(mdev->tconn);
-       wait_event(mdev->misc_wait,
-                  test_bit(GOT_PING_ACK, &mdev->flags) || mdev->state.conn < C_CONNECTED);
+       struct drbd_tconn *tconn = mdev->tconn;
+
+       clear_bit(GOT_PING_ACK, &tconn->flags);
+       request_ping(tconn);
+       wait_event(tconn->ping_wait,
+                  test_bit(GOT_PING_ACK, &tconn->flags) || mdev->state.conn < C_CONNECTED);
 }
 
 int drbd_resync_finished(struct drbd_conf *mdev)