On Wed 22 Apr 2020 10:07:30 AM CEST, Vladimir Sementsov-Ogievskiy wrote:
+static int count_contiguous_subclusters(BlockDriverState *bs, int nb_clusters,
+ unsigned sc_index, uint64_t *l2_slice,
+ int l2_index)
{
BDRVQcow2State *s = bs->opaque;
preexist, but, worth asserting that nb_clusters are all in this
l2_slice?
Ok.
+ for (j = (i == 0) ? sc_index : 0; j < s->subclusters_per_cluster; j++)
{
+ if (qcow2_get_subcluster_type(bs, l2_entry, l2_bitmap, j) != type)
{
+ goto out;
why not just return count from here? And then you don't need goto at
all. Hmm, may be out: code will be extended in further patches..
It's not extended in further patches. I generally prefer having a single
exit point but you're right that it probably doesn't make sense here.
/* Compressed clusters can only be processed one by one */
- c = 1;
+ sc = s->subclusters_per_cluster - sc_index;
should not we assert here that sc_index == 0? Otherwise the caller
definitely doing something wrong.
No, no, the guest offset doesn't need to be cluster aligned so sc_index
can perfectly be != 0.
+ case QCOW2_SUBCLUSTER_ZERO_ALLOC:
+ case QCOW2_SUBCLUSTER_NORMAL:
+ case QCOW2_SUBCLUSTER_UNALLOCATED_ALLOC:
+ sc = count_contiguous_subclusters(bs, nb_clusters, sc_index,
+ l2_slice, l2_index);
*host_offset = l2_entry & L2E_OFFSET_MASK;
if (offset_into_cluster(s, *host_offset)) {
Hmm, you may move "sc = count_contiguous_subclusters" to be after the
switch-block, as it is universal now. And keep only offset calculation
and error checking in the switch-block.
That's actually a good idea, thanks !! (plus we actually get to use the
QCOW2_SUBCLUSTER_COMPRESSED check in count_contiguous_subclusters(),
which is currently dead code).
Berto