Hi Alan, > Instead of introducing a new local variable, why not simply update > uurb->buffer? That's what we do elsewhere in the code. It seemed fragile, due to these scary lines: if (is_in && uurb->buffer_length > 0) as->userbuffer = uurb->buffer; else as->userbuffer = NULL; I suppose it works in this particular case. How is the USBDEVFS_URB_TYPE_CONTROL case supposed to work here? I can certainly change the patch if preferred. Tested and attached below. Thanks, Henrik >From 40b70394747eea51fdd07cc8213dd6afd24b1b30 Mon Sep 17 00:00:00 2001 From: Henrik Rydberg <rydberg@xxxxxxxxxxx> Date: Thu, 11 Oct 2012 23:27:04 +0200 Subject: [PATCH v2] usbdevfs: Fix broken scatter-gather transfer The handling of large output bulk transfers is broken; the same user page is read over and over again. Fixed with this patch. Signed-off-by: Henrik Rydberg <rydberg@xxxxxxxxxxx> --- drivers/usb/core/devio.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c index ebb8a9d..6e58b59 100644 --- a/drivers/usb/core/devio.c +++ b/drivers/usb/core/devio.c @@ -1349,6 +1351,7 @@ goto error; } } + uurb->buffer += u; totlen -= u; } } else if (uurb->buffer_length > 0) { -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html