Skip to content

Commit 24b040f

Browse files
oneukumgregkh
authored andcommitted
usb: uas: reduce time under spinlock
Drop the lock before freeing memory. Signed-off-by: Oliver Neukum <oneukum@suse.com> Link: https://patch.msgid.link/20251112135543.31081-1-oneukum@suse.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent e05d28b commit 24b040f

1 file changed

Lines changed: 14 additions & 9 deletions

File tree

drivers/usb/storage/uas.c

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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

393398
static 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__);
431436
out:
432-
usb_free_urb(urb);
433437
spin_unlock_irqrestore(&devinfo->lock, flags);
438+
usb_free_urb(urb);
434439
}
435440

436441
static void uas_cmd_cmplt(struct urb *urb)

0 commit comments

Comments
 (0)