[PATCH RFC POC 37/50] tpm: vtpm_proxy: install the server descriptor when the ioctl returns

From: Christian Brauner

Date: Tue Sep 15 2026 - 08:20:22 EST


Rely on the fd exit path machinery.

Signed-off-by: Christian Brauner (Amutable) <brauner@xxxxxxxxxx>
---
drivers/char/tpm/tpm_vtpm_proxy.c | 30 +++++++++---------------------
1 file changed, 9 insertions(+), 21 deletions(-)

diff --git a/drivers/char/tpm/tpm_vtpm_proxy.c b/drivers/char/tpm/tpm_vtpm_proxy.c
index b81fd2a537df..8eb87044596a 100644
--- a/drivers/char/tpm/tpm_vtpm_proxy.c
+++ b/drivers/char/tpm/tpm_vtpm_proxy.c
@@ -531,8 +531,8 @@ static struct file *vtpm_proxy_create_device(
struct vtpm_proxy_new_dev *vtpm_new_dev)
{
struct proxy_dev *proxy_dev;
- int rc, fd;
struct file *file;
+ int rc;

if (vtpm_new_dev->flags & ~VTPM_PROXY_FLAGS_ALL)
return ERR_PTR(-EOPNOTSUPP);
@@ -544,20 +544,15 @@ static struct file *vtpm_proxy_create_device(
proxy_dev->flags = vtpm_new_dev->flags;

/* setup an anonymous file for the server-side */
- fd = get_unused_fd_flags(O_RDWR);
- if (fd < 0) {
- rc = fd;
+ FD_PREPARE(fdf, O_RDWR,
+ anon_inode_getfile("[vtpms]", &vtpm_proxy_fops, proxy_dev,
+ O_RDWR));
+ if (IS_ERR(fdf)) {
+ rc = PTR_ERR(fdf);
goto err_delete_proxy_dev;
}
+ file = fd_prepare_file(fdf);

- file = anon_inode_getfile("[vtpms]", &vtpm_proxy_fops, proxy_dev,
- O_RDWR);
- if (IS_ERR(file)) {
- rc = PTR_ERR(file);
- goto err_put_unused_fd;
- }
-
- /* from now on we can unwind with put_unused_fd() + fput() */
/* simulate an open() on the server side */
vtpm_proxy_fops_open(file);

@@ -566,16 +561,13 @@ static struct file *vtpm_proxy_create_device(

vtpm_proxy_work_start(proxy_dev);

- vtpm_new_dev->fd = fd;
+ vtpm_new_dev->fd = fd_prepare_fd(fdf);
vtpm_new_dev->major = MAJOR(proxy_dev->chip->dev.devt);
vtpm_new_dev->minor = MINOR(proxy_dev->chip->dev.devt);
vtpm_new_dev->tpm_num = proxy_dev->chip->dev_num;

return file;

-err_put_unused_fd:
- put_unused_fd(fd);
-
err_delete_proxy_dev:
vtpm_proxy_delete_proxy_dev(proxy_dev);

@@ -640,13 +632,9 @@ static long vtpmx_ioc_new_dev(struct file *file, unsigned int ioctl,
return PTR_ERR(vtpm_file);

if (copy_to_user(vtpm_new_dev_p, &vtpm_new_dev,
- sizeof(vtpm_new_dev))) {
- put_unused_fd(vtpm_new_dev.fd);
- fput(vtpm_file);
+ sizeof(vtpm_new_dev)))
return -EFAULT;
- }

- fd_install(vtpm_new_dev.fd, vtpm_file);
return 0;
}


--
2.53.0