This exact same code was duplicated in two different places.

Signed-off-by: Paul Cercueil <p...@crapouillou.net>
---
 drivers/usb/gadget/function/f_fs.c | 48 +++++++++++++++++-------------
 1 file changed, 27 insertions(+), 21 deletions(-)

diff --git a/drivers/usb/gadget/function/f_fs.c 
b/drivers/usb/gadget/function/f_fs.c
index 6bff6cb93789..ed2a6d5fcef7 100644
--- a/drivers/usb/gadget/function/f_fs.c
+++ b/drivers/usb/gadget/function/f_fs.c
@@ -934,31 +934,44 @@ static ssize_t __ffs_epfile_read_data(struct ffs_epfile 
*epfile,
        return ret;
 }
 
-static ssize_t ffs_epfile_io(struct file *file, struct ffs_io_data *io_data)
+static struct ffs_ep *ffs_epfile_wait_ep(struct file *file)
 {
        struct ffs_epfile *epfile = file->private_data;
-       struct usb_request *req;
        struct ffs_ep *ep;
-       char *data = NULL;
-       ssize_t ret, data_len = -EINVAL;
-       int halt;
-
-       /* Are we still active? */
-       if (WARN_ON(epfile->ffs->state != FFS_ACTIVE))
-               return -ENODEV;
+       int ret;
 
        /* Wait for endpoint to be enabled */
        ep = epfile->ep;
        if (!ep) {
                if (file->f_flags & O_NONBLOCK)
-                       return -EAGAIN;
+                       return ERR_PTR(-EAGAIN);
 
                ret = wait_event_interruptible(
                                epfile->ffs->wait, (ep = epfile->ep));
                if (ret)
-                       return -EINTR;
+                       return ERR_PTR(-EINTR);
        }
 
+       return ep;
+}
+
+static ssize_t ffs_epfile_io(struct file *file, struct ffs_io_data *io_data)
+{
+       struct ffs_epfile *epfile = file->private_data;
+       struct usb_request *req;
+       struct ffs_ep *ep;
+       char *data = NULL;
+       ssize_t ret, data_len = -EINVAL;
+       int halt;
+
+       /* Are we still active? */
+       if (WARN_ON(epfile->ffs->state != FFS_ACTIVE))
+               return -ENODEV;
+
+       ep = ffs_epfile_wait_ep(file);
+       if (IS_ERR(ep))
+               return PTR_ERR(ep);
+
        /* Do we halt? */
        halt = (!io_data->read == !epfile->in);
        if (halt && epfile->isoc)
@@ -1280,16 +1293,9 @@ static long ffs_epfile_ioctl(struct file *file, unsigned 
code,
                return -ENODEV;
 
        /* Wait for endpoint to be enabled */
-       ep = epfile->ep;
-       if (!ep) {
-               if (file->f_flags & O_NONBLOCK)
-                       return -EAGAIN;
-
-               ret = wait_event_interruptible(
-                               epfile->ffs->wait, (ep = epfile->ep));
-               if (ret)
-                       return -EINTR;
-       }
+       ep = ffs_epfile_wait_ep(file);
+       if (IS_ERR(ep))
+               return PTR_ERR(ep);
 
        spin_lock_irq(&epfile->ffs->eps_lock);
 
-- 
2.43.0

Reply via email to