On Tue 23 May 2017 01:23:02 PM CEST, Alberto Garcia wrote: You can still review this now if you want, but here's a couple of minor things I'll correct in the next revision:
> + if (m->data_qiov) { > + qemu_iovec_reset(&qiov); > + qemu_iovec_add(&qiov, start_buffer, start->nb_bytes); > + qemu_iovec_concat(&qiov, m->data_qiov, 0, data_bytes); > + qemu_iovec_add(&qiov, end_buffer, end->nb_bytes); I'll check start->nb_bytes and end->nb_bytes for zero before calling qemu_iovec_add() (no practical difference, but I find it a bit cleaner). > +/* Check if it's possible to merge a write request with the writing of > + * the data from the COW regions */ > +static bool can_merge_cow(uint64_t offset, unsigned bytes, > + QEMUIOVector *hd_qiov, QCowL2Meta *l2meta) > +{ > + QCowL2Meta *m; > + > + for (m = l2meta; m != NULL; m = m->next) { > + /* If both COW regions are empty then there's nothing to merge */ > + if (m->cow_start.nb_bytes == 0 && m->cow_end.nb_bytes == 0) { > + continue; > + } > + > + /* The data (middle) region must be immediately after the > + * start region */ > + if (l2meta_cow_start(m) + m->cow_start.nb_bytes != offset) { > + continue; > + } I realized that I'm using guest offsets in this function. Since this checks if we can _write_ everything together I think I should be using host offsets instead. I also don't think this makes any difference in practice in this case, but I'll update it. Berto