Rely on the fd exit path machinery.

Signed-off-by: Christian Brauner (Amutable) <[email protected]>
---
 drivers/hv/mshv_root_main.c | 27 +++++++--------------------
 drivers/hv/mshv_vtl_main.c  | 20 +++++---------------
 2 files changed, 12 insertions(+), 35 deletions(-)

diff --git a/drivers/hv/mshv_root_main.c b/drivers/hv/mshv_root_main.c
index cc2cfce2aefd..c95cee0bae85 100644
--- a/drivers/hv/mshv_root_main.c
+++ b/drivers/hv/mshv_root_main.c
@@ -1072,8 +1072,6 @@ mshv_partition_ioctl_create_vp(struct mshv_partition 
*partition,
        struct mshv_vp *vp;
        struct page *intercept_msg_page, *register_page, *ghcb_page;
        struct hv_stats_page *stats_pages[2];
-       struct file *file;
-       int fd;
        long ret;
 
        if (copy_from_user(&args, arg, sizeof(args)))
@@ -1148,19 +1146,14 @@ mshv_partition_ioctl_create_vp(struct mshv_partition 
*partition,
        if (ret)
                goto put_partition;
 
-       fd = get_unused_fd_flags(O_RDWR | O_CLOEXEC);
-       if (fd < 0) {
-               ret = fd;
+       FD_PREPARE(fdf, O_RDWR | O_CLOEXEC,
+                  anon_inode_getfile("mshv_vp", &mshv_vp_fops, vp,
+                                     O_RDWR | O_CLOEXEC));
+       if (IS_ERR(fdf)) {
+               ret = PTR_ERR(fdf);
                goto remove_debugfs_vp;
        }
 
-       file = anon_inode_getfile("mshv_vp", &mshv_vp_fops, vp,
-                                 O_RDWR | O_CLOEXEC);
-       if (IS_ERR(file)) {
-               ret = PTR_ERR(file);
-               goto put_unused_vp_fd;
-       }
-
        /* already exclusive with the partition mutex for all ioctls */
        partition->pt_vp_count++;
        /*
@@ -1171,17 +1164,11 @@ mshv_partition_ioctl_create_vp(struct mshv_partition 
*partition,
         */
        smp_store_release(&partition->pt_vp_array[args.vp_index], vp);
 
-       /*
-        * fd_install() is the userspace-visibility commit point.  Must be the
-        * last operation that can fail or be observed.
-        */
-       fd_install(fd, file);
-       ret = fd;
+       /* The syscall exit installs the file; nothing after this can fail. */
+       ret = fd_prepare_fd(fdf);
 
        goto out;
 
-put_unused_vp_fd:
-       put_unused_fd(fd);
 remove_debugfs_vp:
        mshv_debugfs_vp_remove(vp);
 put_partition:
diff --git a/drivers/hv/mshv_vtl_main.c b/drivers/hv/mshv_vtl_main.c
index 6e3c11c68171..f14203d76da1 100644
--- a/drivers/hv/mshv_vtl_main.c
+++ b/drivers/hv/mshv_vtl_main.c
@@ -114,29 +114,19 @@ static long
 mshv_ioctl_create_vtl(void __user *user_arg, struct device *module_dev)
 {
        struct mshv_vtl *vtl;
-       struct file *file;
-       int fd;
 
        vtl = kzalloc_obj(*vtl);
        if (!vtl)
                return -ENOMEM;
 
-       fd = get_unused_fd_flags(O_CLOEXEC);
-       if (fd < 0) {
-               kfree(vtl);
-               return fd;
-       }
-       file = anon_inode_getfile("mshv_vtl", &mshv_vtl_fops,
-                                 vtl, O_RDWR);
-       if (IS_ERR(file)) {
-               put_unused_fd(fd);
+       FD_PREPARE(fdf, O_CLOEXEC,
+                  anon_inode_getfile("mshv_vtl", &mshv_vtl_fops, vtl, O_RDWR));
+       if (IS_ERR(fdf)) {
                kfree(vtl);
-               return PTR_ERR(file);
+               return PTR_ERR(fdf);
        }
        vtl->module_dev = module_dev;
-       fd_install(fd, file);
-
-       return fd;
+       return fd_prepare_fd(fdf);
 }
 
 static long

-- 
2.53.0


Reply via email to