From 0fa6f10a9a0cc8ca981b7491a4b87cc5fe6dde90 Mon Sep 17 00:00:00 2001 From: Andreas Gruenbacher Date: Wed, 30 Mar 2011 11:38:49 +0200 Subject: [PATCH] --- yaml --- r: 345983 b: refs/heads/master c: 52b061a44021ca11ee2fd238040e91341ff8066d h: refs/heads/master i: 345981: 9831583d57a0696645640e1cd42c76c0edc1b69a 345979: 5d4adc0c255b2ab83293953a51dab14002d9ec78 345975: fb2cc311fa275b5affc58951d75e1223b5afa125 345967: d523e1bcd53870c4dda07991d8d2f9ee20e4b59b 345951: 5c3b7f29f5a2b6dd8745fcfa089539d6dfc6b9ca 345919: 9dc3f127e66572f6d9576ba2c5064d716d7b7d33 345855: 7dcdeb1fef61092eeba92df0338d84f3aabaef16 v: v3 --- [refs] | 2 +- trunk/drivers/block/drbd/drbd_int.h | 2 ++ trunk/drivers/block/drbd/drbd_main.c | 14 ++++++++++++++ trunk/drivers/block/drbd/drbd_receiver.c | 9 +++++---- 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/[refs] b/[refs] index 67312f546998..dd3e9079fc13 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: dba58587506818211b042c7b6a37f73e0feb8862 +refs/heads/master: 52b061a44021ca11ee2fd238040e91341ff8066d diff --git a/trunk/drivers/block/drbd/drbd_int.h b/trunk/drivers/block/drbd/drbd_int.h index 632ca9aecef3..729c96fc0c87 100644 --- a/trunk/drivers/block/drbd/drbd_int.h +++ b/trunk/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/trunk/drivers/block/drbd/drbd_main.c b/trunk/drivers/block/drbd/drbd_main.c index 699ab11256be..606a9ecbe044 100644 --- a/trunk/drivers/block/drbd/drbd_main.c +++ b/trunk/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/trunk/drivers/block/drbd/drbd_receiver.c b/trunk/drivers/block/drbd/drbd_receiver.c index 61104dbb0172..e52a929d9ed3 100644 --- a/trunk/drivers/block/drbd/drbd_receiver.c +++ b/trunk/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; } }