summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Brauner <brauner@kernel.org>2026-09-10 17:48:01 +0200
committerChristian Brauner <brauner@kernel.org>2026-09-14 15:58:06 +0200
commitfb11a079b003554f2cc8b4a8205bf23a0d9beddf (patch)
tree5a852dbd9baaff77d058eb1bb205e3c0526a0ef6
parent3a70f44797b692ea09b557bee83159cd507c5a2b (diff)
downloadlinux-next-fb11a079b003554f2cc8b4a8205bf23a0d9beddf.tar.gz
linux-next-fb11a079b003554f2cc8b4a8205bf23a0d9beddf.zip
fs: move unshare_fd() to fs/file.c
Move unshare_fd() where the rest of the descriptor table lifecycle helpers live. No functional changes. Link: https://patch.msgid.link/20260910-work-coredump-unlock-self-v4-3-a5c1800dc930@kernel.org Reviewed-by: NeilBrown <neil@brown.name> Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
-rw-r--r--fs/file.c18
-rw-r--r--include/linux/fdtable.h1
-rw-r--r--kernel/fork.c18
3 files changed, 19 insertions, 18 deletions
diff --git a/fs/file.c b/fs/file.c
index 345011dad472..636a87e527b3 100644
--- a/fs/file.c
+++ b/fs/file.c
@@ -471,6 +471,24 @@ struct files_struct *dup_fd(struct files_struct *oldf, struct fd_range *punch_ho
return newf;
}
+/*
+ * Unshare file descriptor table if it is being shared
+ */
+int unshare_fd(unsigned long unshare_flags, struct files_struct **new_fdp)
+{
+ struct files_struct *fd = current->files;
+
+ if ((unshare_flags & CLONE_FILES) &&
+ (fd && atomic_read(&fd->count) > 1)) {
+ fd = dup_fd(fd, NULL);
+ if (IS_ERR(fd))
+ return PTR_ERR(fd);
+ *new_fdp = fd;
+ }
+
+ return 0;
+}
+
static struct fdtable *close_files(struct files_struct * files)
{
/*
diff --git a/include/linux/fdtable.h b/include/linux/fdtable.h
index 9614c6ecd477..4ee1598848bb 100644
--- a/include/linux/fdtable.h
+++ b/include/linux/fdtable.h
@@ -102,6 +102,7 @@ struct task_struct;
void put_files_struct(struct files_struct *fs);
void switch_files_struct(struct task_struct *tsk, struct files_struct *files);
int unshare_files(void);
+int unshare_fd(unsigned long unshare_flags, struct files_struct **new_fdp);
struct fd_range {
unsigned int from, to;
};
diff --git a/kernel/fork.c b/kernel/fork.c
index f09ca97411a2..9daf6e94bd5d 100644
--- a/kernel/fork.c
+++ b/kernel/fork.c
@@ -3211,24 +3211,6 @@ static int unshare_fs(unsigned long unshare_flags, struct fs_struct **new_fsp)
}
/*
- * Unshare file descriptor table if it is being shared
- */
-static int unshare_fd(unsigned long unshare_flags, struct files_struct **new_fdp)
-{
- struct files_struct *fd = current->files;
-
- if ((unshare_flags & CLONE_FILES) &&
- (fd && atomic_read(&fd->count) > 1)) {
- fd = dup_fd(fd, NULL);
- if (IS_ERR(fd))
- return PTR_ERR(fd);
- *new_fdp = fd;
- }
-
- return 0;
-}
-
-/*
* unshare allows a process to 'unshare' part of the process
* context which was originally shared using clone. copy_*
* functions used by kernel_clone() cannot be used here directly