@@ -309,18 +309,18 @@ static void uas_stat_cmplt(struct urb *urb)
309309 int status = urb -> status ;
310310 bool success ;
311311
312- spin_lock_irqsave (& devinfo -> lock , flags );
313-
314- if (devinfo -> resetting )
315- goto out ;
316-
317312 if (status ) {
318313 if (status != - ENOENT && status != - ECONNRESET && status != - ESHUTDOWN )
319314 dev_err (& urb -> dev -> dev , "stat urb: status %d\n" , status );
320- goto out ;
315+ goto bail ;
321316 }
322317
323318 idx = be16_to_cpup (& iu -> tag ) - 1 ;
319+
320+ spin_lock_irqsave (& devinfo -> lock , flags );
321+
322+ if (devinfo -> resetting )
323+ goto out ;
324324 if (idx >= MAX_CMNDS || !devinfo -> cmnd [idx ]) {
325325 dev_err (& urb -> dev -> dev ,
326326 "stat urb: no pending cmd for uas-tag %d\n" , idx + 1 );
@@ -375,9 +375,8 @@ static void uas_stat_cmplt(struct urb *urb)
375375 default :
376376 uas_log_cmd_state (cmnd , "bogus IU" , iu -> iu_id );
377377 }
378- out :
379- usb_free_urb (urb );
380378 spin_unlock_irqrestore (& devinfo -> lock , flags );
379+ usb_free_urb (urb );
381380
382381 /* Unlinking of data urbs must be done without holding the lock */
383382 if (data_in_urb ) {
@@ -388,6 +387,12 @@ static void uas_stat_cmplt(struct urb *urb)
388387 usb_unlink_urb (data_out_urb );
389388 usb_put_urb (data_out_urb );
390389 }
390+ return ;
391+
392+ out :
393+ spin_unlock_irqrestore (& devinfo -> lock , flags );
394+ bail :
395+ usb_free_urb (urb );
391396}
392397
393398static void uas_data_cmplt (struct urb * urb )
@@ -429,8 +434,8 @@ static void uas_data_cmplt(struct urb *urb)
429434 }
430435 uas_try_complete (cmnd , __func__ );
431436out :
432- usb_free_urb (urb );
433437 spin_unlock_irqrestore (& devinfo -> lock , flags );
438+ usb_free_urb (urb );
434439}
435440
436441static void uas_cmd_cmplt (struct urb * urb )
0 commit comments