Re: [PATCH 01/18] block: Make blk_{pread, pwrite}() return 0 on success

2022-07-04 Thread Alberto Faria
On Mon, Jul 4, 2022 at 2:52 PM Hanna Reitz  wrote:
> There are a couple of places where you decided to replace “*len”
> variables that used to store the return value by a plain “ret”. That
> seems good to me, given how these functions no longer return length
> values, but you haven’t done so consistently.  Below, I have noted
> places where this wasn’t done; I wonder why, but my R-b stands
> regardless of whether you change them too or not.

Thanks, this was just an oversight on my part. I'll fix it.

> > diff --git a/qemu-img.c b/qemu-img.c
> > index 4cf4d2423d..9d98ef63ac 100644
> > --- a/qemu-img.c
> > +++ b/qemu-img.c
> > @@ -5120,30 +5120,27 @@ static int img_dd(int argc, char **argv)
> >   in.buf = g_new(uint8_t, in.bsz);
> >
> >   for (out_pos = 0; in_pos < size; block_count++) {
> > -int in_ret, out_ret;
> > +int bytes, in_ret, out_ret;
> >
> > -if (in_pos + in.bsz > size) {
> > -in_ret = blk_pread(blk1, in_pos, in.buf, size - in_pos);
> > -} else {
> > -in_ret = blk_pread(blk1, in_pos, in.buf, in.bsz);
> > -}
> > +bytes = (in_pos + in.bsz > size) ? size - in_pos : in.bsz;
> > +
> > +in_ret = blk_pread(blk1, in_pos, in.buf, bytes);
> >   if (in_ret < 0) {
> >   error_report("error while reading from input image file: %s",
> >strerror(-in_ret));
> >   ret = -1;
> >   goto out;
> >   }
> > -in_pos += in_ret;
> > -
> > -out_ret = blk_pwrite(blk2, out_pos, in.buf, in_ret, 0);
> > +in_pos += bytes;
> >
> > +out_ret = blk_pwrite(blk2, out_pos, in.buf, bytes, 0);
> >   if (out_ret < 0) {
> >   error_report("error while writing to output image file: %s",
> >strerror(-out_ret));
> >   ret = -1;
> >   goto out;
> >   }
> > -out_pos += out_ret;
> > +out_pos += bytes;
> >   }
> >
> >   out:
>
> We could use this opportunity to drop in_ret and out_ret altogether (but
> we can also decide not to).

Dropping them sounds good to me.

Alberto




Re: [PATCH 01/18] block: Make blk_{pread,pwrite}() return 0 on success

2022-07-04 Thread Hanna Reitz

On 17.05.22 13:35, Alberto Faria wrote:

They currently return the value of their 'bytes' parameter on success.

Make them return 0 instead, for consistency with other I/O functions and
in preparation to implement them using generated_co_wrapper. This also
makes it clear that short reads/writes are not possible.

Signed-off-by: Alberto Faria 
---
  block.c  |  8 +---
  block/block-backend.c|  7 ++-
  block/qcow.c |  6 +++---
  hw/block/m25p80.c|  2 +-
  hw/misc/mac_via.c|  2 +-
  hw/misc/sifive_u_otp.c   |  2 +-
  hw/nvram/eeprom_at24c.c  |  4 ++--
  hw/nvram/spapr_nvram.c   | 12 ++--
  hw/ppc/pnv_pnor.c|  2 +-
  qemu-img.c   | 17 +++--
  qemu-io-cmds.c   | 18 --
  tests/unit/test-block-iothread.c |  4 ++--
  12 files changed, 43 insertions(+), 41 deletions(-)


Overall, looks good to me, so first of all:

Reviewed-by: Hanna Reitz 

There are a couple of places where you decided to replace “*len” 
variables that used to store the return value by a plain “ret”. That 
seems good to me, given how these functions no longer return length 
values, but you haven’t done so consistently.  Below, I have noted 
places where this wasn’t done; I wonder why, but my R-b stands 
regardless of whether you change them too or not.


[...]


diff --git a/hw/misc/mac_via.c b/hw/misc/mac_via.c
index 525e38ce93..0515d1818e 100644
--- a/hw/misc/mac_via.c
+++ b/hw/misc/mac_via.c
@@ -1030,7 +1030,7 @@ static void mos6522_q800_via1_realize(DeviceState *dev, 
Error **errp)
  }
  
  len = blk_pread(v1s->blk, 0, v1s->PRAM, sizeof(v1s->PRAM));

-if (len != sizeof(v1s->PRAM)) {
+if (len < 0) {


We could use `ret` here instead.


  error_setg(errp, "can't read PRAM contents");
  return;
  }


[...]


diff --git a/hw/nvram/eeprom_at24c.c b/hw/nvram/eeprom_at24c.c
index 01a3093600..84acd71f5a 100644
--- a/hw/nvram/eeprom_at24c.c
+++ b/hw/nvram/eeprom_at24c.c
@@ -65,7 +65,7 @@ int at24c_eeprom_event(I2CSlave *s, enum i2c_event event)
  DPRINTK("clear\n");
  if (ee->blk && ee->changed) {
  int len = blk_pwrite(ee->blk, 0, ee->mem, ee->rsize, 0);
-if (len != ee->rsize) {
+if (len < 0) {
  ERR(TYPE_AT24C_EE
  " : failed to write backing file\n");
  }
@@ -165,7 +165,7 @@ void at24c_eeprom_reset(DeviceState *state)
  if (ee->blk) {
  int len = blk_pread(ee->blk, 0, ee->mem, ee->rsize);
  
-if (len != ee->rsize) {

+if (len < 0) {


We could rename `len` to `ret` in both of these hunks.


  ERR(TYPE_AT24C_EE
  " : Failed initial sync with backing file\n");
  }
diff --git a/hw/nvram/spapr_nvram.c b/hw/nvram/spapr_nvram.c
index 18b43be7f6..6000b945c3 100644
--- a/hw/nvram/spapr_nvram.c
+++ b/hw/nvram/spapr_nvram.c


[...]


@@ -181,7 +181,7 @@ static void spapr_nvram_realize(SpaprVioDevice *dev, Error 
**errp)
  if (nvram->blk) {
  int alen = blk_pread(nvram->blk, 0, nvram->buf, nvram->size);
  
-if (alen != nvram->size) {

+if (alen < 0) {


As above (and the other case in this file), might be nice to drop `alen` 
here and just use `ret` instead.



  error_setg(errp, "can't read spapr-nvram contents");
  return;
  }


[...]


diff --git a/qemu-img.c b/qemu-img.c
index 4cf4d2423d..9d98ef63ac 100644
--- a/qemu-img.c
+++ b/qemu-img.c
@@ -5120,30 +5120,27 @@ static int img_dd(int argc, char **argv)
  in.buf = g_new(uint8_t, in.bsz);
  
  for (out_pos = 0; in_pos < size; block_count++) {

-int in_ret, out_ret;
+int bytes, in_ret, out_ret;
  
-if (in_pos + in.bsz > size) {

-in_ret = blk_pread(blk1, in_pos, in.buf, size - in_pos);
-} else {
-in_ret = blk_pread(blk1, in_pos, in.buf, in.bsz);
-}
+bytes = (in_pos + in.bsz > size) ? size - in_pos : in.bsz;
+
+in_ret = blk_pread(blk1, in_pos, in.buf, bytes);
  if (in_ret < 0) {
  error_report("error while reading from input image file: %s",
   strerror(-in_ret));
  ret = -1;
  goto out;
  }
-in_pos += in_ret;
-
-out_ret = blk_pwrite(blk2, out_pos, in.buf, in_ret, 0);
+in_pos += bytes;
  
+out_ret = blk_pwrite(blk2, out_pos, in.buf, bytes, 0);

  if (out_ret < 0) {
  error_report("error while writing to output image file: %s",
   strerror(-out_ret));
  ret = -1;
  goto out;
  }
-out_pos += out_ret;
+out_pos += bytes;
  }
  
  out:


We could use this opportunity to drop in_ret and out_ret altogether (but 
we can also decide 

Re: [PATCH 01/18] block: Make blk_{pread,pwrite}() return 0 on success

2022-05-18 Thread Eric Blake
On Tue, May 17, 2022 at 12:35:07PM +0100, Alberto Faria wrote:
> They currently return the value of their 'bytes' parameter on success.
> 
> Make them return 0 instead, for consistency with other I/O functions and
> in preparation to implement them using generated_co_wrapper. This also
> makes it clear that short reads/writes are not possible.
> 
> Signed-off-by: Alberto Faria 
> ---

> +++ b/qemu-img.c
> @@ -5120,30 +5120,27 @@ static int img_dd(int argc, char **argv)
>  in.buf = g_new(uint8_t, in.bsz);
>  
>  for (out_pos = 0; in_pos < size; block_count++) {

in_pos, out_pos, and size are int64_t...

> -int in_ret, out_ret;
> +int bytes, in_ret, out_ret;
>  
> -if (in_pos + in.bsz > size) {
> -in_ret = blk_pread(blk1, in_pos, in.buf, size - in_pos);
> -} else {
> -in_ret = blk_pread(blk1, in_pos, in.buf, in.bsz);
> -}
> +bytes = (in_pos + in.bsz > size) ? size - in_pos : in.bsz;

...but in.bsz is int, so declaring 'int bytes' appears safe.

Reviewed-by: Eric Blake 

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.   +1-919-301-3266
Virtualization:  qemu.org | libvirt.org




Re: [PATCH 01/18] block: Make blk_{pread,pwrite}() return 0 on success

2022-05-17 Thread Greg Kurz
On Tue, 17 May 2022 12:35:07 +0100
Alberto Faria  wrote:

> They currently return the value of their 'bytes' parameter on success.
> 
> Make them return 0 instead, for consistency with other I/O functions and
> in preparation to implement them using generated_co_wrapper. This also
> makes it clear that short reads/writes are not possible.
> 
> Signed-off-by: Alberto Faria 
> ---
>  block.c  |  8 +---
>  block/block-backend.c|  7 ++-
>  block/qcow.c |  6 +++---
>  hw/block/m25p80.c|  2 +-
>  hw/misc/mac_via.c|  2 +-
>  hw/misc/sifive_u_otp.c   |  2 +-
>  hw/nvram/eeprom_at24c.c  |  4 ++--
>  hw/nvram/spapr_nvram.c   | 12 ++--
>  hw/ppc/pnv_pnor.c|  2 +-

For PPC and sPAPR parts

Reviewed-by: Greg Kurz 

>  qemu-img.c   | 17 +++--
>  qemu-io-cmds.c   | 18 --
>  tests/unit/test-block-iothread.c |  4 ++--
>  12 files changed, 43 insertions(+), 41 deletions(-)
> 
> diff --git a/block.c b/block.c
> index 2c0080..0fd830e2e2 100644
> --- a/block.c
> +++ b/block.c
> @@ -1045,14 +1045,16 @@ static int find_image_format(BlockBackend *file, 
> const char *filename,
>  return ret;
>  }
>  
> -drv = bdrv_probe_all(buf, ret, filename);
> +drv = bdrv_probe_all(buf, sizeof(buf), filename);
>  if (!drv) {
>  error_setg(errp, "Could not determine image format: No compatible "
> "driver found");
> -ret = -ENOENT;
> +*pdrv = NULL;
> +return -ENOENT;
>  }
> +
>  *pdrv = drv;
> -return ret;
> +return 0;
>  }
>  
>  /**
> diff --git a/block/block-backend.c b/block/block-backend.c
> index e0e1aff4b1..c1c367bf9e 100644
> --- a/block/block-backend.c
> +++ b/block/block-backend.c
> @@ -1577,19 +1577,16 @@ int blk_pread(BlockBackend *blk, int64_t offset, void 
> *buf, int bytes)
>  ret = blk_do_preadv(blk, offset, bytes, , 0);
>  blk_dec_in_flight(blk);
>  
> -return ret < 0 ? ret : bytes;
> +return ret;
>  }
>  
>  int blk_pwrite(BlockBackend *blk, int64_t offset, const void *buf, int bytes,
> BdrvRequestFlags flags)
>  {
> -int ret;
>  QEMUIOVector qiov = QEMU_IOVEC_INIT_BUF(qiov, buf, bytes);
>  IO_OR_GS_CODE();
>  
> -ret = blk_pwritev_part(blk, offset, bytes, , 0, flags);
> -
> -return ret < 0 ? ret : bytes;
> +return blk_pwritev_part(blk, offset, bytes, , 0, flags);
>  }
>  
>  int64_t blk_getlength(BlockBackend *blk)
> diff --git a/block/qcow.c b/block/qcow.c
> index c646d6b16d..25a43353c1 100644
> --- a/block/qcow.c
> +++ b/block/qcow.c
> @@ -891,14 +891,14 @@ static int coroutine_fn 
> qcow_co_create(BlockdevCreateOptions *opts,
>  
>  /* write all the data */
>  ret = blk_pwrite(qcow_blk, 0, , sizeof(header), 0);
> -if (ret != sizeof(header)) {
> +if (ret < 0) {
>  goto exit;
>  }
>  
>  if (qcow_opts->has_backing_file) {
>  ret = blk_pwrite(qcow_blk, sizeof(header),
>   qcow_opts->backing_file, backing_filename_len, 0);
> -if (ret != backing_filename_len) {
> +if (ret < 0) {
>  goto exit;
>  }
>  }
> @@ -908,7 +908,7 @@ static int coroutine_fn 
> qcow_co_create(BlockdevCreateOptions *opts,
>   i++) {
>  ret = blk_pwrite(qcow_blk, header_size + BDRV_SECTOR_SIZE * i,
>   tmp, BDRV_SECTOR_SIZE, 0);
> -if (ret != BDRV_SECTOR_SIZE) {
> +if (ret < 0) {
>  g_free(tmp);
>  goto exit;
>  }
> diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c
> index 7d3d8b12e0..bd58c07bb6 100644
> --- a/hw/block/m25p80.c
> +++ b/hw/block/m25p80.c
> @@ -1506,7 +1506,7 @@ static void m25p80_realize(SSIPeripheral *ss, Error 
> **errp)
>  trace_m25p80_binding(s);
>  s->storage = blk_blockalign(s->blk, s->size);
>  
> -if (blk_pread(s->blk, 0, s->storage, s->size) != s->size) {
> +if (blk_pread(s->blk, 0, s->storage, s->size) < 0) {
>  error_setg(errp, "failed to read the initial flash content");
>  return;
>  }
> diff --git a/hw/misc/mac_via.c b/hw/misc/mac_via.c
> index 525e38ce93..0515d1818e 100644
> --- a/hw/misc/mac_via.c
> +++ b/hw/misc/mac_via.c
> @@ -1030,7 +1030,7 @@ static void mos6522_q800_via1_realize(DeviceState *dev, 
> Error **errp)
>  }
>  
>  len = blk_pread(v1s->blk, 0, v1s->PRAM, sizeof(v1s->PRAM));
> -if (len != sizeof(v1s->PRAM)) {
> +if (len < 0) {
>  error_setg(errp, "can't read PRAM contents");
>  return;
>  }
> diff --git a/hw/misc/sifive_u_otp.c b/hw/misc/sifive_u_otp.c
> index 6d5f84e6c2..535acde08b 100644
> --- a/hw/misc/sifive_u_otp.c
> +++ b/hw/misc/sifive_u_otp.c
> @@ -240,7 +240,7 @@ static void sifive_u_otp_realize(DeviceState *dev, Error 
> **errp)
>

[PATCH 01/18] block: Make blk_{pread,pwrite}() return 0 on success

2022-05-17 Thread Alberto Faria
They currently return the value of their 'bytes' parameter on success.

Make them return 0 instead, for consistency with other I/O functions and
in preparation to implement them using generated_co_wrapper. This also
makes it clear that short reads/writes are not possible.

Signed-off-by: Alberto Faria 
---
 block.c  |  8 +---
 block/block-backend.c|  7 ++-
 block/qcow.c |  6 +++---
 hw/block/m25p80.c|  2 +-
 hw/misc/mac_via.c|  2 +-
 hw/misc/sifive_u_otp.c   |  2 +-
 hw/nvram/eeprom_at24c.c  |  4 ++--
 hw/nvram/spapr_nvram.c   | 12 ++--
 hw/ppc/pnv_pnor.c|  2 +-
 qemu-img.c   | 17 +++--
 qemu-io-cmds.c   | 18 --
 tests/unit/test-block-iothread.c |  4 ++--
 12 files changed, 43 insertions(+), 41 deletions(-)

diff --git a/block.c b/block.c
index 2c0080..0fd830e2e2 100644
--- a/block.c
+++ b/block.c
@@ -1045,14 +1045,16 @@ static int find_image_format(BlockBackend *file, const 
char *filename,
 return ret;
 }
 
-drv = bdrv_probe_all(buf, ret, filename);
+drv = bdrv_probe_all(buf, sizeof(buf), filename);
 if (!drv) {
 error_setg(errp, "Could not determine image format: No compatible "
"driver found");
-ret = -ENOENT;
+*pdrv = NULL;
+return -ENOENT;
 }
+
 *pdrv = drv;
-return ret;
+return 0;
 }
 
 /**
diff --git a/block/block-backend.c b/block/block-backend.c
index e0e1aff4b1..c1c367bf9e 100644
--- a/block/block-backend.c
+++ b/block/block-backend.c
@@ -1577,19 +1577,16 @@ int blk_pread(BlockBackend *blk, int64_t offset, void 
*buf, int bytes)
 ret = blk_do_preadv(blk, offset, bytes, , 0);
 blk_dec_in_flight(blk);
 
-return ret < 0 ? ret : bytes;
+return ret;
 }
 
 int blk_pwrite(BlockBackend *blk, int64_t offset, const void *buf, int bytes,
BdrvRequestFlags flags)
 {
-int ret;
 QEMUIOVector qiov = QEMU_IOVEC_INIT_BUF(qiov, buf, bytes);
 IO_OR_GS_CODE();
 
-ret = blk_pwritev_part(blk, offset, bytes, , 0, flags);
-
-return ret < 0 ? ret : bytes;
+return blk_pwritev_part(blk, offset, bytes, , 0, flags);
 }
 
 int64_t blk_getlength(BlockBackend *blk)
diff --git a/block/qcow.c b/block/qcow.c
index c646d6b16d..25a43353c1 100644
--- a/block/qcow.c
+++ b/block/qcow.c
@@ -891,14 +891,14 @@ static int coroutine_fn 
qcow_co_create(BlockdevCreateOptions *opts,
 
 /* write all the data */
 ret = blk_pwrite(qcow_blk, 0, , sizeof(header), 0);
-if (ret != sizeof(header)) {
+if (ret < 0) {
 goto exit;
 }
 
 if (qcow_opts->has_backing_file) {
 ret = blk_pwrite(qcow_blk, sizeof(header),
  qcow_opts->backing_file, backing_filename_len, 0);
-if (ret != backing_filename_len) {
+if (ret < 0) {
 goto exit;
 }
 }
@@ -908,7 +908,7 @@ static int coroutine_fn 
qcow_co_create(BlockdevCreateOptions *opts,
  i++) {
 ret = blk_pwrite(qcow_blk, header_size + BDRV_SECTOR_SIZE * i,
  tmp, BDRV_SECTOR_SIZE, 0);
-if (ret != BDRV_SECTOR_SIZE) {
+if (ret < 0) {
 g_free(tmp);
 goto exit;
 }
diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c
index 7d3d8b12e0..bd58c07bb6 100644
--- a/hw/block/m25p80.c
+++ b/hw/block/m25p80.c
@@ -1506,7 +1506,7 @@ static void m25p80_realize(SSIPeripheral *ss, Error 
**errp)
 trace_m25p80_binding(s);
 s->storage = blk_blockalign(s->blk, s->size);
 
-if (blk_pread(s->blk, 0, s->storage, s->size) != s->size) {
+if (blk_pread(s->blk, 0, s->storage, s->size) < 0) {
 error_setg(errp, "failed to read the initial flash content");
 return;
 }
diff --git a/hw/misc/mac_via.c b/hw/misc/mac_via.c
index 525e38ce93..0515d1818e 100644
--- a/hw/misc/mac_via.c
+++ b/hw/misc/mac_via.c
@@ -1030,7 +1030,7 @@ static void mos6522_q800_via1_realize(DeviceState *dev, 
Error **errp)
 }
 
 len = blk_pread(v1s->blk, 0, v1s->PRAM, sizeof(v1s->PRAM));
-if (len != sizeof(v1s->PRAM)) {
+if (len < 0) {
 error_setg(errp, "can't read PRAM contents");
 return;
 }
diff --git a/hw/misc/sifive_u_otp.c b/hw/misc/sifive_u_otp.c
index 6d5f84e6c2..535acde08b 100644
--- a/hw/misc/sifive_u_otp.c
+++ b/hw/misc/sifive_u_otp.c
@@ -240,7 +240,7 @@ static void sifive_u_otp_realize(DeviceState *dev, Error 
**errp)
 return;
 }
 
-if (blk_pread(s->blk, 0, s->fuse, filesize) != filesize) {
+if (blk_pread(s->blk, 0, s->fuse, filesize) < 0) {
 error_setg(errp, "failed to read the initial flash content");
 return;
 }
diff --git a/hw/nvram/eeprom_at24c.c b/hw/nvram/eeprom_at24c.c
index 01a3093600..84acd71f5a