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