]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
nsfs: convert ns_ioctl() to FD_PREPARE()
authorChristian Brauner <brauner@kernel.org>
Sun, 23 Nov 2025 16:33:28 +0000 (17:33 +0100)
committerChristian Brauner <brauner@kernel.org>
Fri, 28 Nov 2025 11:42:32 +0000 (12:42 +0100)
Link: https://patch.msgid.link/20251123-work-fd-prepare-v4-10-b6efa1706cfd@kernel.org
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/nsfs.c

index 339497b1c267abdd48d12ae4550c5d02adf452f5..375390bf810d35e4eda36e90170d434f3886f2c2 100644 (file)
--- a/fs/nsfs.c
+++ b/fs/nsfs.c
@@ -301,7 +301,6 @@ static long ns_ioctl(struct file *filp, unsigned int ioctl,
                struct mnt_ns_info kinfo = {};
                struct mnt_ns_info __user *uinfo = (struct mnt_ns_info __user *)arg;
                struct path path __free(path_put) = {};
-               struct file *f __free(fput) = NULL;
                size_t usize = _IOC_SIZE(ioctl);
 
                if (ns->ns_type != CLONE_NEWNS)
@@ -320,28 +319,18 @@ static long ns_ioctl(struct file *filp, unsigned int ioctl,
                if (ret)
                        return ret;
 
-               CLASS(get_unused_fd, fd)(O_CLOEXEC);
-               if (fd < 0)
-                       return fd;
-
-               f = dentry_open(&path, O_RDONLY, current_cred());
-               if (IS_ERR(f))
-                       return PTR_ERR(f);
-
-               if (uinfo) {
-                       /*
-                        * If @uinfo is passed return all information about the
-                        * mount namespace as well.
-                        */
-                       ret = copy_ns_info_to_user(to_mnt_ns(ns), uinfo, usize, &kinfo);
-                       if (ret)
-                               return ret;
-               }
-
-               /* Transfer reference of @f to caller's fdtable. */
-               fd_install(fd, no_free_ptr(f));
-               /* File descriptor is live so hand it off to the caller. */
-               return take_fd(fd);
+               FD_PREPARE(fdf, O_CLOEXEC, dentry_open(&path, O_RDONLY, current_cred()));
+               if (fdf.err)
+                       return fdf.err;
+               /*
+                * If @uinfo is passed return all information about the
+                * mount namespace as well.
+                */
+               ret = copy_ns_info_to_user(to_mnt_ns(ns), uinfo, usize, &kinfo);
+               if (ret)
+                       return ret;
+               ret = fd_publish(fdf);
+               break;
        }
        default:
                ret = -ENOTTY;