Rely on the fd exit path machinery.

Signed-off-by: Christian Brauner (Amutable) <[email protected]>
---
 virt/kvm/guest_memfd.c | 20 ++++++++------------
 1 file changed, 8 insertions(+), 12 deletions(-)

diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c
index 625e62e1a031..e0d1cb869342 100644
--- a/virt/kvm/guest_memfd.c
+++ b/virt/kvm/guest_memfd.c
@@ -526,17 +526,16 @@ static int __kvm_gmem_create(struct kvm *kvm, loff_t 
size, u64 flags)
        struct gmem_file *f;
        struct inode *inode;
        struct file *file;
-       int fd, err;
+       const struct fd_slot *fd;
+       int err;
 
-       fd = get_unused_fd_flags(0);
-       if (fd < 0)
-               return fd;
+       fd = fd_prepare(0);
+       if (IS_ERR(fd))
+               return PTR_ERR(fd);
 
        f = kzalloc_obj(*f);
-       if (!f) {
-               err = -ENOMEM;
-               goto err_fd;
-       }
+       if (!f)
+               return -ENOMEM;
 
        /* __fput() will take care of fops_put(). */
        if (!fops_get(&kvm_gmem_fops)) {
@@ -575,8 +574,7 @@ static int __kvm_gmem_create(struct kvm *kvm, loff_t size, 
u64 flags)
        xa_init(&f->bindings);
        list_add(&f->entry, &GMEM_I(inode)->gmem_file_list);
 
-       fd_install(fd, file);
-       return fd;
+       return fd_stage(fd, file);
 
 err_inode:
        iput(inode);
@@ -584,8 +582,6 @@ static int __kvm_gmem_create(struct kvm *kvm, loff_t size, 
u64 flags)
        fops_put(&kvm_gmem_fops);
 err_gmem:
        kfree(f);
-err_fd:
-       put_unused_fd(fd);
        return err;
 }
 

-- 
2.53.0


Reply via email to