When discussing[1] exec and posix file locks it was realized that none
of the callers of get_files_struct fundamentally needed to call
get_files_struct, and that by switching them to helper functions
instead it will both simplify their code and remove unnecessary
increments of files_struct.count.  Those unnecessary increments can
result in exec unnecessarily unsharing files_struct which breaking
posix locks, and it can result in fget_light having to fallback to
fget reducing system performance.

Use fget_task to simplify bpf_task_fd_query.

[1] https://lkml.kernel.org/r/[email protected]
Suggested-by: Oleg Nesterov <[email protected]>
Signed-off-by: "Eric W. Biederman" <[email protected]>
---
 kernel/bpf/syscall.c | 20 +++-----------------
 1 file changed, 3 insertions(+), 17 deletions(-)

diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c
index 86299a292214..93657d5f6538 100644
--- a/kernel/bpf/syscall.c
+++ b/kernel/bpf/syscall.c
@@ -3741,7 +3741,6 @@ static int bpf_task_fd_query(const union bpf_attr *attr,
        pid_t pid = attr->task_fd_query.pid;
        u32 fd = attr->task_fd_query.fd;
        const struct perf_event *event;
-       struct files_struct *files;
        struct task_struct *task;
        struct file *file;
        int err;
@@ -3759,23 +3758,11 @@ static int bpf_task_fd_query(const union bpf_attr *attr,
        if (!task)
                return -ENOENT;
 
-       files = get_files_struct(task);
-       put_task_struct(task);
-       if (!files)
-               return -ENOENT;
-
        err = 0;
-       spin_lock(&files->file_lock);
-       file = fcheck_files(files, fd);
+       file = fget_task(task, fd);
+       put_task_struct(task);
        if (!file)
-               err = -EBADF;
-       else
-               get_file(file);
-       spin_unlock(&files->file_lock);
-       put_files_struct(files);
-
-       if (err)
-               goto out;
+               return -EBADF;
 
        if (file->f_op == &bpf_link_fops) {
                struct bpf_link *link = file->private_data;
@@ -3815,7 +3802,6 @@ static int bpf_task_fd_query(const union bpf_attr *attr,
        err = -ENOTSUPP;
 put_file:
        fput(file);
-out:
        return err;
 }
 
-- 
2.25.0

Reply via email to