Use __anon_inode_getfd instead of opencoding the logic using
get_unused_fd_flags + anon_inode_getfile.

Signed-off-by: Christoph Hellwig <h...@lst.de>
---
 drivers/vfio/vfio.c | 37 ++++++++-----------------------------
 1 file changed, 8 insertions(+), 29 deletions(-)

diff --git a/drivers/vfio/vfio.c b/drivers/vfio/vfio.c
index 765e0e5d83ed9..33a88103f857f 100644
--- a/drivers/vfio/vfio.c
+++ b/drivers/vfio/vfio.c
@@ -1451,42 +1451,21 @@ static int vfio_group_get_device_fd(struct vfio_group 
*group, char *buf)
                return ret;
        }
 
-       /*
-        * We can't use anon_inode_getfd() because we need to modify
-        * the f_mode flags directly to allow more than just ioctls
-        */
-       ret = get_unused_fd_flags(O_CLOEXEC);
-       if (ret < 0) {
-               device->ops->release(device->device_data);
-               vfio_device_put(device);
-               return ret;
-       }
-
-       filep = anon_inode_getfile("[vfio-device]", &vfio_device_fops,
-                                  device, O_RDWR);
-       if (IS_ERR(filep)) {
-               put_unused_fd(ret);
-               ret = PTR_ERR(filep);
-               device->ops->release(device->device_data);
-               vfio_device_put(device);
-               return ret;
-       }
-
-       /*
-        * TODO: add an anon_inode interface to do this.
-        * Appears to be missing by lack of need rather than
-        * explicitly prevented.  Now there's need.
-        */
+       ret = __anon_inode_getfd("[vfio-device]", &vfio_device_fops,
+                                  device, O_CLOEXEC | O_RDWR, &filep);
+       if (ret < 0)
+               goto release;
        filep->f_mode |= (FMODE_LSEEK | FMODE_PREAD | FMODE_PWRITE);
-
        atomic_inc(&group->container_users);
-
        fd_install(ret, filep);
 
        if (group->noiommu)
                dev_warn(device->dev, "vfio-noiommu device opened by user "
                         "(%s:%d)\n", current->comm, task_pid_nr(current));
-
+       return ret;
+release:
+       device->ops->release(device->device_data);
+       vfio_device_put(device);
        return ret;
 }
 
-- 
2.26.2

Reply via email to