From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:51905) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TF6gn-0001Y0-9v for qemu-devel@nongnu.org; Fri, 21 Sep 2012 13:06:57 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TF6gg-0000dA-CQ for qemu-devel@nongnu.org; Fri, 21 Sep 2012 13:06:53 -0400 Received: from mx1.redhat.com ([209.132.183.28]:55476) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TF6gg-0000cs-4D for qemu-devel@nongnu.org; Fri, 21 Sep 2012 13:06:46 -0400 From: Luiz Capitulino Date: Fri, 21 Sep 2012 14:07:22 -0300 Message-Id: <1348247243-12446-3-git-send-email-lcapitulino@redhat.com> In-Reply-To: <1348247243-12446-1-git-send-email-lcapitulino@redhat.com> References: <1348247243-12446-1-git-send-email-lcapitulino@redhat.com> Subject: [Qemu-devel] [PATCH 2/3] qmp: dump-guest-memory: don't spin if non-blocking fd would block List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: jan.kiszka@siemens.com, aliguori@us.ibm.com, armbru@redhat.com, d.hatayama@jp.fujitsu.com fd_write_vmcore() will indefinitely spin for a non-blocking file-descriptor that would block. However, if the fd is non-blocking, how does it make sense to spin? Change this behavior to return an error instead. Note that this can only happen with an fd provided by a management application. The fd opened internally by dump-guest-memory is blocking. Signed-off-by: Luiz Capitulino --- dump.c | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/dump.c b/dump.c index 2bf8d8d..5eea015 100644 --- a/dump.c +++ b/dump.c @@ -100,18 +100,11 @@ static void dump_error(DumpState *s, const char *reason) static int fd_write_vmcore(void *buf, size_t size, void *opaque) { DumpState *s = opaque; - int fd = s->fd; size_t writen_size; - /* The fd may be passed from user, and it can be non-blocked */ - while (size) { - writen_size = qemu_write_full(fd, buf, size); - if (writen_size != size && errno != EAGAIN) { - return -1; - } - - buf += writen_size; - size -= writen_size; + writen_size = qemu_write_full(s->fd, buf, size); + if (writen_size != size) { + return -1; } return 0; -- 1.7.12.315.g682ce8b