qemu-block
[Top][All Lists]
Advanced

[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: Denis Plotnikov
Subject: Re: [Qemu-block] [PATCH v4] qemu-io: add pattern file for write command
Date: Fri, 31 May 2019 07:44:46 +0000


On 31.05.2019 10:14, Stefano Garzarella wrote:
> 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....
ok, will do
> 
> Thanks,
> Stefano
> 

-- 
Best,
Denis

reply via email to

[Prev in Thread] Current Thread [Next in Thread]