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
					
				
							
								
								
									
										13
									
								
								dump.c
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								dump.c
									
									
									
									
									
								
							@ -100,20 +100,13 @@ 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);
 | 
					 | 
				
			||||||
        if (writen_size != size && errno != EAGAIN) {
 | 
					 | 
				
			||||||
        return -1;
 | 
					        return -1;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        buf += writen_size;
 | 
					 | 
				
			||||||
        size -= writen_size;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return 0;
 | 
					    return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user