diff options
author | Lars Ellenberg <lars.ellenberg@linbit.com> | 2009-11-16 09:58:04 -0500 |
---|---|---|
committer | Philipp Reisner <philipp.reisner@linbit.com> | 2009-11-24 12:12:13 -0500 |
commit | 0b33a9164aca6332bf4a117af5528dea9675d782 (patch) | |
tree | ed825f7c748a362429aebcdb82ce836d1fcd31b0 /drivers | |
parent | 6c6c7951be7652f86109f2193651b78d90907c0d (diff) |
add missing state change on corrupt packet header in drbd_recv_header
Otherwise the 'state fixup' in the receiver will change to Unconnected,
but the receiver will terminate itself, and any attempt at 'down'ing
that drbd later will block forever.
see also Bugz. #259
Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/block/drbd/drbd_receiver.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c index 9bbc509443e5..fb29a75053ef 100644 --- a/drivers/block/drbd/drbd_receiver.c +++ b/drivers/block/drbd/drbd_receiver.c | |||
@@ -3499,8 +3499,10 @@ static void drbdd(struct drbd_conf *mdev) | |||
3499 | 3499 | ||
3500 | while (get_t_state(&mdev->receiver) == Running) { | 3500 | while (get_t_state(&mdev->receiver) == Running) { |
3501 | drbd_thread_current_set_cpu(mdev); | 3501 | drbd_thread_current_set_cpu(mdev); |
3502 | if (!drbd_recv_header(mdev, header)) | 3502 | if (!drbd_recv_header(mdev, header)) { |
3503 | drbd_force_state(mdev, NS(conn, C_PROTOCOL_ERROR)); | ||
3503 | break; | 3504 | break; |
3505 | } | ||
3504 | 3506 | ||
3505 | if (header->command < P_MAX_CMD) | 3507 | if (header->command < P_MAX_CMD) |
3506 | handler = drbd_cmd_handler[header->command]; | 3508 | handler = drbd_cmd_handler[header->command]; |