On Tue, Oct 07 2014, David Cohen <david.a.cohen@xxxxxxxxxxxxxxx> wrote: > The commit '2e4c7553cd usb: gadget: f_fs: add aio support' broke the > quirk implemented to align buffer size to maxpacketsize on out endpoint. > As result, functionfs does not work on Intel platforms using dwc3 driver > (i.e. Bay Trail and Merrifield). This patch fixes the issue. > > This code is based on a previous Qiuxu's patch. > > Signed-off-by: David Cohen <david.a.cohen@xxxxxxxxxxxxxxx> > Signed-off-by: Qiuxu Zhuo <qiuxu.zhuo@xxxxxxxxx> Acked-by: Michal Nazarewicz <mina86@xxxxxxxxxx> > --- > > Hi, > > Since this is a feature that worked in past, this patch is meant for 3.17 > kernel. If/when we pass review and accept it on 3.17, I'll send a version for > stable 3.16 kernel too. It is not required for 3.14, since the regression came > later. > > Br, David Cohen > > --- > drivers/usb/gadget/function/f_fs.c | 21 ++++++++++++++++----- > 1 file changed, 16 insertions(+), 5 deletions(-) > > diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c > index 0dc3552d1360..6e2b8063b170 100644 > --- a/drivers/usb/gadget/function/f_fs.c > +++ b/drivers/usb/gadget/function/f_fs.c > @@ -648,15 +648,26 @@ static void ffs_user_copy_worker(struct work_struct *work) > if (io_data->read && ret > 0) { > int i; > size_t pos = 0; > + > + /* > + * Since req->length may be bigger than io_data->len (after > + * being rounded up to maxpacketsize), we may end up with more > + * data then user space has space for. > + */ > + ret = min_t(int, ret, io_data->len); > + > use_mm(io_data->mm); > for (i = 0; i < io_data->nr_segs; i++) { > + size_t len = min_t(size_t, ret - pos, > + io_data->iovec[i].iov_len); > + if (!len) > + break; > if (unlikely(copy_to_user(io_data->iovec[i].iov_base, > - &io_data->buf[pos], > - io_data->iovec[i].iov_len))) { > + &io_data->buf[pos], len))) { > ret = -EFAULT; > break; > } > - pos += io_data->iovec[i].iov_len; > + pos += len; > } > unuse_mm(io_data->mm); > } > @@ -794,7 +805,7 @@ static ssize_t ffs_epfile_io(struct file *file, struct ffs_io_data *io_data) > goto error_lock; > > req->buf = data; > - req->length = io_data->len; > + req->length = data_len; > > io_data->buf = data; > io_data->ep = ep->ep; > @@ -816,7 +827,7 @@ static ssize_t ffs_epfile_io(struct file *file, struct ffs_io_data *io_data) > > req = ep->req; > req->buf = data; > - req->length = io_data->len; > + req->length = data_len; > > req->context = &done; > req->complete = ffs_epfile_io_complete; > -- > 2.1.0 > -- Best regards, _ _ .o. | Liege of Serenely Enlightened Majesty of o' \,=./ `o ..o | Computer Science, Michał “mina86” Nazarewicz (o o) ooo +--<mpn@xxxxxxxxxx>--<xmpp:mina86@xxxxxxxxxx>--ooO--(_)--Ooo-- -- 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