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.
pgpGB_wFduFDj.pgp
Description: PGP signature