From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:47824) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YDyXO-0006jY-NK for qemu-devel@nongnu.org; Wed, 21 Jan 2015 11:53:51 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YDyXK-00081W-6l for qemu-devel@nongnu.org; Wed, 21 Jan 2015 11:53:50 -0500 Received: from mx1.redhat.com ([209.132.183.28]:39981) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YDyXJ-00081M-U4 for qemu-devel@nongnu.org; Wed, 21 Jan 2015 11:53:46 -0500 Date: Wed, 21 Jan 2015 16:53:35 +0000 From: Stefan Hajnoczi Message-ID: <20150121165335.GE4740@stefanha-thinkpad.redhat.com> References: <1416844620-17717-1-git-send-email-mreitz@redhat.com> <1416844620-17717-2-git-send-email-mreitz@redhat.com> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="TD8GDToEDw0WLGOL" Content-Disposition: inline In-Reply-To: <1416844620-17717-2-git-send-email-mreitz@redhat.com> Subject: Re: [Qemu-devel] [PATCH v2 01/12] qcow2: Add new overlap check functions List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Max Reitz Cc: Kevin Wolf , Peter Lieven , qemu-devel@nongnu.org --TD8GDToEDw0WLGOL Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Mon, Nov 24, 2014 at 04:56:49PM +0100, Max Reitz wrote: > +static void build_window_bitmap(Qcow2MetadataList *mdl, > + Qcow2MetadataWindow *window) > +{ > + int cache_i, oldest_cache_i = -1, i; > + unsigned oldest_cache_age = 0; > + > + for (cache_i = 0; cache_i < mdl->nb_cached_windows; cache_i++) { > + unsigned age; > + > + if (mdl->cached_windows[cache_i] < 0) { > + break; > + } > + > + age = mdl->current_age - mdl->windows[mdl->cached_windows[cache_i]].age; > + if (age > oldest_cache_age) { > + oldest_cache_age = age; > + oldest_cache_i = cache_i; > + } > + } > + > + if (cache_i >= mdl->nb_cached_windows) { > + destroy_window_bitmap(mdl, > + &mdl->windows[mdl->cached_windows[oldest_cache_i]]); > + cache_i = oldest_cache_i; > + } > + > + assert(cache_i >= 0); > + mdl->cached_windows[cache_i] = window - mdl->windows; > + window->cached_windows_index = cache_i; Is this field ever used? > +/** > + * Removes a range of the given types from the metadata list. > + */ > +void qcow2_metadata_list_remove(BlockDriverState *bs, uint64_t offset, > + int nb_clusters, QCow2MetadataOverlap types) > +{ > + BDRVQcowState *s = bs->opaque; > + uint64_t start_cluster = offset >> s->cluster_bits; > + uint64_t end_cluster = start_cluster + nb_clusters; > + uint64_t current_cluster = start_cluster; > + > + types &= s->overlap_check; > + if (!types) { > + return; > + } > + > + if (offset_into_cluster(s, offset)) { > + /* Try to remove even broken metadata ranges */ > + end_cluster++; Why does it make sense to go ahead (and add another cluster on to the end) when offset is not cluster-aligned? It seems we might clear out the wrong metadata. --TD8GDToEDw0WLGOL Content-Type: application/pgp-signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQEcBAEBAgAGBQJUv9mPAAoJEJykq7OBq3PIfBcIALH5+rLc9mgECalt2deGDcFd CybvuqWBj98PC+LKarBkk1xqRYxWuMoRGQIAx4aOzN0ZzbAtu9B/weYSP0Xt8Bv0 MbAYB0kV08y0H2fUOOlFqsmEs69DpxABeATpugOUBArqfTSPCygM3m/BalJ43Vvm GfXSEVPP5qNoovelGP/BcqLZ3FfdkVYMRfqRrtxM6IkxuJSHlwibrBnDvFaywKhT ZH0pQli4C912lM4UpakwHCs1VkLmX3Qt/hBCWaY4OAXO00zGQnUbP10G6rrGt3nN QZlSlsN4k9cMU5sl6tYbd2luKaLMxoM2Ud2IZOzRK4VvbvUoavEMaDhTNNEuCZc= =KHiK -----END PGP SIGNATURE----- --TD8GDToEDw0WLGOL--