@@ -51,6 +51,7 @@ typedef struct MirrorBlockJob {
uint8_t *buf;
QSIMPLEQ_HEAD(, MirrorBuffer) buf_free;
int buf_free_count;
+ int buf_total_count;
unsigned long *in_flight_bitmap;
int in_flight;
@@ -238,6 +239,10 @@ static uint64_t coroutine_fn mirror_iteration(MirrorBlockJob *s)
break;
}
+ if (s->buf_total_count / 2 < nb_chunks + added_chunks) {
+ break;
+ }
+
/* We have enough free space to copy these sectors. */
bitmap_set(s->in_flight_bitmap, next_chunk, added_chunks);
@@ -307,6 +312,7 @@ static void mirror_free_init(MirrorBlockJob *s)
buf_size -= granularity;
buf += granularity;
}
+ s->buf_total_count = s->buf_free_count;
}
static void mirror_drain(MirrorBlockJob *s)