Rely on the fd exit path machinery.

Signed-off-by: Christian Brauner (Amutable) <[email protected]>
---
 drivers/vfio/vfio_main.c | 25 +++++++------------------
 1 file changed, 7 insertions(+), 18 deletions(-)

diff --git a/drivers/vfio/vfio_main.c b/drivers/vfio/vfio_main.c
index 423ead48aafe..93d9d21f4074 100644
--- a/drivers/vfio/vfio_main.c
+++ b/drivers/vfio/vfio_main.c
@@ -903,28 +903,17 @@ EXPORT_SYMBOL_GPL(vfio_mig_get_next_state);
 static int vfio_ioct_mig_return_fd(struct file *filp, void __user *arg,
                                   struct vfio_device_feature_mig_state *mig)
 {
-       int ret;
-       int fd;
+       FD_PREPARE(fdf, O_CLOEXEC, filp);
 
-       fd = get_unused_fd_flags(O_CLOEXEC);
-       if (fd < 0) {
-               ret = fd;
-               goto out_fput;
+       if (IS_ERR(fdf)) {
+               fput(filp);
+               return PTR_ERR(fdf);
        }
 
-       mig->data_fd = fd;
-       if (copy_to_user(arg, mig, sizeof(*mig))) {
-               ret = -EFAULT;
-               goto out_put_unused;
-       }
-       fd_install(fd, filp);
+       mig->data_fd = fd_prepare_fd(fdf);
+       if (copy_to_user(arg, mig, sizeof(*mig)))
+               return -EFAULT;
        return 0;
-
-out_put_unused:
-       put_unused_fd(fd);
-out_fput:
-       fput(filp);
-       return ret;
 }
 
 static int

-- 
2.53.0


Reply via email to