All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jeff Cody <jcody@redhat.com>
To: Stefan Hajnoczi <stefanha@gmail.com>
Cc: kwolf@redhat.com, famz@redhat.com, qemu-devel@nongnu.org,
	stefanha@redhat.com
Subject: Re: [Qemu-devel] [PATCH v6 11/20] block: vhdx write support
Date: Tue, 1 Oct 2013 09:55:17 -0400	[thread overview]
Message-ID: <20131001135517.GA18576@localhost.localdomain> (raw)
In-Reply-To: <20131001132917.GD6035@stefanha-thinkpad.redhat.com>

On Tue, Oct 01, 2013 at 03:29:17PM +0200, Stefan Hajnoczi wrote:
> On Wed, Sep 25, 2013 at 05:02:56PM -0400, Jeff Cody wrote:
> > @@ -1070,7 +1070,43 @@ 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 */
> > +    *new_offset = ROUND_UP(*new_offset, 1024*1024);
> > +
> > +    return bdrv_truncate(bs->file, *new_offset + s->block_size);
> > +}
> > +
> > +/*
> > + * Update the BAT tablet entry with the new file offset, and the new entry
> 
> s/tablet/table/
> 
> > + * state */
> > +static void vhdx_update_bat_table_entry(BlockDriverState *bs, BDRVVHDXState *s,
> > +                                       VHDXSectorInfo *sinfo,
> > +                                       uint64_t *bat_entry,
> > +                                       uint64_t *bat_offset, int state)
> > +{
> > +    /* The BAT entry is a uint64, with 44 bits for the file offset in units of
> > +     * 1MB, and 3 bits for the block state. */
> > +    s->bat[sinfo->bat_idx]  = ((sinfo->file_offset>>20) <<
> 
> QEMU coding style requires space around the '>>'.  Please run
> scripts/checkpatch.pl.

I missed that - but I did run checkpatch.pl, it did not catch it:

vhdx-v6/0011-block-vhdx-write-support.patch has no obvious style problems and
is ready for submission.
total: 0 errors, 0 warnings, 31 lines checked

I think the parenthesis hid it.

> 
> > +                               VHDX_BAT_FILE_OFF_BITS);
> >  
> > +    s->bat[sinfo->bat_idx] |= state & VHDX_BAT_STATE_BIT_MASK;
> > +
> > +    *bat_entry = cpu_to_le64(s->bat[sinfo->bat_idx]);
> 
> Call this argument bat_entry_le so callers know now to manipulate the
> little-endian value directly?
>

Yes, good idea.

> > +    *bat_offset = s->bat_offset + sinfo->bat_idx * sizeof(VHDXBatEntry);
> > +
> > +}
> >  
> >  /* Per the spec, on the first write of guest-visible data to the file the
> >   * data write guid must be updated in the header */
> > @@ -1087,7 +1123,117 @@ int vhdx_user_visible_write(BlockDriverState *bs, BDRVVHDXState *s)
> >  static coroutine_fn int vhdx_co_writev(BlockDriverState *bs, int64_t sector_num,
> >                                        int nb_sectors, QEMUIOVector *qiov)
> >  {
> > -    return -ENOTSUP;
> > +    int ret = -ENOTSUP;
> > +    BDRVVHDXState *s = bs->opaque;
> > +    VHDXSectorInfo sinfo;
> > +    uint64_t bytes_done = 0;
> > +    uint64_t bat_entry = 0;
> > +    uint64_t bat_entry_offset = 0;
> > +    bool bat_update;
> > +    QEMUIOVector hd_qiov;
> > +
> > +    qemu_iovec_init(&hd_qiov, qiov->niov);
> > +
> > +    qemu_co_mutex_lock(&s->lock);
> > +
> > +    ret = vhdx_user_visible_write(bs, s);
> > +    if (ret < 0) {
> > +        goto exit;
> > +    }
> > +
> > +    while (nb_sectors > 0) {
> > +        if (s->params.data_bits & VHDX_PARAMS_HAS_PARENT) {
> > +            /* not supported yet */
> > +            ret = -ENOTSUP;
> > +            goto exit;
> > +        } else {
> > +            bat_update = false;
> > +            vhdx_block_translate(s, sector_num, nb_sectors, &sinfo);
> > +
> > +            qemu_iovec_reset(&hd_qiov);
> > +            qemu_iovec_concat(&hd_qiov, qiov,  bytes_done, sinfo.bytes_avail);
> > +            /* check the payload block state */
> > +            switch (s->bat[sinfo.bat_idx] & VHDX_BAT_STATE_BIT_MASK) {
> > +            case PAYLOAD_BLOCK_ZERO:
> > +                /* in this case, we need to preserve zero writes for
> > +                 * data that is not part of this write, so we must pad
> > +                 * the rest of the buffer to zeroes */
> > +
> > +                /* if we are on a posix system with ftruncate() that extends
> > +                 * a file, then it is zero-filled for us.  On Win32, the raw
> > +                 * layer uses SetFilePointer and SetFileEnd, which does not
> > +                 * zero fill AFAIK */
> > +
> > +                /* TODO: queue another write of zero buffers if the host OS does
> > +                 * not zero-fill on file extension */
> 
> This is never addressed in the series.
>

I will address it in v7

> > +
> > +                /* fall through */
> > +            case PAYLOAD_BLOCK_NOT_PRESENT: /* fall through */
> > +            case PAYLOAD_BLOCK_UNMAPPED:    /* fall through */
> > +            case PAYLOAD_BLOCK_UNDEFINED:   /* fall through */
> > +                ret = vhdx_allocate_block(bs, s, &sinfo.file_offset);
> > +                if (ret < 0) {
> > +                    goto exit;
> > +                }
> > +                /* once we support differencing files, this may also be
> > +                 * partially present */
> > +                /* update block state to the newly specified state */
> > +                vhdx_update_bat_table_entry(bs, s, &sinfo, &bat_entry,
> > +                                            &bat_entry_offset,
> > +                                            PAYLOAD_BLOCK_FULL_PRESENT);
> 
> In the specification the constant is called PAYLOAD_BLOCK_FULLY_PRESENT.
> Is s/FULLY/FULL/ intentional and can you match the spec for consistency?
>

That was unintentional, and yes I will change it to match the spec
naming.

> > +                bat_update = true;
> > +                /* since we just allocated a block, file_offset is the
> > +                 * beginning of the payload block. It needs to be the
> > +                 * write address, which includes the offset into the block */
> > +                sinfo.file_offset += sinfo.block_offset;
> > +                /* fall through */
> > +            case PAYLOAD_BLOCK_FULL_PRESENT:
> > +                /* if the file offset address is in the header zone,
> > +                 * there is a problem */
> > +                if (sinfo.file_offset < (1024*1024)) {
> > +                    ret = -EFAULT;
> > +                    goto exit;
> > +                }
> > +                /* block exists, so we can just overwrite it */
> > +                qemu_co_mutex_unlock(&s->lock);
> > +                ret = bdrv_co_writev(bs->file,
> > +                                    sinfo.file_offset>>BDRV_SECTOR_BITS,
> > +                                    sinfo.sectors_avail, &hd_qiov);
> > +                qemu_co_mutex_lock(&s->lock);
> > +                if (ret < 0) {
> > +                    goto exit;
> > +                }
> > +                break;
> > +            case PAYLOAD_BLOCK_PARTIALLY_PRESENT:
> > +                /* we don't yet support difference files, fall through
> > +                 * to error */
> > +            default:
> > +                ret = -EIO;
> > +                goto exit;
> > +                break;
> > +            }
> > +
> > +            if (bat_update) {
> 
> Data must be stable on disk before we can expose the updated BAT entry.
> Missing bdrv_co_flush().
> 

Good point, I will add that in for v7.

Thanks,  

Jeff

  reply	other threads:[~2013-10-01 13:55 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-09-25 21:02 [Qemu-devel] [PATCH v6 00/20] VHDX log replay and write support, .bdrv_create() Jeff Cody
2013-09-25 21:02 ` [Qemu-devel] [PATCH v6 01/20] block: vhdx - minor comments and typo correction Jeff Cody
2013-09-25 21:02 ` [Qemu-devel] [PATCH v6 02/20] block: vhdx - add header update capability Jeff Cody
2013-09-25 21:02 ` [Qemu-devel] [PATCH v6 03/20] block: vhdx code movement - VHDXMetadataEntries and BDRVVHDXState to header Jeff Cody
2013-09-25 21:02 ` [Qemu-devel] [PATCH v6 04/20] block: vhdx - log support struct and defines Jeff Cody
2013-09-25 21:02 ` [Qemu-devel] [PATCH v6 05/20] block: vhdx - break endian translation functions out Jeff Cody
2013-09-25 21:02 ` [Qemu-devel] [PATCH v6 06/20] block: vhdx - update log guid in header, and first write tracker Jeff Cody
2013-09-25 21:02 ` [Qemu-devel] [PATCH v6 07/20] block: vhdx code movement - move vhdx_close() above vhdx_open() Jeff Cody
2013-09-25 21:02 ` [Qemu-devel] [PATCH v6 08/20] block: vhdx - log parsing, replay, and flush support Jeff Cody
2013-10-01 11:31   ` Stefan Hajnoczi
2013-10-01 13:24     ` Jeff Cody
2013-10-02  8:57       ` Stefan Hajnoczi
2013-09-25 21:02 ` [Qemu-devel] [PATCH v6 09/20] block: vhdx - add region overlap detection for image files Jeff Cody
2013-10-01 11:42   ` Stefan Hajnoczi
2013-10-01 13:49     ` Jeff Cody
2013-09-25 21:02 ` [Qemu-devel] [PATCH v6 10/20] block: vhdx - add log write support Jeff Cody
2013-10-01 13:04   ` Stefan Hajnoczi
2013-10-01 13:26     ` Jeff Cody
2013-10-01 13:30   ` Stefan Hajnoczi
2013-09-25 21:02 ` [Qemu-devel] [PATCH v6 11/20] block: vhdx " Jeff Cody
2013-10-01 13:29   ` Stefan Hajnoczi
2013-10-01 13:55     ` Jeff Cody [this message]
2013-09-25 21:02 ` [Qemu-devel] [PATCH v6 12/20] block: vhdx - remove BAT file offset bit shifting Jeff Cody
2013-09-25 21:02 ` [Qemu-devel] [PATCH v6 13/20] block: vhdx - move more endian translations to vhdx-endian.c Jeff Cody
2013-10-01 13:35   ` Stefan Hajnoczi
2013-09-25 21:02 ` [Qemu-devel] [PATCH v6 14/20] block: vhdx - break out code operations to functions Jeff Cody
2013-09-25 21:03 ` [Qemu-devel] [PATCH v6 15/20] block: vhdx - fix comment typos in header, fix incorrect struct fields Jeff Cody
2013-09-25 21:03 ` [Qemu-devel] [PATCH v6 16/20] block: vhdx - add .bdrv_create() support Jeff Cody
2013-09-25 21:03 ` [Qemu-devel] [PATCH v6 17/20] block: qemu-iotests - add basic ability to use binary sample images Jeff Cody
2013-09-25 21:03 ` [Qemu-devel] [PATCH v6 18/20] block: qemu-iotests for vhdx, read sample dynamic image Jeff Cody
2013-09-27 12:58   ` Jeff Cody
2013-09-25 21:03 ` [Qemu-devel] [PATCH v6 19/20] block: vhdx - update _make_test_img() to filter out vhdx options Jeff Cody
2013-09-25 21:03 ` [Qemu-devel] [PATCH v6 20/20] block: qemu-iotests for vhdx, add write test support Jeff Cody
2013-09-27 12:55   ` Jeff Cody
2013-10-01 13:41 ` [Qemu-devel] [PATCH v6 00/20] VHDX log replay and write support, .bdrv_create() Stefan Hajnoczi
2013-10-01 14:15   ` Jeff Cody
2013-10-02  9:03     ` Stefan Hajnoczi

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20131001135517.GA18576@localhost.localdomain \
    --to=jcody@redhat.com \
    --cc=famz@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@gmail.com \
    --cc=stefanha@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.