Looks good to me. Greg, please apply. Matt
Signed-off-by: Matthew Dharm <[EMAIL PROTECTED]> On Wed, May 24, 2006 at 04:57:28PM +0200, Franck Bui-Huu wrote: > > This patch uses completion timeout instead of a timer to implement > a timeout when submitting an URB. > > It also put the task in interruptible state instead of an > uninterruptible one while waiting for the completion. > > Signed-off-by: Franck Bui-Huu <[EMAIL PROTECTED]> > > > --- > > drivers/usb/storage/transport.c | 38 ++++++++++---------------------------- > 1 files changed, 10 insertions(+), 28 deletions(-) > > 5d53ca36e71b3854ac8c86165ea0543c218c1c54 > diff --git a/drivers/usb/storage/transport.c b/drivers/usb/storage/transport.c > index 7ca896a..038f458 100644 > --- a/drivers/usb/storage/transport.c > +++ b/drivers/usb/storage/transport.c > @@ -115,19 +115,6 @@ static void usb_stor_blocking_completion > > complete(urb_done_ptr); > } > - > -/* This is the timeout handler which will cancel an URB when its timeout > - * expires. > - */ > -static void timeout_handler(unsigned long us_) > -{ > - struct us_data *us = (struct us_data *) us_; > - > - if (test_and_clear_bit(US_FLIDX_URB_ACTIVE, &us->flags)) { > - US_DEBUGP("Timeout -- cancelling URB\n"); > - usb_unlink_urb(us->current_urb); > - } > -} > > /* This is the common part of the URB message submission code > * > @@ -138,7 +125,7 @@ static void timeout_handler(unsigned lon > static int usb_stor_msg_common(struct us_data *us, int timeout) > { > struct completion urb_done; > - struct timer_list to_timer; > + long timeleft; > int status; > > /* don't submit URBs during abort/disconnect processing */ > @@ -185,22 +172,17 @@ static int usb_stor_msg_common(struct us > } > } > > - /* submit the timeout timer, if a timeout was requested */ > - if (timeout > 0) { > - init_timer(&to_timer); > - to_timer.expires = jiffies + timeout; > - to_timer.function = timeout_handler; > - to_timer.data = (unsigned long) us; > - add_timer(&to_timer); > - } > - > /* wait for the completion of the URB */ > - wait_for_completion(&urb_done); > - clear_bit(US_FLIDX_URB_ACTIVE, &us->flags); > + timeleft = wait_for_completion_interruptible_timeout( > + &urb_done, timeout ? : MAX_SCHEDULE_TIMEOUT); > > - /* clean up the timeout timer */ > - if (timeout > 0) > - del_timer_sync(&to_timer); > + clear_bit(US_FLIDX_URB_ACTIVE, &us->flags); > + > + if (timeleft <= 0) { > + US_DEBUGP("%s -- cancelling URB\n", > + timeleft == 0 ? "Timeout" : "Signal"); > + usb_unlink_urb(us->current_urb); > + } > > /* return the URB status */ > return us->current_urb->status; > -- > 1.3.3.g8701 -- Matthew Dharm Home: [EMAIL PROTECTED] Maintainer, Linux USB Mass Storage Driver You were using cheat codes too. You guys suck. -- Greg to General Studebaker User Friendly, 12/16/1997
pgpwKo4vI2rtu.pgp
Description: PGP signature