diff --git a/src/core/ext/transport/chttp2/transport/chttp2_transport.c b/src/core/ext/transport/chttp2/transport/chttp2_transport.c
index b1473e06df0f4bad0990dcff2f206d21c20e0e1f..8ce81e9b80f29a498e97452d7b60914e82117257 100644
--- a/src/core/ext/transport/chttp2/transport/chttp2_transport.c
+++ b/src/core/ext/transport/chttp2/transport/chttp2_transport.c
@@ -851,13 +851,20 @@ static bool contains_non_ok_status(grpc_metadata_batch *batch) {
   return false;
 }
 
-typedef enum { CONTINUE_FETCHING, FINISHED_SLICE } continue_fetching_phase;
+static void add_fetched_slice_locked(grpc_exec_ctx *exec_ctx,
+                                     grpc_chttp2_transport *t,
+                                     grpc_chttp2_stream *s) {
+  s->fetched_send_message_length +=
+      (uint32_t)GPR_SLICE_LENGTH(s->fetching_slice);
+  gpr_slice_buffer_add(&s->flow_controlled_buffer, s->fetching_slice);
+  if (s->id != 0) {
+    grpc_chttp2_become_writable(exec_ctx, t, s, true, "op.send_message");
+  }
+}
 
 static void continue_fetching_send_locked(grpc_exec_ctx *exec_ctx,
                                           grpc_chttp2_transport *t,
-                                          grpc_chttp2_stream *s,
-                                          continue_fetching_phase phase) {
-  if (phase == FINISHED_SLICE) goto finished_slice;
+                                          grpc_chttp2_stream *s) {
   for (;;) {
     if (s->fetching_send_message == NULL) {
       /* Stream was cancelled before message fetch completed */
@@ -888,7 +895,6 @@ static void continue_fetching_send_locked(grpc_exec_ctx *exec_ctx,
     } else if (grpc_byte_stream_next(exec_ctx, s->fetching_send_message,
                                      &s->fetching_slice, UINT32_MAX,
                                      &s->complete_fetch)) {
-    finished_slice:
       s->fetched_send_message_length +=
           (uint32_t)GPR_SLICE_LENGTH(s->fetching_slice);
       gpr_slice_buffer_add(&s->flow_controlled_buffer, s->fetching_slice);
@@ -904,7 +910,8 @@ static void complete_fetch_locked(grpc_exec_ctx *exec_ctx, void *gs,
   grpc_chttp2_stream *s = gs;
   grpc_chttp2_transport *t = s->t;
   if (error == GRPC_ERROR_NONE) {
-    continue_fetching_send_locked(exec_ctx, t, s, FINISHED_SLICE);
+    add_fetched_slice_locked(exec_ctx, t, s);
+    continue_fetching_send_locked(exec_ctx, t, s);
   } else {
     /* TODO(ctiller): what to do here */
     abort();
@@ -1039,7 +1046,7 @@ static void perform_stream_op_locked(grpc_exec_ctx *exec_ctx, void *stream_op,
         /* TODO(ctiller): make this configurable */
         s->next_message_end_offset -= 65536;
       }
-      continue_fetching_send_locked(exec_ctx, t, s, CONTINUE_FETCHING);
+      continue_fetching_send_locked(exec_ctx, t, s);
       if (s->id != 0) {
         grpc_chttp2_become_writable(exec_ctx, t, s, true, "op.send_message");
       }