return NULL;
}
- /* update the L1 entry */
-
- s->l1_table[l1_index] = l2_offset | QCOW_OFLAG_COPIED;
- if (write_l1_entry(s, l1_index) < 0) {
- return NULL;
- }
-
/* allocate a new entry in the l2 cache */
min_index = l2_cache_new_entry(bs);
if (bdrv_pread(s->hd, old_l2_offset,
l2_table, s->l2_size * sizeof(uint64_t)) !=
s->l2_size * sizeof(uint64_t))
- return NULL;
+ goto fail;
}
/* write the l2 table to the file */
if (bdrv_pwrite(s->hd, l2_offset,
l2_table, s->l2_size * sizeof(uint64_t)) !=
s->l2_size * sizeof(uint64_t))
- return NULL;
+ goto fail;
+
+ /* update the L1 entry */
+ s->l1_table[l1_index] = l2_offset | QCOW_OFLAG_COPIED;
+ if (write_l1_entry(s, l1_index) < 0) {
+ goto fail;
+ }
/* update the l2 cache entry */
s->l2_cache_counts[min_index] = 1;
return l2_table;
+
+fail:
+ qcow2_l2_cache_reset(bs);
+ return NULL;
}
static int count_contiguous_clusters(uint64_t nb_clusters, int cluster_size,