On Tue, 9 Aug 2016, Felipe Balbi wrote: > > Hi, > > Lu Baolu <baolu.lu@xxxxxxxxxxxxxxx> writes: > > In sg_timeout(), req->status is set to "-ETIMEDOUT" before calling > > into usb_sg_cancel(). usb_sg_cancel() will do nothing and return > > directly if req->status has been set to a non-zero value. This will > > cause driver hang as soon as transfer time out is triggered. ... > > This patch fixes this driver hang. It should be back-ported to stable > > kernel with version after v3.15. > > > > Cc: stable@xxxxxxxxxxxxxxx > > Cc: Alan Stern <stern@xxxxxxxxxxxxxxxxxxx> > > Signed-off-by: Lu Baolu <baolu.lu@xxxxxxxxxxxxxxx> > > --- > > drivers/usb/misc/usbtest.c | 1 - > > 1 file changed, 1 deletion(-) > > > > diff --git a/drivers/usb/misc/usbtest.c b/drivers/usb/misc/usbtest.c > > index 6b978f0..6c6586d 100644 > > --- a/drivers/usb/misc/usbtest.c > > +++ b/drivers/usb/misc/usbtest.c > > @@ -585,7 +585,6 @@ static void sg_timeout(unsigned long _req) > > { > > struct usb_sg_request *req = (struct usb_sg_request *) _req; > > > > - req->status = -ETIMEDOUT; > > usb_sg_cancel(req); > > } > > IMO, req->status = -ETIMEDOUT should still be done, but perhaps after > usb_sg_cancel(). Alan? That would race with sg_complete(), perhaps causing a bunch of error messages. A better approach would be to delete the assignment as above and then change perform_sglist(): usb_sg_wait(req); - del_timer_sync(&sg_timer); retval = req->status; + if (!del_timer_sync(&sg_timer)) + retval = -ETIMEDOUT; Alan Stern -- To unsubscribe from this list: send the line "unsubscribe stable" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html