hw/block/block.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
The following expression is incorrect because blk_pread_nonzeroes()
deals in units of bytes, not sectors:
bytes = MIN(size - offset, BDRV_REQUEST_MAX_SECTORS)
^^^^^^^
BDRV_REQUEST_MAX_BYTES is the appropriate constant.
Fixes: a4b15a8b9ef2 ("pflash: Only read non-zero parts of backend image")
Cc: Xiang Zheng <zhengxiang9@huawei.com>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
---
hw/block/block.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/hw/block/block.c b/hw/block/block.c
index 9f52ee6e72..ff503002aa 100644
--- a/hw/block/block.c
+++ b/hw/block/block.c
@@ -30,7 +30,7 @@ static int blk_pread_nonzeroes(BlockBackend *blk, hwaddr size, void *buf)
BlockDriverState *bs = blk_bs(blk);
for (;;) {
- bytes = MIN(size - offset, BDRV_REQUEST_MAX_SECTORS);
+ bytes = MIN(size - offset, BDRV_REQUEST_MAX_BYTES);
if (bytes <= 0) {
return 0;
}
--
2.43.0
30.01.2024 03:27, Stefan Hajnoczi wrote: > The following expression is incorrect because blk_pread_nonzeroes() > deals in units of bytes, not sectors: > > bytes = MIN(size - offset, BDRV_REQUEST_MAX_SECTORS) > ^^^^^^^ > > BDRV_REQUEST_MAX_BYTES is the appropriate constant. > > Fixes: a4b15a8b9ef2 ("pflash: Only read non-zero parts of backend image") > Cc: Xiang Zheng <zhengxiang9@huawei.com> > Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> > --- > hw/block/block.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/hw/block/block.c b/hw/block/block.c > index 9f52ee6e72..ff503002aa 100644 > --- a/hw/block/block.c > +++ b/hw/block/block.c > @@ -30,7 +30,7 @@ static int blk_pread_nonzeroes(BlockBackend *blk, hwaddr size, void *buf) > BlockDriverState *bs = blk_bs(blk); > > for (;;) { > - bytes = MIN(size - offset, BDRV_REQUEST_MAX_SECTORS); > + bytes = MIN(size - offset, BDRV_REQUEST_MAX_BYTES); Hmm. This smells like a -stable material, but you know better not to Cc: qemu-stable@ for unrelated stuff... Is it not for stable? Thanks, /mjt
On Thu, 1 Feb 2024 at 06:37, Michael Tokarev <mjt@tls.msk.ru> wrote: > > 30.01.2024 03:27, Stefan Hajnoczi wrote: > > The following expression is incorrect because blk_pread_nonzeroes() > > deals in units of bytes, not sectors: > > > > bytes = MIN(size - offset, BDRV_REQUEST_MAX_SECTORS) > > ^^^^^^^ > > > > BDRV_REQUEST_MAX_BYTES is the appropriate constant. > > > > Fixes: a4b15a8b9ef2 ("pflash: Only read non-zero parts of backend image") > > Cc: Xiang Zheng <zhengxiang9@huawei.com> > > Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> > > --- > > hw/block/block.c | 2 +- > > 1 file changed, 1 insertion(+), 1 deletion(-) > > > > diff --git a/hw/block/block.c b/hw/block/block.c > > index 9f52ee6e72..ff503002aa 100644 > > --- a/hw/block/block.c > > +++ b/hw/block/block.c > > @@ -30,7 +30,7 @@ static int blk_pread_nonzeroes(BlockBackend *blk, hwaddr size, void *buf) > > BlockDriverState *bs = blk_bs(blk); > > > > for (;;) { > > - bytes = MIN(size - offset, BDRV_REQUEST_MAX_SECTORS); > > + bytes = MIN(size - offset, BDRV_REQUEST_MAX_BYTES); > > Hmm. This smells like a -stable material, but you know better not > to Cc: qemu-stable@ for unrelated stuff... Is it not for stable? This is not a user-visible bug. The code still works with the smaller MAX_SECTORS value thanks to the loop. It doesn't hurt to include it in -stable but I also think it doesn't help :-). It's just an inconsistency in the code. Stefan
09.02.2024 00:21, Stefan Hajnoczi wrote: > On Thu, 1 Feb 2024 at 06:37, Michael Tokarev <mjt@tls.msk.ru> wrote: >>> for (;;) { >>> - bytes = MIN(size - offset, BDRV_REQUEST_MAX_SECTORS); >>> + bytes = MIN(size - offset, BDRV_REQUEST_MAX_BYTES); >> >> Hmm. This smells like a -stable material, but you know better not >> to Cc: qemu-stable@ for unrelated stuff... Is it not for stable? > > This is not a user-visible bug. The code still works with the smaller > MAX_SECTORS value thanks to the loop. Yeah, that's my thoughts exactly. Also, most of the time, the cap will be `size' anyway, not MAX. Still thought I'd ask :) Thank you for the confirmation! /mjt > It doesn't hurt to include it in -stable but I also think it doesn't > help :-). It's just an inconsistency in the code.
On Mon, Jan 29, 2024 at 07:27:12PM -0500, Stefan Hajnoczi wrote: > The following expression is incorrect because blk_pread_nonzeroes() > deals in units of bytes, not sectors: > > bytes = MIN(size - offset, BDRV_REQUEST_MAX_SECTORS) > ^^^^^^^ > > BDRV_REQUEST_MAX_BYTES is the appropriate constant. > > Fixes: a4b15a8b9ef2 ("pflash: Only read non-zero parts of backend image") > Cc: Xiang Zheng <zhengxiang9@huawei.com> > Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> > --- > hw/block/block.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) Thanks, applied to my block tree: https://gitlab.com/stefanha/qemu/commits/block Stefan
On 30/1/24 01:27, Stefan Hajnoczi wrote: > The following expression is incorrect because blk_pread_nonzeroes() > deals in units of bytes, not sectors: > > bytes = MIN(size - offset, BDRV_REQUEST_MAX_SECTORS) > ^^^^^^^ > > BDRV_REQUEST_MAX_BYTES is the appropriate constant. > > Fixes: a4b15a8b9ef2 ("pflash: Only read non-zero parts of backend image") > Cc: Xiang Zheng <zhengxiang9@huawei.com> > Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> > --- > hw/block/block.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/hw/block/block.c b/hw/block/block.c > index 9f52ee6e72..ff503002aa 100644 > --- a/hw/block/block.c > +++ b/hw/block/block.c > @@ -30,7 +30,7 @@ static int blk_pread_nonzeroes(BlockBackend *blk, hwaddr size, void *buf) > BlockDriverState *bs = blk_bs(blk); > > for (;;) { > - bytes = MIN(size - offset, BDRV_REQUEST_MAX_SECTORS); > + bytes = MIN(size - offset, BDRV_REQUEST_MAX_BYTES); > if (bytes <= 0) { > return 0; > } Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
© 2016 - 2024 Red Hat, Inc.