On Mon, Jun 11, 2018 at 7:20 PM Kevin Wolf <kw...@redhat.com> wrote:

> Am 11.06.2018 um 12:43 hat Nir Soffer geschrieben:
> > On Mon, Jun 11, 2018 at 1:03 PM Maor Lipchuk <mlipc...@redhat.com>
> wrote:
> >
> > > On Tue, Jun 5, 2018 at 9:40 AM, Dan Kenigsberg <dan...@redhat.com>
> wrote:
> > >
> > >> On Mon, Jun 4, 2018 at 7:14 PM, Nir Soffer <nsof...@redhat.com>
> wrote:
> > >> > On Mon, Jun 4, 2018 at 6:56 PM Dan Kenigsberg <dan...@redhat.com>
> > >> wrote:
> > >> >>
> > >> >> On Tue, May 8, 2018 at 11:59 AM, Nir Soffer <nsof...@redhat.com>
> > >> wrote:
> > >> >> > There are several issues:
> > >> >> >
> > >> >> > 1. coverage fail after this patch:
> > >> >> >
> > >> >> >
> > >>
> https://github.com/oVirt/vdsm/commit/6b905c2c134bcf344961d28eefbd05f2838d2ec8
> > >> >> >
> > >> >> > https://travis-ci.org/oVirt/vdsm/builds/366574414
> > >> >> > ...
> > >> >> > pwd
> > >> >> > /vdsm/tests
> > >> >> > ls .cov*
> > >> >> > ls: cannot access .cov*: No such file or directory
> > >> >> > make[1]: *** [check] Error 2
> > >> >> > make[1]: Leaving directory `/vdsm/tests'
> > >> >>
> > >> >> That was me, sorry. This should solve it:
> > >> >> https://gerrit.ovirt.org/#/c/91925/
> > >> >
> > >> > Thanks!
> > >> >
> > >> >> BTW, on my fc28 I see TestCountClusters.test_multiple_blocks
> failing
> > >> with
> > >> >>
> > >> >> E           Error: Command ['/usr/bin/qemu-img', 'map', '--output',
> > >> >> 'json', '/var/tmp/vdsm/test_multiple_blocks0/test'] failed with
> rc=-6
> > >> >> out='' err="qemu-img:
> > >> >> /builddir/build/BUILD/qemu-2.12.0-rc1/qemu-img.c:2680:
> > >> >> get_block_status: Assertion `bytes' failed.\n"
> > >> >>
> > >> >> Any idea what's that?
> > >> >
> > >> >
> > >> > Looks like qemu-img bug.
> > >> >
> > >> > Can you file a qemu-img bug?
> > >>
> > >> I hope Maor can translate the test to qemu-img speak.
> > >>
> > >
> > > Opened the following bug:
> > >   https://bugzilla.redhat.com/1589738
> > >
> >
> > Adding qemu-block
>
> It's related to the unaligned image size.


Right, I think we forgot the -1 in the test setup:

    f.seek(16 * 1024 - 1)
    f.write(b"x")

But it is good that we made this error :-)


> Correct image files should be
> aligned to 512 byte sectors, so something is wrong with your image to
> start with (hard disks don't have half sectors).
>

Right. We indeed forbid uploads on unaligned images in the UI.

But we found that qemu-img creates unaligned images:

$ qemu-img create -f qcow2 empty.raw 10g
Formatting 'empty.raw', fmt=qcow2 size=10737418240 cluster_size=65536
lazy_refcounts=off refcount_bits=16

$ ls -l empty.raw
-rw-r--r--. 1 nsoffer nsoffer 196768 Jun 12 01:59 empty.raw

$ python -c "print 196768 % 512"
160

$ qemu-img map -f raw --output json test.raw
[{ "start": 0, "length": 4096, "depth": 0, "zero": false, "data": true,
"offset": 0},
{ "start": 4096, "length": 12288, "depth": 0, "zero": true, "data": false,
"offset": 4096},
{ "start": 16384, "length": 4096, "depth": 0, "zero": false, "data": true,
"offset": 16384},
qemu-img: /builddir/build/BUILD/qemu-2.12.0-rc1/qemu-img.c:2680:
get_block_status: Assertion `bytes' failed.
Aborted (core dumped)

The image becomes aligned once you write anything into it, but I still find
it
strange that qemu-img create such files. Shouldn't it create always 3
complete
clusters?


>
> Anyway, git bisects points to this one:
>
> a290f085901b528265787cd27ebda19c970be4ee is the first bad commit
> commit a290f085901b528265787cd27ebda19c970be4ee
> Author: Eric Blake <ebl...@redhat.com>
> Date:   Tue Feb 13 14:26:44 2018 -0600
>
>     file-posix: Switch to .bdrv_co_block_status()
>
>     We are gradually moving away from sector-based interfaces, towards
>     byte-based.  Update the file protocol driver accordingly.
>
>     In want_zero mode, we continue to report fine-grained hole
>     information (the caller wants as much mapping detail as possible);
>     but when not in that mode, the caller prefers larger *pnum and
>     merely cares about what offsets are allocated at this layer, rather
>     than where the holes live.  Since holes still read as zeroes at
>     this layer (rather than deferring to a backing layer), we can take
>     the shortcut of skipping lseek(), and merely state that all bytes
>     are allocated.
>
>     We can also drop redundant bounds checks that are already
>     guaranteed by the block layer.
>
>     Signed-off-by: Eric Blake <ebl...@redhat.com>
>     Reviewed-by: Vladimir Sementsov-Ogievskiy <vsement...@virtuozzo.com>
>     Reviewed-by: Fam Zheng <f...@redhat.com>
>     Signed-off-by: Kevin Wolf <kw...@redhat.com>
>
> I think the problem is a bit higher up the call stack, but I'm not
> completely sure yet. It manifests in img_map(), in this code:
>
>         while (curr.start + curr.length < length) {
>             ...
>             n = QEMU_ALIGN_DOWN(MIN(1 << 30, length - offset),
> BDRV_SECTOR_SIZE);
>             ret = get_block_status(bs, offset, n, &next);
>
> The loop condition is still true because a single byte is left to be
> processed, but n is aligned down to 0. I'm not sure why the
> QEMU_ALIGN_DOWN() is even there.
>
> Eric, would just removing the QEMU_ALIGN_DOWN() be correct?
>
> Kevin
>

Reply via email to