qmp: dump-guest-memory: don't spin if non-blocking fd would block
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. While there, also fix 'writen_size' variable name. Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Reviewed-by: Markus Armbruster <armbru@redhat.com>
This commit is contained in:
parent
d691180e41
commit
2f61652d66
15
dump.c
15
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)
|
static int fd_write_vmcore(void *buf, size_t size, void *opaque)
|
||||||
{
|
{
|
||||||
DumpState *s = opaque;
|
DumpState *s = opaque;
|
||||||
int fd = s->fd;
|
size_t written_size;
|
||||||
size_t writen_size;
|
|
||||||
|
|
||||||
/* The fd may be passed from user, and it can be non-blocked */
|
written_size = qemu_write_full(s->fd, buf, size);
|
||||||
while (size) {
|
if (written_size != size) {
|
||||||
writen_size = qemu_write_full(fd, buf, size);
|
return -1;
|
||||||
if (writen_size != size && errno != EAGAIN) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
buf += writen_size;
|
|
||||||
size -= writen_size;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user