[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v3 06/22] qcow2: Helper for refcount array reall
From: |
Stefan Hajnoczi |
Subject: |
Re: [Qemu-devel] [PATCH v3 06/22] qcow2: Helper for refcount array reallocation |
Date: |
Thu, 27 Nov 2014 15:09:31 +0000 |
User-agent: |
Mutt/1.5.23 (2014-03-12) |
On Thu, Nov 20, 2014 at 06:06:22PM +0100, Max Reitz wrote:
> +/**
> + * Reallocates *array so that it can hold new_size entries. *size must
> contain
> + * the current number of entries in *array. If the reallocation fails, *array
> + * and *size will not be modified and -errno will be returned. If the
> + * reallocation is successful, *array will be set to the new buffer and *size
> + * will be set to new_size. The size of the reallocated refcount array buffer
> + * will be aligned to a cluster boundary, and the newly allocated area will
> be
> + * zeroed.
> + */
> +static int realloc_refcount_array(BDRVQcowState *s, uint16_t **array,
> + int64_t *size, int64_t new_size)
> +{
> + /* Round to clusters so the array can be directly written to disk */
> + size_t old_byte_size = ROUND_UP(refcount_array_byte_size(s, *size),
> + s->cluster_size);
> + size_t new_byte_size = ROUND_UP(refcount_array_byte_size(s, new_size),
> + s->cluster_size);
> + uint16_t *new_ptr;
> +
> + if (new_byte_size <= old_byte_size) {
> + *size = new_size;
> + return 0;
> + }
Why not realloc the array to the new smaller size? ...
> +
> + assert(new_byte_size > 0);
> +
> + new_ptr = g_try_realloc(*array, new_byte_size);
> + if (!new_ptr) {
> + return -ENOMEM;
> + }
> +
> + memset((void *)((uintptr_t)new_ptr + old_byte_size), 0,
> + new_byte_size - old_byte_size);
...we just need to skip the memset in when new_byte_size is smaller
than old_byte_size.
pgpqdydpwrTTV.pgp
Description: PGP signature