Add a simple helper to grab a reference to a file and install it at the next available fd, and switch the early init code over to it. Signed-off-by: Christoph Hellwig <hch@xxxxxx> --- fs/init.c | 12 ++++++++++++ include/linux/init_syscalls.h | 1 + init/main.c | 7 +++---- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/fs/init.c b/fs/init.c index db5c48a85644fa..730e05acda2392 100644 --- a/fs/init.c +++ b/fs/init.c @@ -8,6 +8,7 @@ #include <linux/namei.h> #include <linux/fs.h> #include <linux/fs_struct.h> +#include <linux/file.h> #include <linux/init_syscalls.h> #include <linux/security.h> #include "internal.h" @@ -251,3 +252,14 @@ int __init init_utimes(char *filename, struct timespec64 *ts) path_put(&path); return error; } + +int __init init_dup(struct file *file) +{ + int fd; + + fd = get_unused_fd_flags(0); + if (fd < 0) + return fd; + fd_install(get_unused_fd_flags(0), get_file(file)); + return 0; +} diff --git a/include/linux/init_syscalls.h b/include/linux/init_syscalls.h index 3654b525ac0b17..92045d18cbfc99 100644 --- a/include/linux/init_syscalls.h +++ b/include/linux/init_syscalls.h @@ -16,3 +16,4 @@ int __init init_unlink(const char *pathname); int __init init_mkdir(const char *pathname, umode_t mode); int __init init_rmdir(const char *pathname); int __init init_utimes(char *filename, struct timespec64 *ts); +int __init init_dup(struct file *file); diff --git a/init/main.c b/init/main.c index 1c710d3e1d461a..089e21504b1fc1 100644 --- a/init/main.c +++ b/init/main.c @@ -1467,10 +1467,9 @@ void __init console_on_rootfs(void) pr_err("Warning: unable to open an initial console.\n"); return; } - get_file_rcu_many(file, 2); - fd_install(get_unused_fd_flags(0), file); - fd_install(get_unused_fd_flags(0), file); - fd_install(get_unused_fd_flags(0), file); + init_dup(file); + init_dup(file); + init_dup(file); } static noinline void __init kernel_init_freeable(void) -- 2.27.0