aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/block/drbd/drbd_main.c
diff options
context:
space:
mode:
authorAndreas Gruenbacher <agruen@linbit.com>2011-03-30 06:54:42 -0400
committerPhilipp Reisner <philipp.reisner@linbit.com>2012-11-08 10:45:09 -0500
commite658983af6e62304be785cd6b0ae756723057395 (patch)
tree6dd2e2c85c704fb353d02feeb25cfc44613405e1 /drivers/block/drbd/drbd_main.c
parent50d0b1ad78b99aa776c3ddf9b1d45163fff435b9 (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.c45
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
706static void prepare_header80(struct p_header80 *h, enum drbd_packet cmd, int size) 706static 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
713static void prepare_header95(struct p_header95 *h, enum drbd_packet cmd, int size) 714static 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
720static void prepare_header(struct drbd_tconn *tconn, int vnr, struct p_header *h, 722static 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
729void *conn_prepare_command(struct drbd_tconn *tconn, struct drbd_socket *sock) 731void *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
739void *drbd_prepare_command(struct drbd_conf *mdev, struct drbd_socket *sock) 741void *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
803int drbd_send_ping_ack(struct drbd_tconn *tconn) 805int 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
813int drbd_send_sync_param(struct drbd_conf *mdev) 815int 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);