[PATCH RFC POC 41/50] KVM: guest_memfd: stop putting the descriptor back on failure

From: Christian Brauner

Date: Tue Sep 15 2026 - 09:12:26 EST


Rely on the fd exit path machinery.

Signed-off-by: Christian Brauner (Amutable) <brauner@xxxxxxxxxx>
---
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