[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-block] [PATCH v4] qemu-io: add pattern file for write command
From: |
Stefano Garzarella |
Subject: |
Re: [Qemu-block] [PATCH v4] qemu-io: add pattern file for write command |
Date: |
Fri, 31 May 2019 09:14:59 +0200 |
User-agent: |
NeoMutt/20180716 |
On Fri, May 31, 2019 at 06:21:13AM +0000, Denis Plotnikov wrote:
>
>
> On 30.05.2019 11:26, Stefano Garzarella wrote:
> > On Thu, May 30, 2019 at 11:10:55AM +0300, Denis Plotnikov wrote:
> >> The patch allows to provide a pattern file for write
> >> command. There was no similar ability before.
> >>
> >> Signed-off-by: Denis Plotnikov <address@hidden>
> >> ---
> >
> > Hi Denis,
> > for next versions I suggest to describe here, after the ---, the changes
> > with previous versions. In this way the review should be easier.
> ---
> Sure
> >
> >> qemu-io-cmds.c | 81 ++++++++++++++++++++++++++++++++++++++++++++++----
> >> 1 file changed, 75 insertions(+), 6 deletions(-)
> >>
> >> diff --git a/qemu-io-cmds.c b/qemu-io-cmds.c
> >> index 09750a23ce..1c6a5e4faf 100644
> >> --- a/qemu-io-cmds.c
> >> +++ b/qemu-io-cmds.c
> >> @@ -21,6 +21,7 @@
> >> #include "qemu/option.h"
> >> #include "qemu/timer.h"
> >> #include "qemu/cutils.h"
> >> +#include "string.h"
> >>
> >> #define CMD_NOFILE_OK 0x01
> >>
> >> @@ -343,6 +344,61 @@ static void *qemu_io_alloc(BlockBackend *blk, size_t
> >> len, int pattern)
> >> return buf;
> >> }
> >>
> >> +static void *qemu_io_alloc_from_file(BlockBackend *blk, size_t len,
> >> + char *file_name)
> >> +{
> >> + char *buf, *buf_pos;
> >> + FILE *f = fopen(file_name, "r");
> >> + int l;
> >> +
> >> + if (!f) {
> >> + printf("'%s': %s\n", file_name, strerror(errno));
> >> + return NULL;
> >> + }
> >> +
> >> + if (qemuio_misalign) {
> >> + len += MISALIGN_OFFSET;
> >> + }
> >> + buf = blk_blockalign(blk, len);
> >> + memset(buf, 0, len);
> >> +
> >> + buf_pos = buf;
> >> +
> >> + while (len > 0) {
> >> + l = fread(buf_pos, sizeof(char), len, f);
> >> +
> >> + if (feof(f)) {
> >> + rewind(f);
> >> + }
> >> +
> >> + if (ferror(f)) {
> >> + printf("'%s': %s\n", file_name, strerror(errno));
> >> + goto error;
> >> + }
> >> +
> >> + if (l == 0) {
> >> + printf("'%s' is empty\n", file_name);
> >> + goto error;
> >> + }
> >
> > Could it happen that we read some bytes, than we reached the EOF, so we made
> > the rewind() and fread() returns 0?
> > If that can happen, maybe we should change it in this way:
> >
> > if (l == 0 && buf_pos == buf) {
> > printf("'%s' is empty\n", file_name);
> > goto error;
> > }
> This shouldn't happen. To get that situation we need to read exactly the
> file length (from the current position to the end) on the first step,
> then rewind, read again and in that case get l == 0 and feof == true.
> But reading the exact length means that we asked for that size, so the
> buffer is fully populated, thus len == 0 and we leave the loop.
>
> So, l == 0 is only when we read an empty file on the first iteration.
>
Right!
> >> @@ -983,8 +1039,9 @@ static int write_f(BlockBackend *blk, int argc, char
> >> **argv)
> >> /* Some compilers get confused and warn if this is not initialized.
> >> */
> >> int64_t total = 0;
> >> int pattern = 0xcd;
> >> + char *file_name;
I think we should initialize file_name to NULL here to silent the compiler.
I applied this patch and I had this error:
/home/stefano/repos/qemu/qemu-io-cmds.c: In function ‘write_f’:
/home/stefano/repos/qemu/qemu-io-cmds.c:351:15: error: ‘file_name’ may be used
uninitialized in this function [-Werror=maybe-uninitialized]
FILE *f = fopen(file_name, "r");
^~~~~~~~~~~~~~~~~~~~~
/home/stefano/repos/qemu/qemu-io-cmds.c:1042:11: note: ‘file_name’ was declared
here
char *file_name;
^~~~~~~~~
cc1: all warnings being treated as errors
make: *** [/home/stefano/repos/qemu/rules.mak:69: qemu-io-cmds.o] Error 1
make: *** Waiting for unfinished jobs....
Thanks,
Stefano