[RFC PATCH 19/24] file: expose spawn file-action helpers
From: Li Chen <hidden>
Date: 2026-07-16 14:43:18
Also in:
linux-arch, linux-doc, linux-fsdevel, linux-kselftest, linux-mm, linux-security-module, lkml
Subsystem:
filesystems (vfs and infrastructure), the rest · Maintainers:
Alexander Viro, Christian Brauner, Linus Torvalds
Process builders need to apply close_range() and fchdir() while preparing a child. Split the syscall bodies into internal helpers so callers in fs can reuse existing validation and state updates. Keep the helpers internal to fs rather than adding new global interfaces. Assisted-by: Codex:gpt-5.6-sol Signed-off-by: Li Chen <redacted> --- fs/file.c | 11 ++++++++--- fs/internal.h | 2 ++ fs/open.c | 7 ++++++- 3 files changed, 16 insertions(+), 4 deletions(-)
diff --git a/fs/file.c b/fs/file.c
index 628ca07dc4b17..4f4cb1d5752c2 100644
--- a/fs/file.c
+++ b/fs/file.c@@ -805,7 +805,7 @@ static inline void __range_close(struct files_struct *files, unsigned int fd, } /** - * sys_close_range() - Close all file descriptors in a given range. + * do_close_range() - Close all file descriptors in a given range. * * @fd: starting file descriptor to close * @max_fd: last file descriptor to close
@@ -815,8 +815,7 @@ static inline void __range_close(struct files_struct *files, unsigned int fd, * from @fd up to and including @max_fd are closed. * Currently, errors to close a given file descriptor are ignored. */ -SYSCALL_DEFINE3(close_range, unsigned int, fd, unsigned int, max_fd, - unsigned int, flags) +int do_close_range(unsigned int fd, unsigned int max_fd, unsigned int flags) { struct task_struct *me = current; struct files_struct *cur_fds = me->files, *fds = NULL;
@@ -867,6 +866,12 @@ SYSCALL_DEFINE3(close_range, unsigned int, fd, unsigned int, max_fd, return 0; } +SYSCALL_DEFINE3(close_range, unsigned int, fd, unsigned int, max_fd, + unsigned int, flags) +{ + return do_close_range(fd, max_fd, flags); +} + /** * file_close_fd - return file associated with fd * @fd: file descriptor to retrieve file for
diff --git a/fs/internal.h b/fs/internal.h
index 71cc43e72b33e..25492194e2883 100644
--- a/fs/internal.h
+++ b/fs/internal.h@@ -198,6 +198,8 @@ extern struct file *do_file_open_root(const struct path *, extern struct open_how build_open_how(int flags, umode_t mode); extern int build_open_flags(const struct open_how *how, struct open_flags *op); struct file *file_close_fd_locked(struct files_struct *files, unsigned fd); +int do_close_range(unsigned int fd, unsigned int max_fd, unsigned int flags); +int do_fchdir(unsigned int fd); int do_ftruncate(struct file *file, loff_t length, unsigned int flags); int chmod_common(const struct path *path, umode_t mode);
diff --git a/fs/open.c b/fs/open.c
index 408925d7bd0b7..bf9d7bdcf487c 100644
--- a/fs/open.c
+++ b/fs/open.c@@ -568,7 +568,7 @@ SYSCALL_DEFINE1(chdir, const char __user *, filename) return error; } -SYSCALL_DEFINE1(fchdir, unsigned int, fd) +int do_fchdir(unsigned int fd) { CLASS(fd_raw, f)(fd); int error;
@@ -585,6 +585,11 @@ SYSCALL_DEFINE1(fchdir, unsigned int, fd) return error; } +SYSCALL_DEFINE1(fchdir, unsigned int, fd) +{ + return do_fchdir(fd); +} + SYSCALL_DEFINE1(chroot, const char __user *, filename) { struct path path;
--
2.52.0