qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH for-2.10 13/16] block/qcow2: qcow2_calc_size_usa


From: Max Reitz
Subject: Re: [Qemu-devel] [PATCH for-2.10 13/16] block/qcow2: qcow2_calc_size_usage() for truncate
Date: Mon, 20 Mar 2017 16:14:21 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.8.0

On 20.03.2017 12:26, Stefan Hajnoczi wrote:
> On Mon, Mar 13, 2017 at 10:41:14PM +0100, Max Reitz wrote:
>> This patch extends qcow2_calc_size_usage() so it can calculate the
>> additional space needed for preallocating image growth.
>>
>> Signed-off-by: Max Reitz <address@hidden>
>> ---
>>  block/qcow2.c | 137 
>> +++++++++++++++++++++++++++++++++++++++++-----------------
>>  1 file changed, 98 insertions(+), 39 deletions(-)
>>
>> diff --git a/block/qcow2.c b/block/qcow2.c
>> index 21b2b3cd53..80fb815b15 100644
>> --- a/block/qcow2.c
>> +++ b/block/qcow2.c
>> @@ -2101,7 +2101,15 @@ done:
>>      return ret;
>>  }
>>  
>> -static uint64_t qcow2_calc_size_usage(uint64_t new_size,
>> +/**
>> + * Returns the number of bytes that must be allocated in the underlying file
>> + * to accomodate an image growth from @current_size to @new_size.
>> + *
>> + * @current_size must be 0 when creating a new image. In that case, @bs is
>> + * ignored; otherwise it must be valid.
>> + */
>> +static uint64_t qcow2_calc_size_usage(BlockDriverState *bs,
>> +                                      uint64_t current_size, uint64_t 
>> new_size,
>>                                        int cluster_bits, int refcount_order)
>>  {
>>      size_t cluster_size = 1u << cluster_bits;
>> @@ -2122,47 +2130,97 @@ static uint64_t qcow2_calc_size_usage(uint64_t 
>> new_size,
>>      refblock_bits = cluster_bits - (refcount_order - 3);
>>      refblock_size = 1 << refblock_bits;
>>  
>> -    /* header: 1 cluster */
>> -    meta_size += cluster_size;
>> -
>> -    /* total size of L2 tables */
>> -    nl2e = aligned_total_size / cluster_size;
>> -    nl2e = align_offset(nl2e, cluster_size / sizeof(uint64_t));
>> -    meta_size += nl2e * sizeof(uint64_t);
>> +    if (!current_size) {
> 
> This massive if statement effectively makes two functions: the old
> qcow2_calc_size_usage() and the new qcow2_calc_size_change(bs) function.
> 
> It might be nicer to split the two functions.

Hm, yes, but at that point I might as well just write two completely
separate functions. I'll see what I can do, maybe I'll just put the new
logic that's needed into a completely new function after all.

Max

Attachment: signature.asc
Description: OpenPGP digital signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]