Merge tag 'tif-task_work.arch-2020-12-14' of git://git.kernel.dk/linux-block
[linux-2.6-microblaze.git] / kernel / kcmp.c
index b3ff928..5353edf 100644 (file)
@@ -61,39 +61,34 @@ static int kcmp_ptr(void *v1, void *v2, enum kcmp_type type)
 static struct file *
 get_file_raw_ptr(struct task_struct *task, unsigned int idx)
 {
-       struct file *file = NULL;
+       struct file *file;
 
-       task_lock(task);
        rcu_read_lock();
-
-       if (task->files)
-               file = fcheck_files(task->files, idx);
-
+       file = task_lookup_fd_rcu(task, idx);
        rcu_read_unlock();
-       task_unlock(task);
 
        return file;
 }
 
-static void kcmp_unlock(struct mutex *m1, struct mutex *m2)
+static void kcmp_unlock(struct rw_semaphore *l1, struct rw_semaphore *l2)
 {
-       if (likely(m2 != m1))
-               mutex_unlock(m2);
-       mutex_unlock(m1);
+       if (likely(l2 != l1))
+               up_read(l2);
+       up_read(l1);
 }
 
-static int kcmp_lock(struct mutex *m1, struct mutex *m2)
+static int kcmp_lock(struct rw_semaphore *l1, struct rw_semaphore *l2)
 {
        int err;
 
-       if (m2 > m1)
-               swap(m1, m2);
+       if (l2 > l1)
+               swap(l1, l2);
 
-       err = mutex_lock_killable(m1);
-       if (!err && likely(m1 != m2)) {
-               err = mutex_lock_killable_nested(m2, SINGLE_DEPTH_NESTING);
+       err = down_read_killable(l1);
+       if (!err && likely(l1 != l2)) {
+               err = down_read_killable_nested(l2, SINGLE_DEPTH_NESTING);
                if (err)
-                       mutex_unlock(m1);
+                       up_read(l1);
        }
 
        return err;
@@ -107,7 +102,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 +110,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);
@@ -173,8 +156,8 @@ SYSCALL_DEFINE5(kcmp, pid_t, pid1, pid_t, pid2, int, type,
        /*
         * One should have enough rights to inspect task details.
         */
-       ret = kcmp_lock(&task1->signal->exec_update_mutex,
-                       &task2->signal->exec_update_mutex);
+       ret = kcmp_lock(&task1->signal->exec_update_lock,
+                       &task2->signal->exec_update_lock);
        if (ret)
                goto err;
        if (!ptrace_may_access(task1, PTRACE_MODE_READ_REALCREDS) ||
@@ -229,8 +212,8 @@ SYSCALL_DEFINE5(kcmp, pid_t, pid1, pid_t, pid2, int, type,
        }
 
 err_unlock:
-       kcmp_unlock(&task1->signal->exec_update_mutex,
-                   &task2->signal->exec_update_mutex);
+       kcmp_unlock(&task1->signal->exec_update_lock,
+                   &task2->signal->exec_update_lock);
 err:
        put_task_struct(task1);
        put_task_struct(task2);