init: add an init_dup helper 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@lst.de> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
diff --git a/fs/init.c b/fs/init.c index db5c48a..e9c320a 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(fd, get_file(file)); + return 0; +}
diff --git a/include/linux/init_syscalls.h b/include/linux/init_syscalls.h index 3654b52..92045d1 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 1c710d3..9dae9c4 100644 --- a/init/main.c +++ b/init/main.c
@@ -1467,10 +1467,10 @@ 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); + fput(file); } static noinline void __init kernel_init_freeable(void)