On 2018-07-20 23:40, Bandan Das wrote: > For large buffers, write may not copy the full buffer. For example, > on Linux, write imposes a limit of 0x7ffff000. Note that this does > not fix >4G transfers but ~>2G files will transfer successfully. > > Signed-off-by: Bandan Das <b...@redhat.com> > --- > hw/usb/dev-mtp.c | 22 ++++++++++++++++++++-- > 1 file changed, 20 insertions(+), 2 deletions(-) > > diff --git a/hw/usb/dev-mtp.c b/hw/usb/dev-mtp.c > index 1b72603dc5..c8f6eb4e9e 100644 > --- a/hw/usb/dev-mtp.c > +++ b/hw/usb/dev-mtp.c > @@ -1602,6 +1602,24 @@ static void utf16_to_str(uint8_t len, uint16_t *arr, > char *name) > g_free(wstr); > } > > +/* Wrapper around write, returns 0 on failure */ > +static uint64_t write_retry(int fd, void *buf, uint64_t size) > +{ > + uint64_t bytes_left = size, ret; > + > + while (bytes_left > 0) { > + ret = write(fd, buf, bytes_left); > + if ((ret == -1) && (errno != EINTR || errno != EAGAIN || > + errno != EWOULDBLOCK)) {
Someone opened a bug ticket about this here: https://bugs.launchpad.net/qemu/+bug/1798780 The check looks wrong, indeed - either "!=" should be "==" or "||" should be "&&" here ? Thomas