From 52b061a44021ca11ee2fd238040e91341ff8066d Mon Sep 17 00:00:00 2001 From: Andreas Gruenbacher Date: Wed, 30 Mar 2011 11:38:49 +0200 Subject: [PATCH] drbd: Introduce drbd_header_size() Signed-off-by: Philipp Reisner Signed-off-by: Lars Ellenberg --- drivers/block/drbd/drbd_int.h | 2 ++ drivers/block/drbd/drbd_main.c | 14 ++++++++++++++ drivers/block/drbd/drbd_receiver.c | 9 +++++---- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/drivers/block/drbd/drbd_int.h b/drivers/block/drbd/drbd_int.h index 632ca9aecef3..729c96fc0c87 100644 --- a/drivers/block/drbd/drbd_int.h +++ b/drivers/block/drbd/drbd_int.h @@ -315,6 +315,8 @@ struct p_header { u8 payload[0]; }; +extern unsigned int drbd_header_size(struct drbd_tconn *tconn); + /* * short commands, packets without payload, plain p_header: * P_PING diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c index 699ab11256be..606a9ecbe044 100644 --- a/drivers/block/drbd/drbd_main.c +++ b/drivers/block/drbd/drbd_main.c @@ -689,6 +689,20 @@ void drbd_thread_current_set_cpu(struct drbd_thread *thi) } #endif +/** + * drbd_header_size - size of a packet header + * + * The header size is a multiple of 8, so any payload following the header is + * word aligned on 64-bit architectures. (The bitmap send and receive code + * relies on this.) + */ +unsigned int drbd_header_size(struct drbd_tconn *tconn) +{ + BUILD_BUG_ON(sizeof(struct p_header80) != sizeof(struct p_header95)); + BUILD_BUG_ON(!IS_ALIGNED(sizeof(struct p_header80), 8)); + return sizeof(struct p_header80); +} + static void prepare_header80(struct p_header80 *h, enum drbd_packet cmd, int size) { h->magic = cpu_to_be32(DRBD_MAGIC); diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c index 61104dbb0172..e52a929d9ed3 100644 --- a/drivers/block/drbd/drbd_receiver.c +++ b/drivers/block/drbd/drbd_receiver.c @@ -995,7 +995,7 @@ static int drbd_recv_header(struct drbd_tconn *tconn, struct packet_info *pi) struct p_header *h = tconn->data.rbuf; int err; - err = drbd_recv_all_warn(tconn, h, sizeof(*h)); + err = drbd_recv_all_warn(tconn, h, drbd_header_size(tconn)); if (err) return err; @@ -4842,7 +4842,8 @@ int drbd_asender(struct drbd_thread *thi) int rv; void *buf = h; int received = 0; - int expect = sizeof(struct p_header); + unsigned int header_size = drbd_header_size(tconn); + int expect = header_size; int ping_timeout_active = 0; current->policy = SCHED_RR; /* Make this a realtime task! */ @@ -4926,7 +4927,7 @@ int drbd_asender(struct drbd_thread *thi) goto disconnect; } expect = cmd->pkt_size; - if (pi.size != expect - sizeof(struct p_header)) { + if (pi.size != expect - header_size) { conn_err(tconn, "Wrong packet size on meta (c: %d, l: %d)\n", pi.cmd, pi.size); goto reconnect; @@ -4950,7 +4951,7 @@ int drbd_asender(struct drbd_thread *thi) buf = h; received = 0; - expect = sizeof(struct p_header); + expect = header_size; cmd = NULL; } } -- 2.11.0