Commit 24b040fe authored by Oliver Neukum's avatar Oliver Neukum Committed by Greg Kroah-Hartman
Browse files

usb: uas: reduce time under spinlock

parent e05d28b7
Loading
Loading
Loading
Loading
+14 −9
Original line number Diff line number Diff line
@@ -309,18 +309,18 @@ static void uas_stat_cmplt(struct urb *urb)
	int status = urb->status;
	bool success;

	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;
		goto bail;
	}

	idx = be16_to_cpup(&iu->tag) - 1;

	spin_lock_irqsave(&devinfo->lock, flags);

	if (devinfo->resetting)
		goto out;
	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 @@ static void uas_stat_cmplt(struct urb *urb)
		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)