diff options
author | Andreas Gruenbacher <agruen@linbit.com> | 2011-03-30 06:54:42 -0400 |
---|---|---|
committer | Philipp Reisner <philipp.reisner@linbit.com> | 2012-11-08 10:45:09 -0500 |
commit | e658983af6e62304be785cd6b0ae756723057395 (patch) | |
tree | 6dd2e2c85c704fb353d02feeb25cfc44613405e1 /drivers/block/drbd/drbd_main.c | |
parent | 50d0b1ad78b99aa776c3ddf9b1d45163fff435b9 (diff) |
drbd: Remove headers from on-the-wire data structures (struct p_*)
Prepare the introduction of the protocol 100 headers. The actual protocol
header is removed for the packet declarations. I.e. allow us to use the
packets with different headers.
Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
Diffstat (limited to 'drivers/block/drbd/drbd_main.c')
-rw-r--r-- | drivers/block/drbd/drbd_main.c | 45 |
1 files changed, 22 insertions, 23 deletions
diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c index 3ecbd4908cdc..b9dcc50135c4 100644 --- a/drivers/block/drbd/drbd_main.c +++ b/drivers/block/drbd/drbd_main.c | |||
@@ -703,27 +703,29 @@ unsigned int drbd_header_size(struct drbd_tconn *tconn) | |||
703 | return sizeof(struct p_header80); | 703 | return sizeof(struct p_header80); |
704 | } | 704 | } |
705 | 705 | ||
706 | static void prepare_header80(struct p_header80 *h, enum drbd_packet cmd, int size) | 706 | static unsigned int prepare_header80(struct p_header80 *h, enum drbd_packet cmd, int size) |
707 | { | 707 | { |
708 | h->magic = cpu_to_be32(DRBD_MAGIC); | 708 | h->magic = cpu_to_be32(DRBD_MAGIC); |
709 | h->command = cpu_to_be16(cmd); | 709 | h->command = cpu_to_be16(cmd); |
710 | h->length = cpu_to_be16(size); | 710 | h->length = cpu_to_be16(size); |
711 | return sizeof(struct p_header80); | ||
711 | } | 712 | } |
712 | 713 | ||
713 | static void prepare_header95(struct p_header95 *h, enum drbd_packet cmd, int size) | 714 | static unsigned int prepare_header95(struct p_header95 *h, enum drbd_packet cmd, int size) |
714 | { | 715 | { |
715 | h->magic = cpu_to_be16(DRBD_MAGIC_BIG); | 716 | h->magic = cpu_to_be16(DRBD_MAGIC_BIG); |
716 | h->command = cpu_to_be16(cmd); | 717 | h->command = cpu_to_be16(cmd); |
717 | h->length = cpu_to_be32(size); | 718 | h->length = cpu_to_be32(size); |
719 | return sizeof(struct p_header95); | ||
718 | } | 720 | } |
719 | 721 | ||
720 | static void prepare_header(struct drbd_tconn *tconn, int vnr, struct p_header *h, | 722 | static unsigned int prepare_header(struct drbd_tconn *tconn, int vnr, void *buffer, |
721 | enum drbd_packet cmd, int size) | 723 | enum drbd_packet cmd, int size) |
722 | { | 724 | { |
723 | if (tconn->agreed_pro_version >= 95) | 725 | if (tconn->agreed_pro_version >= 95) |
724 | prepare_header95(&h->h95, cmd, size); | 726 | return prepare_header95(buffer, cmd, size); |
725 | else | 727 | else |
726 | prepare_header80(&h->h80, cmd, size); | 728 | return prepare_header80(buffer, cmd, size); |
727 | } | 729 | } |
728 | 730 | ||
729 | void *conn_prepare_command(struct drbd_tconn *tconn, struct drbd_socket *sock) | 731 | void *conn_prepare_command(struct drbd_tconn *tconn, struct drbd_socket *sock) |
@@ -733,7 +735,7 @@ void *conn_prepare_command(struct drbd_tconn *tconn, struct drbd_socket *sock) | |||
733 | mutex_unlock(&sock->mutex); | 735 | mutex_unlock(&sock->mutex); |
734 | return NULL; | 736 | return NULL; |
735 | } | 737 | } |
736 | return sock->sbuf; | 738 | return sock->sbuf + drbd_header_size(tconn); |
737 | } | 739 | } |
738 | 740 | ||
739 | void *drbd_prepare_command(struct drbd_conf *mdev, struct drbd_socket *sock) | 741 | void *drbd_prepare_command(struct drbd_conf *mdev, struct drbd_socket *sock) |
@@ -758,8 +760,8 @@ static int __send_command(struct drbd_tconn *tconn, int vnr, | |||
758 | */ | 760 | */ |
759 | msg_flags = data ? MSG_MORE : 0; | 761 | msg_flags = data ? MSG_MORE : 0; |
760 | 762 | ||
761 | prepare_header(tconn, vnr, sock->sbuf, cmd, | 763 | header_size += prepare_header(tconn, vnr, sock->sbuf, cmd, |
762 | header_size - sizeof(struct p_header) + size); | 764 | header_size + size); |
763 | err = drbd_send_all(tconn, sock->socket, sock->sbuf, header_size, | 765 | err = drbd_send_all(tconn, sock->socket, sock->sbuf, header_size, |
764 | msg_flags); | 766 | msg_flags); |
765 | if (data && !err) | 767 | if (data && !err) |
@@ -797,7 +799,7 @@ int drbd_send_ping(struct drbd_tconn *tconn) | |||
797 | sock = &tconn->meta; | 799 | sock = &tconn->meta; |
798 | if (!conn_prepare_command(tconn, sock)) | 800 | if (!conn_prepare_command(tconn, sock)) |
799 | return -EIO; | 801 | return -EIO; |
800 | return conn_send_command(tconn, sock, P_PING, sizeof(struct p_header), NULL, 0); | 802 | return conn_send_command(tconn, sock, P_PING, 0, NULL, 0); |
801 | } | 803 | } |
802 | 804 | ||
803 | int drbd_send_ping_ack(struct drbd_tconn *tconn) | 805 | int drbd_send_ping_ack(struct drbd_tconn *tconn) |
@@ -807,7 +809,7 @@ int drbd_send_ping_ack(struct drbd_tconn *tconn) | |||
807 | sock = &tconn->meta; | 809 | sock = &tconn->meta; |
808 | if (!conn_prepare_command(tconn, sock)) | 810 | if (!conn_prepare_command(tconn, sock)) |
809 | return -EIO; | 811 | return -EIO; |
810 | return conn_send_command(tconn, sock, P_PING_ACK, sizeof(struct p_header), NULL, 0); | 812 | return conn_send_command(tconn, sock, P_PING_ACK, 0, NULL, 0); |
811 | } | 813 | } |
812 | 814 | ||
813 | int drbd_send_sync_param(struct drbd_conf *mdev) | 815 | int drbd_send_sync_param(struct drbd_conf *mdev) |
@@ -1205,10 +1207,11 @@ send_bitmap_rle_or_plain(struct drbd_conf *mdev, struct bm_xfer_ctx *c) | |||
1205 | { | 1207 | { |
1206 | struct drbd_socket *sock = &mdev->tconn->data; | 1208 | struct drbd_socket *sock = &mdev->tconn->data; |
1207 | unsigned int header_size = drbd_header_size(mdev->tconn); | 1209 | unsigned int header_size = drbd_header_size(mdev->tconn); |
1208 | struct p_compressed_bm *p = sock->sbuf; | 1210 | struct p_compressed_bm *p = sock->sbuf + header_size; |
1209 | int len, err; | 1211 | int len, err; |
1210 | 1212 | ||
1211 | len = fill_bitmap_rle_bits(mdev, p, DRBD_SOCKET_BUFFER_SIZE - sizeof(*p) /* FIXME */, c); | 1213 | len = fill_bitmap_rle_bits(mdev, p, |
1214 | DRBD_SOCKET_BUFFER_SIZE - header_size - sizeof(*p), c); | ||
1212 | if (len < 0) | 1215 | if (len < 0) |
1213 | return -EIO; | 1216 | return -EIO; |
1214 | 1217 | ||
@@ -1218,7 +1221,7 @@ send_bitmap_rle_or_plain(struct drbd_conf *mdev, struct bm_xfer_ctx *c) | |||
1218 | P_COMPRESSED_BITMAP, sizeof(*p) + len, | 1221 | P_COMPRESSED_BITMAP, sizeof(*p) + len, |
1219 | NULL, 0); | 1222 | NULL, 0); |
1220 | c->packets[0]++; | 1223 | c->packets[0]++; |
1221 | c->bytes[0] += sizeof(*p) + len; | 1224 | c->bytes[0] += header_size + sizeof(*p) + len; |
1222 | 1225 | ||
1223 | if (c->bit_offset >= c->bm_bits) | 1226 | if (c->bit_offset >= c->bm_bits) |
1224 | len = 0; /* DONE */ | 1227 | len = 0; /* DONE */ |
@@ -1227,17 +1230,15 @@ send_bitmap_rle_or_plain(struct drbd_conf *mdev, struct bm_xfer_ctx *c) | |||
1227 | * send a buffer full of plain text bits instead. */ | 1230 | * send a buffer full of plain text bits instead. */ |
1228 | unsigned int data_size; | 1231 | unsigned int data_size; |
1229 | unsigned long num_words; | 1232 | unsigned long num_words; |
1230 | struct p_header *h = sock->sbuf; | 1233 | unsigned long *p = sock->sbuf + header_size; |
1231 | 1234 | ||
1232 | data_size = DRBD_SOCKET_BUFFER_SIZE - header_size; | 1235 | data_size = DRBD_SOCKET_BUFFER_SIZE - header_size; |
1233 | num_words = min_t(size_t, data_size / sizeof(unsigned long), | 1236 | num_words = min_t(size_t, data_size / sizeof(*p), |
1234 | c->bm_words - c->word_offset); | 1237 | c->bm_words - c->word_offset); |
1235 | len = num_words * sizeof(unsigned long); | 1238 | len = num_words * sizeof(*p); |
1236 | if (len) | 1239 | if (len) |
1237 | drbd_bm_get_lel(mdev, c->word_offset, num_words, | 1240 | drbd_bm_get_lel(mdev, c->word_offset, num_words, p); |
1238 | (unsigned long *)h->payload); | 1241 | err = __send_command(mdev->tconn, mdev->vnr, sock, P_BITMAP, len, NULL, 0); |
1239 | err = __send_command(mdev->tconn, mdev->vnr, sock, P_BITMAP, | ||
1240 | sizeof(*h) + len, NULL, 0); | ||
1241 | c->word_offset += num_words; | 1242 | c->word_offset += num_words; |
1242 | c->bit_offset = c->word_offset * BITS_PER_LONG; | 1243 | c->bit_offset = c->word_offset * BITS_PER_LONG; |
1243 | 1244 | ||
@@ -2556,8 +2557,6 @@ int __init drbd_init(void) | |||
2556 | { | 2557 | { |
2557 | int err; | 2558 | int err; |
2558 | 2559 | ||
2559 | BUILD_BUG_ON(sizeof(struct p_connection_features) != 80); | ||
2560 | |||
2561 | if (minor_count < DRBD_MINOR_COUNT_MIN || minor_count > DRBD_MINOR_COUNT_MAX) { | 2560 | if (minor_count < DRBD_MINOR_COUNT_MIN || minor_count > DRBD_MINOR_COUNT_MAX) { |
2562 | printk(KERN_ERR | 2561 | printk(KERN_ERR |
2563 | "drbd: invalid minor_count (%d)\n", minor_count); | 2562 | "drbd: invalid minor_count (%d)\n", minor_count); |