On Thursday 29 November 2012 15:31:54 Gerd Hoffmann wrote: > On 11/29/12 14:20, Oliver Neukum wrote: > > On Thursday 29 November 2012 14:06:12 Gerd Hoffmann wrote: > >> Add uas_unlink_data_urbs function to cancel in-flight data urbs. > >> Moves existing code into a separate function. > >> > >> Signed-off-by: Gerd Hoffmann <kraxel@xxxxxxxxxx> > >> --- > >> drivers/usb/storage/uas.c | 32 ++++++++++++++++++++++---------- > >> 1 files changed, 22 insertions(+), 10 deletions(-) > >> > >> diff --git a/drivers/usb/storage/uas.c b/drivers/usb/storage/uas.c > >> index 98b98ee..c348afa 100644 > >> --- a/drivers/usb/storage/uas.c > >> +++ b/drivers/usb/storage/uas.c > >> @@ -87,6 +87,25 @@ static DECLARE_WORK(uas_work, uas_do_work); > >> static DEFINE_SPINLOCK(uas_work_lock); > >> static LIST_HEAD(uas_work_list); > >> > >> +static void uas_unlink_data_urbs(struct uas_dev_info *devinfo, > >> + struct uas_cmd_info *cmdinfo) > >> +{ > >> + unsigned long flags; > >> + > >> + spin_lock_irqsave(&devinfo->lock, flags); > >> + if (cmdinfo->state & DATA_IN_URB_INFLIGHT) { > >> + spin_unlock_irqrestore(&devinfo->lock, flags); > > urb_unlink_urb may call the completion callback which in turn grabs the > lock to update cmdinfo->state, so we must drop it to avoid deadlocks. But what is the point of taking it at all if the result of the check may be reversed when you act upon it? Regards Oliver -- 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