On 12/03/2014 06:37 AM, Max Reitz wrote: > update_refcount() and qcow2_update_cluster_refcount() currently take a > signed addend. At least one caller passes a value directly derived from > an absolute refcount that should be reached ("l2_refcount - 1" in > expand_zero_clusters_in_l1()). Therefore, the addend should be unsigned > because unsigned overflow is well-defined in contrast to signed > overflow. This will be especially important for 64 bit refcounts. > > Because update_refcount() then no longer knows whether the refcount > should be increased or decreased (which is important for setting the > refblock-L2-table cache dependency and for overflow/underflow checks), > it now requires an additional flag which specified exactly that. The > same applies to qcow2_update_cluster_refcount(). > > Signed-off-by: Max Reitz <mre...@redhat.com> > --- > block/qcow2-cluster.c | 2 +- > block/qcow2-refcount.c | 63 > ++++++++++++++++++++++++++++++++------------------ > block/qcow2.h | 3 ++- > 3 files changed, 44 insertions(+), 24 deletions(-) >
> @@ -1677,7 +1695,8 @@ static void compare_refcounts(BlockDriverState *bs, > BdrvCheckResult *res, > > if (num_fixed) { > ret = update_refcount(bs, i << s->cluster_bits, 1, > - (int)refcount2 - (int)refcount1, > + refcount2 - refcount1, > + refcount1 > refcount2, > QCOW2_DISCARD_ALWAYS); Nice - my comment on 4/26 is indeed addressed here (so I was correct in guessing that the series touched that area again, and no need to respin). Reviewed-by: Eric Blake <ebl...@redhat.com> -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org
signature.asc
Description: OpenPGP digital signature