From 2de876efa68d59fa4339837c4a94b42015ab1836 Mon Sep 17 00:00:00 2001 From: Philipp Reisner Date: Tue, 15 Mar 2011 14:38:01 +0100 Subject: [PATCH] drbd: Ignore packets for non existing volumes Signed-off-by: Philipp Reisner Signed-off-by: Lars Ellenberg --- drivers/block/drbd/drbd_receiver.c | 33 ++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c index 1aace37c5160..57691a3b8f3b 100644 --- a/drivers/block/drbd/drbd_receiver.c +++ b/drivers/block/drbd/drbd_receiver.c @@ -3794,27 +3794,40 @@ static int receive_bitmap(struct drbd_conf *mdev, enum drbd_packet cmd, return ok; } -static int receive_skip(struct drbd_conf *mdev, enum drbd_packet cmd, - unsigned int data_size) +static int _tconn_receive_skip(struct drbd_tconn *tconn, unsigned int data_size) { /* TODO zero copy sink :) */ static char sink[128]; int size, want, r; - dev_warn(DEV, "skipping unknown optional packet type %d, l: %d!\n", - cmd, data_size); - size = data_size; while (size > 0) { want = min_t(int, size, sizeof(sink)); - r = drbd_recv(mdev->tconn, sink, want); - if (!expect(r > 0)) + r = drbd_recv(tconn, sink, want); + if (r <= 0) break; size -= r; } return size == 0; } +static int receive_skip(struct drbd_conf *mdev, enum drbd_packet cmd, + unsigned int data_size) +{ + dev_warn(DEV, "skipping unknown optional packet type %d, l: %d!\n", + cmd, data_size); + + return _tconn_receive_skip(mdev->tconn, data_size); +} + +static int tconn_receive_skip(struct drbd_tconn *tconn, enum drbd_packet cmd, unsigned int data_size) +{ + conn_warn(tconn, "skipping packet for non existing volume type %d, l: %d!\n", + cmd, data_size); + + return _tconn_receive_skip(tconn, data_size); +} + static int receive_UnplugRemote(struct drbd_conf *mdev, enum drbd_packet cmd, unsigned int data_size) { @@ -3890,6 +3903,7 @@ static struct data_cmd drbd_cmd_handler[] = { static void drbdd(struct drbd_tconn *tconn) { struct p_header *header = &tconn->data.rbuf.header; + struct drbd_conf *mdev; struct packet_info pi; size_t shs; /* sub header size */ int rv; @@ -3920,7 +3934,10 @@ static void drbdd(struct drbd_tconn *tconn) } } - rv = drbd_cmd_handler[pi.cmd].function(vnr_to_mdev(tconn, pi.vnr), pi.cmd, pi.size - shs); + mdev = vnr_to_mdev(tconn, pi.vnr); + rv = mdev ? + drbd_cmd_handler[pi.cmd].function(mdev, pi.cmd, pi.size - shs) : + tconn_receive_skip(tconn, pi.cmd, pi.size - shs); if (unlikely(!rv)) { conn_err(tconn, "error receiving %s, l: %d!\n", -- 2.39.2