qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH] qemu_file: use fwrite() correctly


From: Juan Quintela
Subject: Re: [Qemu-devel] [PATCH] qemu_file: use fwrite() correctly
Date: Wed, 12 Feb 2014 01:02:11 +0100
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3 (gnu/linux)

Paolo Bonzini <address@hidden> wrote:
> Il 11/02/2014 22:56, Juan Quintela ha scritto:
>> fwrite() returns the number of items written.  But when there is one
>> error, it can return a short write.
>>
>> In the particular bug that I was tracking, I did a migration to a
>> read-only filesystem.  And it was able to finish the migration
>> correctly.  fwrite() never returned a negative error code, nor zero,
>> always 4096. (migration writes chunks of about 14000 bytes).  And it
>> was able to "complete" the migration with success (yes, reading the
>> file was a bit more difficult).
>>
>> To add insult to injury, if your amount of memory was big enough (12GB
>> on my case), it overwrote some important structure, and from them,
>> malloc failed.  This check makes the problem go away.
>>
>> Signed-off-by: Juan Quintela <address@hidden>
>> ---
>>  qemu-file.c | 9 ++++++++-
>>  1 file changed, 8 insertions(+), 1 deletion(-)
>>
>> diff --git a/qemu-file.c b/qemu-file.c
>> index 9473b67..f074af1 100644
>> --- a/qemu-file.c
>> +++ b/qemu-file.c
>> @@ -100,7 +100,14 @@ static int stdio_put_buffer(void *opaque, const uint8_t 
>> *buf, int64_t pos,
>>                              int size)
>>  {
>>      QEMUFileStdio *s = opaque;
>> -    return fwrite(buf, 1, size, s->stdio_file);
>> +    int res;
>> +
>> +    res = fwrite(buf, 1, size, s->stdio_file);
>> +
>> +    if (res != size) {
>> +        return -EIO;        /* fake errno value */
>
> Can you return -errno here?  No need for a fake value.

Sending v2.  On the 1st round here, it returns -EPIPE on errno, exactly
the error that has happened.

Thanks.

> Paolo
>
>> +    }
>> +    return res;
>>  }
>>
>>  static int stdio_get_buffer(void *opaque, uint8_t *buf, int64_t pos, int 
>> size)
>>



reply via email to

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