Rely on the fd exit path machinery.

Signed-off-by: Christian Brauner (Amutable) <[email protected]>
---
 kernel/events/core.c | 31 +++++++++++--------------------
 1 file changed, 11 insertions(+), 20 deletions(-)

diff --git a/kernel/events/core.c b/kernel/events/core.c
index a6c8e38a3110..54834a7aca53 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -13924,7 +13924,7 @@ SYSCALL_DEFINE5(perf_event_open,
        struct file *event_file = NULL;
        struct task_struct *task = NULL;
        struct pmu *pmu;
-       int event_fd;
+       const struct fd_slot *event_fd;
        int move_group = 0;
        int err;
        int f_flags = O_RDWR;
@@ -13990,9 +13990,9 @@ SYSCALL_DEFINE5(perf_event_open,
        if (flags & PERF_FLAG_FD_CLOEXEC)
                f_flags |= O_CLOEXEC;
 
-       event_fd = get_unused_fd_flags(f_flags);
-       if (event_fd < 0)
-               return event_fd;
+       event_fd = fd_prepare(f_flags);
+       if (IS_ERR(event_fd))
+               return PTR_ERR(event_fd);
 
        /*
         * Event creation should be under SRCU, see perf_pmu_unregister().
@@ -14001,15 +14001,11 @@ SYSCALL_DEFINE5(perf_event_open,
 
        CLASS(fd, group)(group_fd);     // group_fd == -1 => empty
        if (group_fd != -1) {
-               if (!is_perf_file(group)) {
-                       err = -EBADF;
-                       goto err_fd;
-               }
+               if (!is_perf_file(group))
+                       return -EBADF;
                group_leader = fd_file(group)->private_data;
-               if (group_leader->state <= PERF_EVENT_STATE_EXIT) {
-                       err = -ENODEV;
-                       goto err_fd;
-               }
+               if (group_leader->state <= PERF_EVENT_STATE_EXIT)
+                       return -ENODEV;
                if (flags & PERF_FLAG_FD_OUTPUT)
                        output_event = group_leader;
                if (flags & PERF_FLAG_FD_NO_GROUP)
@@ -14018,10 +14014,8 @@ SYSCALL_DEFINE5(perf_event_open,
 
        if (pid != -1 && !(flags & PERF_FLAG_PID_CGROUP)) {
                task = find_lively_task_by_vpid(pid);
-               if (IS_ERR(task)) {
-                       err = PTR_ERR(task);
-                       goto err_fd;
-               }
+               if (IS_ERR(task))
+                       return PTR_ERR(task);
        }
 
        if (task && group_leader &&
@@ -14298,8 +14292,7 @@ SYSCALL_DEFINE5(perf_event_open,
         * This ensures destruction of the group leader will find
         * the pointer to itself in perf_group_detach().
         */
-       fd_install(event_fd, event_file);
-       return event_fd;
+       return fd_stage(event_fd, event_file);
 
 err_context:
        put_pmu_ctx(event->pmu_ctx);
@@ -14316,8 +14309,6 @@ SYSCALL_DEFINE5(perf_event_open,
 err_task:
        if (task)
                put_task_struct(task);
-err_fd:
-       put_unused_fd(event_fd);
        return err;
 }
 

-- 
2.53.0


Reply via email to