From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:41412) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WDNHP-0003Gr-W9 for qemu-devel@nongnu.org; Tue, 11 Feb 2014 19:02:25 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WDNHJ-0004FQ-W0 for qemu-devel@nongnu.org; Tue, 11 Feb 2014 19:02:19 -0500 Received: from mx1.redhat.com ([209.132.183.28]:46262) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WDNHJ-0004FM-Mq for qemu-devel@nongnu.org; Tue, 11 Feb 2014 19:02:13 -0500 Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s1C02CGa019333 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 11 Feb 2014 19:02:13 -0500 From: Juan Quintela In-Reply-To: <52FAA00D.6010402@redhat.com> (Paolo Bonzini's message of "Tue, 11 Feb 2014 23:11:25 +0100") References: <1392155791-30709-1-git-send-email-quintela@redhat.com> <52FAA00D.6010402@redhat.com> Date: Wed, 12 Feb 2014 01:02:11 +0100 Message-ID: <87ppmtb3lo.fsf@elfo.mitica> MIME-Version: 1.0 Content-Type: text/plain Subject: Re: [Qemu-devel] [PATCH] qemu_file: use fwrite() correctly Reply-To: quintela@redhat.com List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Paolo Bonzini Cc: qemu-devel@nongnu.org Paolo Bonzini 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 >> --- >> 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) >>