]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
kcmp: In kcmp_epoll_target use fget_task
authorEric W. Biederman <ebiederm@xmission.com>
Fri, 20 Nov 2020 23:14:21 +0000 (17:14 -0600)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 21 Jun 2024 12:52:47 +0000 (14:52 +0200)
[ Upstream commit f43c283a89a7dc531a47d4b1e001503cf3dc3234 ]

Use the helper fget_task and simplify the code.

As well as simplifying the code this removes one unnecessary increment of
struct files_struct.  This unnecessary increment of files_struct.count can
result in exec unnecessarily unsharing files_struct and breaking posix
locks, and it can result in fget_light having to fallback to fget reducing
performance.

Suggested-by: Oleg Nesterov <oleg@redhat.com>
Reviewed-by: Cyrill Gorcunov <gorcunov@gmail.com>
v1: https://lkml.kernel.org/r/20200817220425.9389-4-ebiederm@xmission.com
Link: https://lkml.kernel.org/r/20201120231441.29911-4-ebiederm@xmission.com
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
kernel/kcmp.c

index c0d2ad9b4705d81505cfec595bd7d3d0ac33121e..bd6f9edf98fd3a1d40107d80dc41894da0c750b6 100644 (file)
@@ -107,7 +107,6 @@ static int kcmp_epoll_target(struct task_struct *task1,
 {
        struct file *filp, *filp_epoll, *filp_tgt;
        struct kcmp_epoll_slot slot;
-       struct files_struct *files;
 
        if (copy_from_user(&slot, uslot, sizeof(slot)))
                return -EFAULT;
@@ -116,23 +115,12 @@ static int kcmp_epoll_target(struct task_struct *task1,
        if (!filp)
                return -EBADF;
 
-       files = get_files_struct(task2);
-       if (!files)
+       filp_epoll = fget_task(task2, slot.efd);
+       if (!filp_epoll)
                return -EBADF;
 
-       spin_lock(&files->file_lock);
-       filp_epoll = fcheck_files(files, slot.efd);
-       if (filp_epoll)
-               get_file(filp_epoll);
-       else
-               filp_tgt = ERR_PTR(-EBADF);
-       spin_unlock(&files->file_lock);
-       put_files_struct(files);
-
-       if (filp_epoll) {
-               filp_tgt = get_epoll_tfile_raw_ptr(filp_epoll, slot.tfd, slot.toff);
-               fput(filp_epoll);
-       }
+       filp_tgt = get_epoll_tfile_raw_ptr(filp_epoll, slot.tfd, slot.toff);
+       fput(filp_epoll);
 
        if (IS_ERR(filp_tgt))
                return PTR_ERR(filp_tgt);