Signed-off-by: Christian Brauner --- virt/kvm/guest_memfd.c | 35 +++++++++++------------------------ 1 file changed, 11 insertions(+), 24 deletions(-) diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c index fbca8c0972da..1d583d0cf6b9 100644 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@ -493,28 +493,20 @@ bool __weak kvm_arch_supports_gmem_init_shared(struct kvm *kvm) static int __kvm_gmem_create(struct kvm *kvm, loff_t size, u64 flags) { const char *anon_name = "[kvm-gmem]"; - struct kvm_gmem *gmem; + struct kvm_gmem *gmem __free(kfree) = NULL; struct inode *inode; struct file *file; - int fd, err; - - fd = get_unused_fd_flags(0); - if (fd < 0) - return fd; gmem = kzalloc(sizeof(*gmem), GFP_KERNEL); - if (!gmem) { - err = -ENOMEM; - goto err_fd; - } + if (!gmem) + return -ENOMEM; - file = anon_inode_create_getfile(anon_name, &kvm_gmem_fops, gmem, - O_RDWR, NULL); - if (IS_ERR(file)) { - err = PTR_ERR(file); - goto err_gmem; - } + FD_PREPARE(fdf, 0, anon_inode_create_getfile(anon_name, &kvm_gmem_fops, + gmem, O_RDWR, NULL)); + if (fdf.err) + return fdf.err; + file = fd_prepare_file(fdf); file->f_flags |= O_LARGEFILE; inode = file->f_inode; @@ -535,14 +527,9 @@ static int __kvm_gmem_create(struct kvm *kvm, loff_t size, u64 flags) xa_init(&gmem->bindings); list_add(&gmem->entry, &inode->i_mapping->i_private_list); - fd_install(fd, file); - return fd; - -err_gmem: - kfree(gmem); -err_fd: - put_unused_fd(fd); - return err; + /* Ownership of gmem transferred to file */ + retain_and_null_ptr(gmem); + return fd_publish(fdf); } int kvm_gmem_create(struct kvm *kvm, struct kvm_create_guest_memfd *args) -- 2.47.3