Commit 2c46407d authored by Andreas Gruenbacher's avatar Andreas Gruenbacher Committed by Philipp Reisner

drbd: receive_bitmap_plain: Get rid of ugly and useless enum

Signed-off-by: default avatarPhilipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: default avatarLars Ellenberg <lars.ellenberg@linbit.com>
parent f70af118
...@@ -3311,23 +3311,32 @@ static int receive_sync_uuid(struct drbd_conf *mdev, enum drbd_packets cmd, unsi ...@@ -3311,23 +3311,32 @@ static int receive_sync_uuid(struct drbd_conf *mdev, enum drbd_packets cmd, unsi
return true; return true;
} }
enum receive_bitmap_ret { OK, DONE, FAILED }; /**
* receive_bitmap_plain
static enum receive_bitmap_ret *
* Return 0 when done, 1 when another iteration is needed, and a negative error
* code upon failure.
*/
static int
receive_bitmap_plain(struct drbd_conf *mdev, unsigned int data_size, receive_bitmap_plain(struct drbd_conf *mdev, unsigned int data_size,
unsigned long *buffer, struct bm_xfer_ctx *c) unsigned long *buffer, struct bm_xfer_ctx *c)
{ {
unsigned num_words = min_t(size_t, BM_PACKET_WORDS, c->bm_words - c->word_offset); unsigned num_words = min_t(size_t, BM_PACKET_WORDS, c->bm_words - c->word_offset);
unsigned want = num_words * sizeof(long); unsigned want = num_words * sizeof(long);
int err;
if (want != data_size) { if (want != data_size) {
dev_err(DEV, "%s:want (%u) != data_size (%u)\n", __func__, want, data_size); dev_err(DEV, "%s:want (%u) != data_size (%u)\n", __func__, want, data_size);
return FAILED; return -EIO;
} }
if (want == 0) if (want == 0)
return DONE; return 0;
if (drbd_recv(mdev, buffer, want) != want) err = drbd_recv(mdev, buffer, want);
return FAILED; if (err != want) {
if (err >= 0)
err = -EIO;
return err;
}
drbd_bm_merge_lel(mdev, c->word_offset, num_words, buffer); drbd_bm_merge_lel(mdev, c->word_offset, num_words, buffer);
...@@ -3336,10 +3345,16 @@ receive_bitmap_plain(struct drbd_conf *mdev, unsigned int data_size, ...@@ -3336,10 +3345,16 @@ receive_bitmap_plain(struct drbd_conf *mdev, unsigned int data_size,
if (c->bit_offset > c->bm_bits) if (c->bit_offset > c->bm_bits)
c->bit_offset = c->bm_bits; c->bit_offset = c->bm_bits;
return OK; return 1;
} }
static enum receive_bitmap_ret /**
* recv_bm_rle_bits
*
* Return 0 when done, 1 when another iteration is needed, and a negative error
* code upon failure.
*/
static int
recv_bm_rle_bits(struct drbd_conf *mdev, recv_bm_rle_bits(struct drbd_conf *mdev,
struct p_compressed_bm *p, struct p_compressed_bm *p,
struct bm_xfer_ctx *c) struct bm_xfer_ctx *c)
...@@ -3359,18 +3374,18 @@ recv_bm_rle_bits(struct drbd_conf *mdev, ...@@ -3359,18 +3374,18 @@ recv_bm_rle_bits(struct drbd_conf *mdev,
bits = bitstream_get_bits(&bs, &look_ahead, 64); bits = bitstream_get_bits(&bs, &look_ahead, 64);
if (bits < 0) if (bits < 0)
return FAILED; return -EIO;
for (have = bits; have > 0; s += rl, toggle = !toggle) { for (have = bits; have > 0; s += rl, toggle = !toggle) {
bits = vli_decode_bits(&rl, look_ahead); bits = vli_decode_bits(&rl, look_ahead);
if (bits <= 0) if (bits <= 0)
return FAILED; return -EIO;
if (toggle) { if (toggle) {
e = s + rl -1; e = s + rl -1;
if (e >= c->bm_bits) { if (e >= c->bm_bits) {
dev_err(DEV, "bitmap overflow (e:%lu) while decoding bm RLE packet\n", e); dev_err(DEV, "bitmap overflow (e:%lu) while decoding bm RLE packet\n", e);
return FAILED; return -EIO;
} }
_drbd_bm_set_bits(mdev, s, e); _drbd_bm_set_bits(mdev, s, e);
} }
...@@ -3380,14 +3395,14 @@ recv_bm_rle_bits(struct drbd_conf *mdev, ...@@ -3380,14 +3395,14 @@ recv_bm_rle_bits(struct drbd_conf *mdev,
have, bits, look_ahead, have, bits, look_ahead,
(unsigned int)(bs.cur.b - p->code), (unsigned int)(bs.cur.b - p->code),
(unsigned int)bs.buf_len); (unsigned int)bs.buf_len);
return FAILED; return -EIO;
} }
look_ahead >>= bits; look_ahead >>= bits;
have -= bits; have -= bits;
bits = bitstream_get_bits(&bs, &tmp, 64 - have); bits = bitstream_get_bits(&bs, &tmp, 64 - have);
if (bits < 0) if (bits < 0)
return FAILED; return -EIO;
look_ahead |= tmp << have; look_ahead |= tmp << have;
have += bits; have += bits;
} }
...@@ -3395,10 +3410,16 @@ recv_bm_rle_bits(struct drbd_conf *mdev, ...@@ -3395,10 +3410,16 @@ recv_bm_rle_bits(struct drbd_conf *mdev,
c->bit_offset = s; c->bit_offset = s;
bm_xfer_ctx_bit_to_word_offset(c); bm_xfer_ctx_bit_to_word_offset(c);
return (s == c->bm_bits) ? DONE : OK; return (s != c->bm_bits);
} }
static enum receive_bitmap_ret /**
* decode_bitmap_c
*
* Return 0 when done, 1 when another iteration is needed, and a negative error
* code upon failure.
*/
static int
decode_bitmap_c(struct drbd_conf *mdev, decode_bitmap_c(struct drbd_conf *mdev,
struct p_compressed_bm *p, struct p_compressed_bm *p,
struct bm_xfer_ctx *c) struct bm_xfer_ctx *c)
...@@ -3412,7 +3433,7 @@ decode_bitmap_c(struct drbd_conf *mdev, ...@@ -3412,7 +3433,7 @@ decode_bitmap_c(struct drbd_conf *mdev,
dev_err(DEV, "receive_bitmap_c: unknown encoding %u\n", p->encoding); dev_err(DEV, "receive_bitmap_c: unknown encoding %u\n", p->encoding);
drbd_force_state(mdev, NS(conn, C_PROTOCOL_ERROR)); drbd_force_state(mdev, NS(conn, C_PROTOCOL_ERROR));
return FAILED; return -EIO;
} }
void INFO_bm_xfer_stats(struct drbd_conf *mdev, void INFO_bm_xfer_stats(struct drbd_conf *mdev,
...@@ -3461,7 +3482,7 @@ static int receive_bitmap(struct drbd_conf *mdev, enum drbd_packets cmd, unsigne ...@@ -3461,7 +3482,7 @@ static int receive_bitmap(struct drbd_conf *mdev, enum drbd_packets cmd, unsigne
{ {
struct bm_xfer_ctx c; struct bm_xfer_ctx c;
void *buffer; void *buffer;
enum receive_bitmap_ret ret; int err;
int ok = false; int ok = false;
struct p_header80 *h = &mdev->data.rbuf.header.h80; struct p_header80 *h = &mdev->data.rbuf.header.h80;
...@@ -3480,9 +3501,9 @@ static int receive_bitmap(struct drbd_conf *mdev, enum drbd_packets cmd, unsigne ...@@ -3480,9 +3501,9 @@ static int receive_bitmap(struct drbd_conf *mdev, enum drbd_packets cmd, unsigne
.bm_words = drbd_bm_words(mdev), .bm_words = drbd_bm_words(mdev),
}; };
do { for(;;) {
if (cmd == P_BITMAP) { if (cmd == P_BITMAP) {
ret = receive_bitmap_plain(mdev, data_size, buffer, &c); err = receive_bitmap_plain(mdev, data_size, buffer, &c);
} else if (cmd == P_COMPRESSED_BITMAP) { } else if (cmd == P_COMPRESSED_BITMAP) {
/* MAYBE: sanity check that we speak proto >= 90, /* MAYBE: sanity check that we speak proto >= 90,
* and the feature is enabled! */ * and the feature is enabled! */
...@@ -3501,7 +3522,7 @@ static int receive_bitmap(struct drbd_conf *mdev, enum drbd_packets cmd, unsigne ...@@ -3501,7 +3522,7 @@ static int receive_bitmap(struct drbd_conf *mdev, enum drbd_packets cmd, unsigne
dev_err(DEV, "ReportCBitmap packet too small (l:%u)\n", data_size); dev_err(DEV, "ReportCBitmap packet too small (l:%u)\n", data_size);
goto out; goto out;
} }
ret = decode_bitmap_c(mdev, p, &c); err = decode_bitmap_c(mdev, p, &c);
} else { } else {
dev_warn(DEV, "receive_bitmap: cmd neither ReportBitMap nor ReportCBitMap (is 0x%x)", cmd); dev_warn(DEV, "receive_bitmap: cmd neither ReportBitMap nor ReportCBitMap (is 0x%x)", cmd);
goto out; goto out;
...@@ -3510,14 +3531,14 @@ static int receive_bitmap(struct drbd_conf *mdev, enum drbd_packets cmd, unsigne ...@@ -3510,14 +3531,14 @@ static int receive_bitmap(struct drbd_conf *mdev, enum drbd_packets cmd, unsigne
c.packets[cmd == P_BITMAP]++; c.packets[cmd == P_BITMAP]++;
c.bytes[cmd == P_BITMAP] += sizeof(struct p_header80) + data_size; c.bytes[cmd == P_BITMAP] += sizeof(struct p_header80) + data_size;
if (ret != OK) if (err <= 0) {
if (err < 0)
goto out;
break; break;
}
if (!drbd_recv_header(mdev, &cmd, &data_size)) if (!drbd_recv_header(mdev, &cmd, &data_size))
goto out; goto out;
} while (ret == OK); }
if (ret == FAILED)
goto out;
INFO_bm_xfer_stats(mdev, "receive", &c); INFO_bm_xfer_stats(mdev, "receive", &c);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment