On Wed, 07/24 13:54, Jeff Cody wrote:
> This adds support for writing to VHDX image files, using coroutines.
> Writes into the BAT table goes through the VHDX log.  Currently, BAT
> table writes occur when expanding a dynamic VHDX file, and allocating a
> new BAT entry.
> 
> Signed-off-by: Jeff Cody <jc...@redhat.com>
> ---
>  block/vhdx.c | 149 
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 147 insertions(+), 2 deletions(-)
> 
> diff --git a/block/vhdx.c b/block/vhdx.c
> index a8dd6d7..791c6dc 100644
> --- a/block/vhdx.c
> +++ b/block/vhdx.c
> @@ -831,7 +831,7 @@ static int vhdx_open(BlockDriverState *bs, QDict 
> *options, int flags)
>          vhdx_update_headers(bs, s, false, NULL);
>      }
>  
> -    /* TODO: differencing files, write */
> +    /* TODO: differencing files */
>  
>      return 0;
>  fail:
> @@ -963,7 +963,45 @@ exit:
>      return ret;
>  }
>  
> +/*
> + * Allocate a new payload block at the end of the file.
> + *
> + * Allocation will happen at 1MB alignment inside the file
> + *
> + * Returns the file offset start of the new payload block
> + */
> +static int vhdx_allocate_block(BlockDriverState *bs, BDRVVHDXState *s,
> +                                    uint64_t *new_offset)
> +{
> +    *new_offset = bdrv_getlength(bs->file);
>  
> +    /* per the spec, the address for a block is in units of 1MB */
> +    if (*new_offset % (1024*1024)) {
> +        *new_offset = ((*new_offset >> 20) + 1) << 20;  /* round up to 1MB */

You can use ROUND_UP() macro here:

*new_offset = ROUND_UP(*new_offset, 1 << 20);

Fam

Reply via email to