From: Kevin Wolf <kwolf@redhat.com>
To: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Cc: jsnow@redhat.com, qemu-devel@nongnu.org, qemu-block@nongnu.org,
mreitz@redhat.com
Subject: Re: [PATCH v2 3/4] mirror: Make sure that source and target size match
Date: Tue, 12 May 2020 20:48:04 +0200 [thread overview]
Message-ID: <20200512184804.GL5951@linux.fritz.box> (raw)
In-Reply-To: <cbeba850-5c46-e946-596a-c8f33140b898@virtuozzo.com>
Am 12.05.2020 um 19:15 hat Vladimir Sementsov-Ogievskiy geschrieben:
> 11.05.2020 16:58, Kevin Wolf wrote:
> > If the target is shorter than the source, mirror would copy data until
> > it reaches the end of the target and then fail with an I/O error when
> > trying to write past the end.
> >
> > If the target is longer than the source, the mirror job would complete
> > successfully, but the target wouldn't actually be an accurate copy of
> > the source image (it would contain some additional garbage at the end).
> >
> > Fix this by checking that both images have the same size when the job
> > starts.
> >
> > Signed-off-by: Kevin Wolf <kwolf@redhat.com>
> > Message-Id: <20200507145228.323412-3-kwolf@redhat.com>
> > Reviewed-by: Eric Blake <eblake@redhat.com>
> > Signed-off-by: Kevin Wolf <kwolf@redhat.com>
> > ---
> > block/mirror.c | 21 ++++++++++++---------
> > 1 file changed, 12 insertions(+), 9 deletions(-)
> >
> > diff --git a/block/mirror.c b/block/mirror.c
> > index aca95c9bc9..201ffa26f9 100644
> > --- a/block/mirror.c
> > +++ b/block/mirror.c
> > @@ -872,6 +872,7 @@ static int coroutine_fn mirror_run(Job *job, Error **errp)
> > BlockDriverState *target_bs = blk_bs(s->target);
> > bool need_drain = true;
> > int64_t length;
> > + int64_t target_length;
> > BlockDriverInfo bdi;
> > char backing_filename[2]; /* we only need 2 characters because we are only
> > checking for a NULL string */
> > @@ -887,24 +888,26 @@ static int coroutine_fn mirror_run(Job *job, Error **errp)
> > goto immediate_exit;
> > }
> > + target_length = blk_getlength(s->target);
> > + if (target_length < 0) {
> > + ret = target_length;
> > + goto immediate_exit;
> > + }
> > +
> > /* Active commit must resize the base image if its size differs from the
> > * active layer. */
> > if (s->base == blk_bs(s->target)) {
> > - int64_t base_length;
> > -
> > - base_length = blk_getlength(s->target);
> > - if (base_length < 0) {
> > - ret = base_length;
> > - goto immediate_exit;
> > - }
> > -
> > - if (s->bdev_length > base_length) {
> > + if (s->bdev_length > target_length) {
> > ret = blk_truncate(s->target, s->bdev_length, false,
> > PREALLOC_MODE_OFF, 0, NULL);
> > if (ret < 0) {
> > goto immediate_exit;
> > }
> > }
>
> Hmm, interesting, if base is larger, is our behavior correct? Blockdev
> becomes larger after commit and old data becomes available? I think we
> should zero the tail after old EOF or shrink the target..
Yes, I agree, we should shrink it. But active commit is a different case
than what I'm fixing in this patch, so I left it unmodified. We'll
probably need a third series for commit after backup and mirror.
> > + } else if (s->bdev_length != target_length) {
> > + error_setg(errp, "Source and target image have different sizes");
> > + ret = -EINVAL;
>
> Seems, the only case, when mirror_run() sets errp. And, therefore, the
> only correct one..
job_update_rc() takes care to fill job->err (with strerror()) if it
hasn't been set yet, so the other places aren't strictly wrong, but
probably provide suboptimal error messages.
Kevin
next prev parent reply other threads:[~2020-05-12 18:51 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-05-11 13:58 [PATCH v2 0/4] mirror: Make sure that source and target size match Kevin Wolf
2020-05-11 13:58 ` [PATCH v2 1/4] iotests/109: Don't mirror with mismatched size Kevin Wolf
2020-05-11 15:08 ` Max Reitz
2020-05-11 15:29 ` Kevin Wolf
2020-05-11 15:37 ` Max Reitz
2020-05-12 15:00 ` Vladimir Sementsov-Ogievskiy
2020-05-11 13:58 ` [PATCH v2 2/4] iotests/229: Use blkdebug to inject an error Kevin Wolf
2020-05-11 15:18 ` Max Reitz
2020-05-11 15:33 ` Kevin Wolf
2020-05-12 15:54 ` Vladimir Sementsov-Ogievskiy
2020-05-11 13:58 ` [PATCH v2 3/4] mirror: Make sure that source and target size match Kevin Wolf
2020-05-11 15:32 ` Max Reitz
2020-05-12 17:15 ` Vladimir Sementsov-Ogievskiy
2020-05-12 17:16 ` Vladimir Sementsov-Ogievskiy
2020-05-12 18:48 ` Kevin Wolf [this message]
2020-05-13 10:44 ` Vladimir Sementsov-Ogievskiy
2020-05-11 13:58 ` [PATCH v2 4/4] iotests: Mirror with different source/target size Kevin Wolf
2020-05-11 15:42 ` Max Reitz
2020-05-13 11:17 ` Vladimir Sementsov-Ogievskiy
2020-05-13 14:21 ` Kevin Wolf
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=20200512184804.GL5951@linux.fritz.box \
--to=kwolf@redhat.com \
--cc=jsnow@redhat.com \
--cc=mreitz@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=vsementsov@virtuozzo.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).