On 2018-01-26 15:59, Alberto Garcia wrote: > The BDRVQcow2State structure contains an l2_size field, which stores > the number of 64-bit entries in an L2 table. > > For efficiency reasons we want to be able to load slices instead of > full L2 tables, so we need to know how many entries an L2 slice can > hold. > > An L2 slice is the portion of an L2 table that is loaded by the qcow2 > cache. At the moment that cache can only load complete tables, > therefore an L2 slice has the same size as an L2 table (one cluster) > and l2_size == l2_slice_size. > > Later we'll allow smaller slices, but until then we have to use this > new l2_slice_size field to make the rest of the code ready for that. > > Signed-off-by: Alberto Garcia <[email protected]> > Reviewed-by: Eric Blake <[email protected]> > --- > block/qcow2.c | 3 +++ > block/qcow2.h | 1 + > 2 files changed, 4 insertions(+)
Am I missing something or does this patch miss setting l2_slice_size in
qcow2_do_open()?
Max
> diff --git a/block/qcow2.c b/block/qcow2.c
> index e2d4bf7ad5..78f067cae7 100644
> --- a/block/qcow2.c
> +++ b/block/qcow2.c
> @@ -805,6 +805,7 @@ static void read_cache_sizes(BlockDriverState *bs,
> QemuOpts *opts,
> typedef struct Qcow2ReopenState {
> Qcow2Cache *l2_table_cache;
> Qcow2Cache *refcount_block_cache;
> + int l2_slice_size; /* Number of entries in a slice of the L2 table */
> bool use_lazy_refcounts;
> int overlap_check;
> bool discard_passthrough[QCOW2_DISCARD_MAX];
> @@ -886,6 +887,7 @@ static int qcow2_update_options_prepare(BlockDriverState
> *bs,
> }
> }
>
> + r->l2_slice_size = s->cluster_size / sizeof(uint64_t);
> r->l2_table_cache = qcow2_cache_create(bs, l2_cache_size);
> r->refcount_block_cache = qcow2_cache_create(bs, refcount_cache_size);
> if (r->l2_table_cache == NULL || r->refcount_block_cache == NULL) {
> @@ -1049,6 +1051,7 @@ static void
> qcow2_update_options_commit(BlockDriverState *bs,
> }
> s->l2_table_cache = r->l2_table_cache;
> s->refcount_block_cache = r->refcount_block_cache;
> + s->l2_slice_size = r->l2_slice_size;
>
> s->overlap_check = r->overlap_check;
> s->use_lazy_refcounts = r->use_lazy_refcounts;
> diff --git a/block/qcow2.h b/block/qcow2.h
> index 0559afbc63..e0aee88811 100644
> --- a/block/qcow2.h
> +++ b/block/qcow2.h
> @@ -251,6 +251,7 @@ typedef struct BDRVQcow2State {
> int cluster_bits;
> int cluster_size;
> int cluster_sectors;
> + int l2_slice_size;
> int l2_bits;
> int l2_size;
> int l1_size;
>
signature.asc
Description: OpenPGP digital signature
