Merge "USB: f_fs: Fix disconnect check during ongoing IO"

This commit is contained in:
qctecmdr 2021-03-10 15:24:04 -08:00 • committed by Gerrit - the friendly Code Review server
commit e5bd1aef80

View file

@ -1183,7 +1183,12 @@ static ssize_t ffs_epfile_io(struct file *file, struct ffs_io_data *io_data)
*/
spin_lock_irq(&epfile->ffs->eps_lock);
interrupted = true;
if (ep->ep) {
/*
* While we were acquiring lock endpoint got
* disabled (disconnect) or changed
(composition switch) ?
*/
if (epfile->ep == ep) {
usb_ep_dequeue(ep->ep, req);
spin_unlock_irq(&epfile->ffs->eps_lock);
wait_for_completion(&done);
@ -1203,7 +1208,12 @@ static ssize_t ffs_epfile_io(struct file *file, struct ffs_io_data *io_data)
ret = -ENODEV;
spin_lock_irq(&epfile->ffs->eps_lock);
if (ep->ep)
/*
* While we were acquiring lock endpoint got
* disabled (disconnect) or changed
* (composition switch) ?
*/
if (epfile->ep == ep)
ret = ep->status;
spin_unlock_irq(&epfile->ffs->eps_lock);
if (io_data->read && ret > 0)
@ -3901,6 +3911,7 @@ static void ffs_func_unbind(struct usb_configuration *c,
if (ep->ep && ep->req)
usb_ep_free_request(ep->ep, ep->req);
ep->req = NULL;
ep->ep = NULL;
++ep;
}
spin_unlock_irqrestore(&func->ffs->eps_lock, flags);