[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v5 3/4] qcow2: check for NULL l2meta
From: |
Benoît Canet |
Subject: |
Re: [Qemu-devel] [PATCH v5 3/4] qcow2: check for NULL l2meta |
Date: |
Sun, 26 Jan 2014 05:16:49 +0100 |
User-agent: |
Mutt/1.5.21 (2010-09-15) |
Le Sunday 26 Jan 2014 à 11:12:39 (+0800), Hu Tao a écrit :
> In the case of a metadata preallocation with a large cluster size,
> qcow2_alloc_cluster_offset() can allocate nothing and returns a
> NULL l2meta. This patch checks for it and link2 l2 with only valid
> l2meta.
>
> Replace 9 and 512 with BDRV_SECTOR_BITS, BDRV_SECTOR_SIZE
> respectively while at the function.
>
> Reviewed-by: Max Reitz <address@hidden>
> Signed-off-by: Hu Tao <address@hidden>
> ---
> block/qcow2.c | 31 ++++++++++++++++---------------
> 1 file changed, 16 insertions(+), 15 deletions(-)
>
> diff --git a/block/qcow2.c b/block/qcow2.c
> index effdd56..bfdbfa1 100644
> --- a/block/qcow2.c
> +++ b/block/qcow2.c
> @@ -1396,34 +1396,34 @@ static int preallocate(BlockDriverState *bs)
> int ret;
> QCowL2Meta *meta;
>
> - nb_sectors = bdrv_getlength(bs) >> 9;
> + nb_sectors = bdrv_getlength(bs) >> BDRV_SECTOR_BITS;
> offset = 0;
>
> while (nb_sectors) {
> - num = MIN(nb_sectors, INT_MAX >> 9);
> + num = MIN(nb_sectors, INT_MAX >> BDRV_SECTOR_BITS);
> ret = qcow2_alloc_cluster_offset(bs, offset, &num,
> &host_offset, &meta);
> if (ret < 0) {
> return ret;
> }
>
> - ret = qcow2_alloc_cluster_link_l2(bs, meta);
> - if (ret < 0) {
> - qcow2_free_any_clusters(bs, meta->alloc_offset,
> meta->nb_clusters,
> - QCOW2_DISCARD_NEVER);
> - return ret;
> - }
> -
> - /* There are no dependent requests, but we need to remove our request
> - * from the list of in-flight requests */
> if (meta != NULL) {
> + ret = qcow2_alloc_cluster_link_l2(bs, meta);
> + if (ret < 0) {
> + qcow2_free_any_clusters(bs, meta->alloc_offset,
> + meta->nb_clusters,
> QCOW2_DISCARD_NEVER);
> + return ret;
> + }
> +
> + /* There are no dependent requests, but we need to remove our
> + * request from the list of in-flight requests */
> QLIST_REMOVE(meta, next_in_flight);
> }
>
> /* TODO Preallocate data if requested */
>
> nb_sectors -= num;
> - offset += num << 9;
> + offset += num << BDRV_SECTOR_BITS;
> }
>
> /*
> @@ -1432,9 +1432,10 @@ static int preallocate(BlockDriverState *bs)
> * EOF). Extend the image to the last allocated sector.
> */
> if (host_offset != 0) {
> - uint8_t buf[512];
> - memset(buf, 0, 512);
> - ret = bdrv_write(bs->file, (host_offset >> 9) + num - 1, buf, 1);
> + uint8_t buf[BDRV_SECTOR_SIZE];
> + memset(buf, 0, BDRV_SECTOR_SIZE);
> + ret = bdrv_write(bs->file, (host_offset >> BDRV_SECTOR_BITS) + num -
> 1,
> + buf, 1);
> if (ret < 0) {
> return ret;
> }
> --
> 1.8.5.2.229.g4448466
>
>
Reviewed-by: Benoit Canet <address@hidden>