From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:54765) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Xu0j6-00031G-Rm for qemu-devel@nongnu.org; Thu, 27 Nov 2014 10:11:25 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Xu0iz-0004jD-SV for qemu-devel@nongnu.org; Thu, 27 Nov 2014 10:11:24 -0500 Received: from mx1.redhat.com ([209.132.183.28]:54101) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Xu0iz-0004j0-HU for qemu-devel@nongnu.org; Thu, 27 Nov 2014 10:11:17 -0500 Message-ID: <54773F10.3040102@redhat.com> Date: Thu, 27 Nov 2014 16:11:12 +0100 From: Max Reitz MIME-Version: 1.0 References: <1416503198-17031-1-git-send-email-mreitz@redhat.com> <1416503198-17031-7-git-send-email-mreitz@redhat.com> <20141127150931.GF15586@stefanha-thinkpad.lan> In-Reply-To: <20141127150931.GF15586@stefanha-thinkpad.lan> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH v3 06/22] qcow2: Helper for refcount array reallocation List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Stefan Hajnoczi Cc: Kevin Wolf , qemu-devel@nongnu.org, Stefan Hajnoczi On 2014-11-27 at 16:09, Stefan Hajnoczi wrote: > 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? ... Because such a call will actually never happen. I could replace this if () by assert(new_byte_size >= old_byte_size); if (new_byte_size == old_byte_size), but as I said before, I'm not a friend of assertions when the code can deal perfectly well with the "unsupported" case. Max >> + >> + 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.