[PATCH] USB: ub 04 Loss of timer and a hang
commitb31f821c6dee6f3ecfca6b2583a6552538fb91bf
authorPete Zaitcev <zaitcev@redhat.com>
Thu, 5 Jan 2006 08:14:02 +0000 (5 00:14 -0800)
committerGreg Kroah-Hartman <gregkh@suse.de>
Wed, 1 Feb 2006 01:23:36 +0000 (31 17:23 -0800)
tree3305511c230623ccd4fb1c766c57585479644cc6
parent65b4fe553bf43018c06740f3d1f6caf42cf95924
[PATCH] USB: ub 04 Loss of timer and a hang

If SCSI commands are submitted while other commands are still processed,
the dispatch loop turns, and we stop the work_timer. Then, if URB fails
to complete, ub hangs until the device is unplugged.

This does not happen often, becase we only allow one SCSI command per
block device, but does happen (on multi-LUN devices, for example).

The fix is to stop timer only when we actually going to change the state.

The nicest code would be to have the timer stopped in URB callback, but
this is impossible, because it can be called from inside a timer, through
the urb_unlink. Then we get BUG in timer.c:cascade(). So, we do it a
little dirtier.

Signed-off-by: Pete Zaitcev <zaitcev@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/block/ub.c