Rely on the fd exit path machinery.

Signed-off-by: Christian Brauner (Amutable) <[email protected]>
---
 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

Reply via email to