mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
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>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
e05d28b759
commit
24b040fe50
@@ -309,18 +309,18 @@ static void uas_stat_cmplt(struct urb *urb)
|
||||
int status = urb->status;
|
||||
bool success;
|
||||
|
||||
if (status) {
|
||||
if (status != -ENOENT && status != -ECONNRESET && status != -ESHUTDOWN)
|
||||
dev_err(&urb->dev->dev, "stat urb: status %d\n", status);
|
||||
goto bail;
|
||||
}
|
||||
|
||||
idx = be16_to_cpup(&iu->tag) - 1;
|
||||
|
||||
spin_lock_irqsave(&devinfo->lock, flags);
|
||||
|
||||
if (devinfo->resetting)
|
||||
goto out;
|
||||
|
||||
if (status) {
|
||||
if (status != -ENOENT && status != -ECONNRESET && status != -ESHUTDOWN)
|
||||
dev_err(&urb->dev->dev, "stat urb: status %d\n", status);
|
||||
goto out;
|
||||
}
|
||||
|
||||
idx = be16_to_cpup(&iu->tag) - 1;
|
||||
if (idx >= MAX_CMNDS || !devinfo->cmnd[idx]) {
|
||||
dev_err(&urb->dev->dev,
|
||||
"stat urb: no pending cmd for uas-tag %d\n", idx + 1);
|
||||
@@ -375,9 +375,8 @@ static void uas_stat_cmplt(struct urb *urb)
|
||||
default:
|
||||
uas_log_cmd_state(cmnd, "bogus IU", iu->iu_id);
|
||||
}
|
||||
out:
|
||||
usb_free_urb(urb);
|
||||
spin_unlock_irqrestore(&devinfo->lock, flags);
|
||||
usb_free_urb(urb);
|
||||
|
||||
/* Unlinking of data urbs must be done without holding the lock */
|
||||
if (data_in_urb) {
|
||||
@@ -388,6 +387,12 @@ out:
|
||||
usb_unlink_urb(data_out_urb);
|
||||
usb_put_urb(data_out_urb);
|
||||
}
|
||||
return;
|
||||
|
||||
out:
|
||||
spin_unlock_irqrestore(&devinfo->lock, flags);
|
||||
bail:
|
||||
usb_free_urb(urb);
|
||||
}
|
||||
|
||||
static void uas_data_cmplt(struct urb *urb)
|
||||
@@ -429,8 +434,8 @@ static void uas_data_cmplt(struct urb *urb)
|
||||
}
|
||||
uas_try_complete(cmnd, __func__);
|
||||
out:
|
||||
usb_free_urb(urb);
|
||||
spin_unlock_irqrestore(&devinfo->lock, flags);
|
||||
usb_free_urb(urb);
|
||||
}
|
||||
|
||||
static void uas_cmd_cmplt(struct urb *urb)
|
||||
|
||||
Reference in New Issue
Block a user