* [PATCH] hbitmap: fix hbitmap_status() return value for first dirty bit case @ 2023-02-02 18:15 Andrey Zhadchenko via 2023-02-02 19:39 ` Eric Blake ` (2 more replies) 0 siblings, 3 replies; 6+ messages in thread From: Andrey Zhadchenko via @ 2023-02-02 18:15 UTC (permalink / raw) To: vsementsov; +Cc: hreitz, eblake, jsnow, qemu-block, qemu-devel The last return statement should return true, as we already evaluated that start == next_dirty Also, fix hbitmap_status() description in header Cc: qemu-stable@nongnu.org Fixes: a6426475a75 ("block/dirty-bitmap: introduce bdrv_dirty_bitmap_status()") Signed-off-by: Andrey Zhadchenko <andrey.zhadchenko@virtuozzo.com> --- include/qemu/hbitmap.h | 2 +- util/hbitmap.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/include/qemu/hbitmap.h b/include/qemu/hbitmap.h index af4e4ab746..8136e33674 100644 --- a/include/qemu/hbitmap.h +++ b/include/qemu/hbitmap.h @@ -330,7 +330,7 @@ bool hbitmap_next_dirty_area(const HBitmap *hb, int64_t start, int64_t end, int64_t *dirty_start, int64_t *dirty_count); /* - * bdrv_dirty_bitmap_status: + * hbitmap_status: * @hb: The HBitmap to operate on * @start: The bit to start from * @count: Number of bits to proceed diff --git a/util/hbitmap.c b/util/hbitmap.c index 297db35fb1..6d6e1b595d 100644 --- a/util/hbitmap.c +++ b/util/hbitmap.c @@ -331,7 +331,7 @@ bool hbitmap_status(const HBitmap *hb, int64_t start, int64_t count, assert(next_zero > start); *pnum = next_zero - start; - return false; + return true; } bool hbitmap_empty(const HBitmap *hb) -- 2.36.1 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH] hbitmap: fix hbitmap_status() return value for first dirty bit case 2023-02-02 18:15 [PATCH] hbitmap: fix hbitmap_status() return value for first dirty bit case Andrey Zhadchenko via @ 2023-02-02 19:39 ` Eric Blake 2023-02-03 10:55 ` Andrey Zhadchenko 2023-02-14 17:13 ` Vladimir Sementsov-Ogievskiy 2023-02-16 11:01 ` Kevin Wolf 2 siblings, 1 reply; 6+ messages in thread From: Eric Blake @ 2023-02-02 19:39 UTC (permalink / raw) To: Andrey Zhadchenko; +Cc: vsementsov, hreitz, jsnow, qemu-block, qemu-devel On Thu, Feb 02, 2023 at 09:15:23PM +0300, Andrey Zhadchenko via wrote: > The last return statement should return true, as we already evaluated that > start == next_dirty > > Also, fix hbitmap_status() description in header > > Cc: qemu-stable@nongnu.org > Fixes: a6426475a75 ("block/dirty-bitmap: introduce bdrv_dirty_bitmap_status()") > Signed-off-by: Andrey Zhadchenko <andrey.zhadchenko@virtuozzo.com> > --- > include/qemu/hbitmap.h | 2 +- > util/hbitmap.c | 2 +- > 2 files changed, 2 insertions(+), 2 deletions(-) Eww, nasty bug; looks like copy-before-write is the only curernt client of this interface. Reviewed-by: Eric Blake <eblake@redhat.com> Is there any way to enhance an iotest to add coverage for this code? -- Eric Blake, Principal Software Engineer Red Hat, Inc. +1-919-301-3266 Virtualization: qemu.org | libvirt.org ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] hbitmap: fix hbitmap_status() return value for first dirty bit case 2023-02-02 19:39 ` Eric Blake @ 2023-02-03 10:55 ` Andrey Zhadchenko 2023-02-03 11:22 ` Andrey Zhadchenko 0 siblings, 1 reply; 6+ messages in thread From: Andrey Zhadchenko @ 2023-02-03 10:55 UTC (permalink / raw) To: Eric Blake; +Cc: vsementsov, hreitz, jsnow, qemu-block, qemu-devel On 2/2/23 22:39, Eric Blake wrote: > On Thu, Feb 02, 2023 at 09:15:23PM +0300, Andrey Zhadchenko via wrote: >> The last return statement should return true, as we already evaluated that >> start == next_dirty >> >> Also, fix hbitmap_status() description in header >> >> Cc: qemu-stable@nongnu.org >> Fixes: a6426475a75 ("block/dirty-bitmap: introduce bdrv_dirty_bitmap_status()") >> Signed-off-by: Andrey Zhadchenko <andrey.zhadchenko@virtuozzo.com> >> --- >> include/qemu/hbitmap.h | 2 +- >> util/hbitmap.c | 2 +- >> 2 files changed, 2 insertions(+), 2 deletions(-) > > Eww, nasty bug; looks like copy-before-write is the only curernt > client of this interface. Also this only happens when copy-before-write is used in conjunction with snapshot-access (7.0+), so probably not many people is affected. > > Reviewed-by: Eric Blake <eblake@redhat.com> > > Is there any way to enhance an iotest to add coverage for this code? > Looks like yes. copy-before-write uses bcs bitmaps, which is 64k. So changing existing test diff --git a/tests/qemu-iotests/tests/image-fleecing b/tests/qemu-iotests/tests/image-fleecing index f6e449d071..7eda9a2c6b 100755 --- a/tests/qemu-iotests/tests/image-fleecing +++ b/tests/qemu-iotests/tests/image-fleecing @@ -34,23 +34,23 @@ iotests.script_initialize( unsupported_imgopts=['compat'] ) -patterns = [('0x5d', '0', '64k'), - ('0xd5', '1M', '64k'), - ('0xdc', '32M', '64k'), - ('0xcd', '0x3ff0000', '64k')] # 64M - 64K +patterns = [('0x5d', '0', '128k'), + ('0xd5', '1M', '128k'), + ('0xdc', '32M', '128k'), + ('0xcd', '0x3fe0000', '128k')] # 64M - 128K -overwrite = [('0xab', '0', '64k'), # Full overwrite - ('0xad', '0x00f8000', '64k'), # Partial-left (1M-32K) - ('0x1d', '0x2008000', '64k'), # Partial-right (32M+32K) - ('0xea', '0x3fe0000', '64k')] # Adjacent-left (64M - 128K) +overwrite = [('0xab', '0', '128k'), # Full overwrite + ('0xad', '0x00f0000', '128k'), # Partial-left (1M-64K) + ('0x1d', '0x2010000', '128k'), # Partial-right (32M+64K) + ('0xea', '0x3fc0000', '128k')] # Adjacent-left (64M - 256K) -zeroes = [('0', '0x00f8000', '32k'), # Left-end of partial-left (1M-32K) - ('0', '0x2010000', '32k'), # Right-end of partial-right (32M+64K) - ('0', '0x3fe0000', '64k')] # overwrite[3] +zeroes = [('0', '0x00f0000', '64k'), # Left-end of partial-left (1M-64K) + ('0', '0x2020000', '64k'), # Right-end of partial-right (32M+128K) + ('0', '0x3fc0000', '128k')] # overwrite[3] -remainder = [('0xd5', '0x108000', '32k'), # Right-end of partial-left [1] - ('0xdc', '32M', '32k'), # Left-end of partial-right [2] - ('0xcd', '0x3ff0000', '64k')] # patterns[3] +remainder = [('0xd5', '0x110000', '64k'), # Right-end of partial-left [1] + ('0xdc', '32M', '64k'), # Left-end of partial-right [2] + ('0xcd', '0x3fe0000', '128k')] # patterns[3] def do_test(vm, use_cbw, use_snapshot_access_filter, base_img_path, fleece_img_path, nbd_sock_path=None, From 64k chunks to 128k chunks (so at the read moment we have N bit dirty and N+1 clean) produces the following for one of NBD test cases: --- Setting up NBD Export --- {"return": {}} {"return": {}} --- Sanity Check --- read -P0x5d 0 128k read -P0xd5 1M 128k read -P0xdc 32M 128k read -P0xcd 0x3fe0000 128k read -P0 0x00f0000 64k read failed: Invalid argument read -P0 0x2020000 64k read failed: Invalid argument read -P0 0x3fc0000 128k read failed: Invalid argument I am not good at qemi-io tool, I guess that EINVAL in that case means qemu-io found out that image data does not follow requested pattern? Also this does not trigger for non-nbd tests since backup job is probably copying one cluster at a time. ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH] hbitmap: fix hbitmap_status() return value for first dirty bit case 2023-02-03 10:55 ` Andrey Zhadchenko @ 2023-02-03 11:22 ` Andrey Zhadchenko 0 siblings, 0 replies; 6+ messages in thread From: Andrey Zhadchenko @ 2023-02-03 11:22 UTC (permalink / raw) To: Eric Blake; +Cc: vsementsov, hreitz, jsnow, qemu-block, qemu-devel On 2/3/23 13:55, Andrey Zhadchenko wrote: > > On 2/2/23 22:39, Eric Blake wrote: >> On Thu, Feb 02, 2023 at 09:15:23PM +0300, Andrey Zhadchenko via wrote: >>> The last return statement should return true, as we already evaluated >>> that >>> start == next_dirty >>> >>> Also, fix hbitmap_status() description in header >>> >>> Cc: qemu-stable@nongnu.org >>> Fixes: a6426475a75 ("block/dirty-bitmap: introduce >>> bdrv_dirty_bitmap_status()") >>> Signed-off-by: Andrey Zhadchenko <andrey.zhadchenko@virtuozzo.com> >>> --- >>> include/qemu/hbitmap.h | 2 +- >>> util/hbitmap.c | 2 +- >>> 2 files changed, 2 insertions(+), 2 deletions(-) >> >> Eww, nasty bug; looks like copy-before-write is the only curernt >> client of this interface. > Also this only happens when copy-before-write is used in conjunction > with snapshot-access (7.0+), so probably not many people is affected. > >> >> Reviewed-by: Eric Blake <eblake@redhat.com> >> >> Is there any way to enhance an iotest to add coverage for this code? >> > Looks like yes. copy-before-write uses bcs bitmaps, which is 64k. > So changing existing test > > diff --git a/tests/qemu-iotests/tests/image-fleecing > b/tests/qemu-iotests/tests/image-fleecing > index f6e449d071..7eda9a2c6b 100755 > --- a/tests/qemu-iotests/tests/image-fleecing > +++ b/tests/qemu-iotests/tests/image-fleecing > @@ -34,23 +34,23 @@ iotests.script_initialize( > unsupported_imgopts=['compat'] > ) > > -patterns = [('0x5d', '0', '64k'), > - ('0xd5', '1M', '64k'), > - ('0xdc', '32M', '64k'), > - ('0xcd', '0x3ff0000', '64k')] # 64M - 64K > +patterns = [('0x5d', '0', '128k'), > + ('0xd5', '1M', '128k'), > + ('0xdc', '32M', '128k'), > + ('0xcd', '0x3fe0000', '128k')] # 64M - 128K > > -overwrite = [('0xab', '0', '64k'), # Full overwrite > - ('0xad', '0x00f8000', '64k'), # Partial-left (1M-32K) > - ('0x1d', '0x2008000', '64k'), # Partial-right (32M+32K) > - ('0xea', '0x3fe0000', '64k')] # Adjacent-left (64M - 128K) > +overwrite = [('0xab', '0', '128k'), # Full overwrite > + ('0xad', '0x00f0000', '128k'), # Partial-left (1M-64K) > + ('0x1d', '0x2010000', '128k'), # Partial-right (32M+64K) > + ('0xea', '0x3fc0000', '128k')] # Adjacent-left (64M - 256K) > > -zeroes = [('0', '0x00f8000', '32k'), # Left-end of partial-left (1M-32K) > - ('0', '0x2010000', '32k'), # Right-end of partial-right > (32M+64K) > - ('0', '0x3fe0000', '64k')] # overwrite[3] > +zeroes = [('0', '0x00f0000', '64k'), # Left-end of partial-left (1M-64K) > + ('0', '0x2020000', '64k'), # Right-end of partial-right > (32M+128K) > + ('0', '0x3fc0000', '128k')] # overwrite[3] > > -remainder = [('0xd5', '0x108000', '32k'), # Right-end of partial-left [1] > - ('0xdc', '32M', '32k'), # Left-end of partial-right [2] > - ('0xcd', '0x3ff0000', '64k')] # patterns[3] > +remainder = [('0xd5', '0x110000', '64k'), # Right-end of partial-left [1] > + ('0xdc', '32M', '64k'), # Left-end of partial-right [2] > + ('0xcd', '0x3fe0000', '128k')] # patterns[3] > > def do_test(vm, use_cbw, use_snapshot_access_filter, base_img_path, > fleece_img_path, nbd_sock_path=None, > > > From 64k chunks to 128k chunks (so at the read moment we have N bit > dirty and N+1 clean) produces the following for one of NBD test cases: > > --- Setting up NBD Export --- > > {"return": {}} > {"return": {}} > > --- Sanity Check --- > > read -P0x5d 0 128k > read -P0xd5 1M 128k > read -P0xdc 32M 128k > read -P0xcd 0x3fe0000 128k > read -P0 0x00f0000 64k > read failed: Invalid argument > > read -P0 0x2020000 64k > read failed: Invalid argument > > read -P0 0x3fc0000 128k > read failed: Invalid argument > > > I am not good at qemi-io tool, I guess that EINVAL in that case means > qemu-io found out that image data does not follow requested pattern? > > Also this does not trigger for non-nbd tests since backup job is > probably copying one cluster at a time. Please disregard this. This EINVALs are somewhat anticipated as they are also present in expected example image-fleecing.out (and applying my patch doesn't get rid of them) I should think more about possible test cases ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] hbitmap: fix hbitmap_status() return value for first dirty bit case 2023-02-02 18:15 [PATCH] hbitmap: fix hbitmap_status() return value for first dirty bit case Andrey Zhadchenko via 2023-02-02 19:39 ` Eric Blake @ 2023-02-14 17:13 ` Vladimir Sementsov-Ogievskiy 2023-02-16 11:01 ` Kevin Wolf 2 siblings, 0 replies; 6+ messages in thread From: Vladimir Sementsov-Ogievskiy @ 2023-02-14 17:13 UTC (permalink / raw) To: Andrey Zhadchenko Cc: hreitz, eblake, jsnow, qemu-block, qemu-devel, Kevin Wolf On 02.02.23 21:15, Andrey Zhadchenko via wrote: > The last return statement should return true, as we already evaluated that > start == next_dirty > > Also, fix hbitmap_status() description in header > > Cc: qemu-stable@nongnu.org > Fixes: a6426475a75 ("block/dirty-bitmap: introduce bdrv_dirty_bitmap_status()") Ohh :/ > Signed-off-by: Andrey Zhadchenko <andrey.zhadchenko@virtuozzo.com> Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru> > --- > include/qemu/hbitmap.h | 2 +- > util/hbitmap.c | 2 +- > 2 files changed, 2 insertions(+), 2 deletions(-) > > diff --git a/include/qemu/hbitmap.h b/include/qemu/hbitmap.h > index af4e4ab746..8136e33674 100644 > --- a/include/qemu/hbitmap.h > +++ b/include/qemu/hbitmap.h > @@ -330,7 +330,7 @@ bool hbitmap_next_dirty_area(const HBitmap *hb, int64_t start, int64_t end, > int64_t *dirty_start, int64_t *dirty_count); > > /* > - * bdrv_dirty_bitmap_status: > + * hbitmap_status: > * @hb: The HBitmap to operate on > * @start: The bit to start from > * @count: Number of bits to proceed > diff --git a/util/hbitmap.c b/util/hbitmap.c > index 297db35fb1..6d6e1b595d 100644 > --- a/util/hbitmap.c > +++ b/util/hbitmap.c > @@ -331,7 +331,7 @@ bool hbitmap_status(const HBitmap *hb, int64_t start, int64_t count, > > assert(next_zero > start); > *pnum = next_zero - start; > - return false; > + return true; > } > > bool hbitmap_empty(const HBitmap *hb) -- Best regards, Vladimir ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] hbitmap: fix hbitmap_status() return value for first dirty bit case 2023-02-02 18:15 [PATCH] hbitmap: fix hbitmap_status() return value for first dirty bit case Andrey Zhadchenko via 2023-02-02 19:39 ` Eric Blake 2023-02-14 17:13 ` Vladimir Sementsov-Ogievskiy @ 2023-02-16 11:01 ` Kevin Wolf 2 siblings, 0 replies; 6+ messages in thread From: Kevin Wolf @ 2023-02-16 11:01 UTC (permalink / raw) To: Andrey Zhadchenko Cc: vsementsov, hreitz, eblake, jsnow, qemu-block, qemu-devel Am 02.02.2023 um 19:15 hat Andrey Zhadchenko via geschrieben: > The last return statement should return true, as we already evaluated that > start == next_dirty > > Also, fix hbitmap_status() description in header > > Cc: qemu-stable@nongnu.org > Fixes: a6426475a75 ("block/dirty-bitmap: introduce bdrv_dirty_bitmap_status()") > Signed-off-by: Andrey Zhadchenko <andrey.zhadchenko@virtuozzo.com> Thanks, applied to the block branch. Kevin ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2023-02-16 11:01 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2023-02-02 18:15 [PATCH] hbitmap: fix hbitmap_status() return value for first dirty bit case Andrey Zhadchenko via 2023-02-02 19:39 ` Eric Blake 2023-02-03 10:55 ` Andrey Zhadchenko 2023-02-03 11:22 ` Andrey Zhadchenko 2023-02-14 17:13 ` Vladimir Sementsov-Ogievskiy 2023-02-16 11:01 ` Kevin Wolf
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).