> > + /* Fix cluster_ending_nr if we are at risk of reading outside the image > > + * (Cluster unaligned image size) > > + */ > > + max_cluster_ending_nr = bs->total_sectors - first_sector_after_qiov; > > + cluster_ending_nr = max_cluster_ending_nr < (uint64_t) > > cluster_ending_nr ? > > + (int) max_cluster_ending_nr : cluster_ending_nr; > > Is there a test case for the cluster unaligned image size scenario?
I discovered this case using qemu-io-tests one of the test case trigger this. > > + iov.iov_len = nb_sectors * BDRV_SECTOR_SIZE; > > + iov.iov_base = data; > > + qemu_iovec_init_external(&qiov, &iov, 1); > > + qemu_co_mutex_unlock(&s->lock); > > + ret = bdrv_co_readv(bs, sector_num, nb_sectors, &qiov); > > This function should be marked coroutine_fn - it may only be called from > inside a coroutine. It's good to mark all coroutine functions so the > reader knows immediately this will run in coroutine context. > > bdrv_co_readv() is does I/O throttling. This is wrong here since we > don't want to charge for internal I/O. Should I use qcow2_co_readv to bypass the I/O throttling ? Benoît