drbd: Sending of delay_probes
authorPhilipp Reisner <philipp.reisner@linbit.com>
Mon, 3 May 2010 13:10:47 +0000 (15:10 +0200)
committerPhilipp Reisner <philipp.reisner@linbit.com>
Mon, 17 May 2010 23:22:46 +0000 (01:22 +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

index fd7615f1e52600327edbdf4783fe75d6891597a1..3e4d8b574fef77747d8b2f31a6f903ba79cb69e1 100644 (file)
@@ -1046,6 +1046,7 @@ struct drbd_conf {
        struct list_head delay_probes; /* protected by peer_seq_lock */
        int data_delay;   /* Delay of packets on the data-sock behind meta-sock */
        atomic_t delay_seq; /* To generate sequence numbers of delay probes */
+       struct timeval dps_time; /* delay-probes-start-time */
 };
 
 static inline struct drbd_conf *minor_to_mdev(unsigned int minor)
index 3d5fe307a19d55b28c280596eaa12eae6464dd73..710bfebb7b63d3c41cdf0abb5e73367ae268f166 100644 (file)
@@ -2188,6 +2188,39 @@ int drbd_send_ov_request(struct drbd_conf *mdev, sector_t sector, int size)
        return ok;
 }
 
+static int drbd_send_delay_probe(struct drbd_conf *mdev, struct drbd_socket *ds)
+{
+       struct p_delay_probe dp;
+       int offset, ok = 0;
+       struct timeval now;
+
+       mutex_lock(&ds->mutex);
+       if (likely(ds->socket)) {
+               do_gettimeofday(&now);
+               offset = now.tv_usec - mdev->dps_time.tv_usec +
+                        (now.tv_sec - mdev->dps_time.tv_sec) * 1000000;
+               dp.seq_num  = cpu_to_be32(atomic_read(&mdev->delay_seq));
+               dp.offset   = cpu_to_be32(offset);
+
+               ok = _drbd_send_cmd(mdev, ds->socket, P_DELAY_PROBE,
+                                   (struct p_header *)&dp, sizeof(dp), 0);
+       }
+       mutex_unlock(&ds->mutex);
+
+       return ok;
+}
+
+static int drbd_send_dalay_probes(struct drbd_conf *mdev)
+{
+       int ok;
+       atomic_inc(&mdev->delay_seq);
+       do_gettimeofday(&mdev->dps_time);
+       ok = drbd_send_delay_probe(mdev, &mdev->meta);
+       ok = ok && drbd_send_delay_probe(mdev, &mdev->data);
+
+       return ok;
+}
+
 /* called on sndtimeo
  * returns FALSE if we should retry,
  * TRUE if we think connection is dead