char: fix broken EAGAIN retry on OS-X due to errno clobbering
commit53628efbc8aa7a7ab5354d24b971f4d69452151d
authorDaniel P. Berrange <berrange@redhat.com>
Thu, 31 Mar 2016 15:29:27 +0000 (31 16:29 +0100)
committerPaolo Bonzini <pbonzini@redhat.com>
Tue, 5 Apr 2016 09:46:52 +0000 (5 11:46 +0200)
tree0921709652044747c53934a851fee8674ce9d242
parent340849a9ff2a246bbc9a2da3f079c9fdbd2d5852
char: fix broken EAGAIN retry on OS-X due to errno clobbering

Some of the chardev I/O paths really want to write the
complete data buffer even though the channel is in
non-blocking mode. To achieve this they look for EAGAIN
and g_usleep() for 100ms. Unfortunately the code is set
to check errno == EAGAIN a second time, after the g_usleep()
call has completed. On OS-X at least, g_usleep clobbers
errno to ETIMEDOUT, causing the retry to be skipped.

This failure to retry means the full data isn't written
to the chardev backend, which causes various failures
including making the tests/ahci-test qtest hang.

Rather than playing games trying to reset errno just
simplify the code to use a goto to retry instead of a
a loop.

Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
Message-Id: <1459438168-8146-2-git-send-email-berrange@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
qemu-char.c