On Thu, 2016-02-04 at 15:41 +0100, Hans de Goede wrote:
Hi,
> > @@ -754,9 +798,18 @@ static int uas_eh_abort_handler(struct
> scsi_cmnd *cmnd)
> > if (err < 0) /* unkillable */
> > goto give_up;
> >
> > - wait_for_completion_timeout(&devinfo->deathknell,
> USB_CTRL_GET_TIMEOUT);
> > + time = wait_for_completion_timeout(&devinfo->deathknell,
> USB_CTRL_GET_TIMEOUT);
>
> AFAICT you're still doing this with the uas drivers own spinlock held,
> which is not good.
but this is called directly from the SCSI layer. How can it hold
an internal lock?
> > /* in case of timeout */
> > usb_kill_urb(devinfo->management_urb);
> > + if (time) {
> > + cmdinfo->state &= ~COMMAND_ABORTING;
> > + /*
> > + * manually finish as resources must be freed only
> once
> > + */
> > + cmnd->result = DID_ABORT << 16;
> > + cmnd->scsi_done(cmnd);
> > + }
> > +
>
> Hi, this should probably be done after killing the data urbs, since
> those
> contain a reference to the cmnd, and calling scsi_done returns the
> cmnd to
> the core at which point we should not longer touch it.
>
True. It should happen last in fact.
Regards
Oliver
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html