09.04.2020 18:12, Alberto Garcia wrote:
On Thu 09 Apr 2020 10:30:13 AM CEST, Vladimir Sementsov-Ogievskiy wrote:+static void calculate_l2_meta(BlockDriverState *bs, + uint64_t host_cluster_offset, + uint64_t guest_offset, unsigned bytes, + QCowL2Meta **m, bool keep_old) +{ + BDRVQcow2State *s = bs->opaque; + unsigned cow_start_from = 0; + unsigned cow_start_to = offset_into_cluster(s, guest_offset); + unsigned cow_end_from = cow_start_to + bytes; + unsigned cow_end_to = ROUND_UP(cow_end_from, s->cluster_size); + unsigned nb_clusters = size_to_clusters(s, cow_end_from); + QCowL2Meta *old_m = *m; + + *m = g_malloc0(sizeof(**m)); + **m = (QCowL2Meta) { + .next = old_m, + + .alloc_offset = host_cluster_offset, + .offset = start_of_cluster(s, guest_offset), + .nb_clusters = nb_clusters, + + .keep_old_clusters = keep_old, + + .cow_start = { + .offset = cow_start_from, + .nb_bytes = cow_start_to - cow_start_from, + }, + .cow_end = { + .offset = cow_end_from,Hmm. So, you make it equal to requested_bytes from handle_alloc().No, requested_bytes from handle_alloc is: requested_bytes = *bytes + offset_into_cluster(s, guest_offset); But *bytes is later modified before calling calculate_l2_meta(): *bytes = MIN(*bytes, nb_bytes - offset_into_cluster(s, guest_offset)); More details here: https://lists.gnu.org/archive/html/qemu-block/2019-10/msg01808.html
Ahah, me again, sorry :) -- Best regards, Vladimir
