mm: use pidfd_get_task()
Instead of duplicating the same code in two places use the newly added pidfd_get_task() helper. This fixes an (unimportant for now) bug where PIDTYPE_PID is used whereas PIDTYPE_TGID should have been used. Link: https://lore.kernel.org/r/20211004125050.1153693-3-christian.brauner@ubuntu.com Link: https://lore.kernel.org/r/20211011133245.1703103-3-brauner@kernel.org Cc: Vlastimil Babka <vbabka@suse.cz> Cc: Suren Baghdasaryan <surenb@google.com> Cc: Matthew Bobrowski <repnop@google.com> Cc: Alexander Duyck <alexander.h.duyck@linux.intel.com> Cc: David Hildenbrand <david@redhat.com> Cc: Jan Kara <jack@suse.cz> Cc: Minchan Kim <minchan@kernel.org> Reviewed-by: Matthew Bobrowski <repnop@google.com> Acked-by: David Hildenbrand <david@redhat.com> Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
This commit is contained in:
parent
e9bdcdbf69
commit
ee9955d61a
15
mm/madvise.c
15
mm/madvise.c
@ -1235,7 +1235,6 @@ SYSCALL_DEFINE5(process_madvise, int, pidfd, const struct iovec __user *, vec,
|
||||
struct iovec iovstack[UIO_FASTIOV], iovec;
|
||||
struct iovec *iov = iovstack;
|
||||
struct iov_iter iter;
|
||||
struct pid *pid;
|
||||
struct task_struct *task;
|
||||
struct mm_struct *mm;
|
||||
size_t total_len;
|
||||
@ -1250,18 +1249,12 @@ SYSCALL_DEFINE5(process_madvise, int, pidfd, const struct iovec __user *, vec,
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
|
||||
pid = pidfd_get_pid(pidfd, &f_flags);
|
||||
if (IS_ERR(pid)) {
|
||||
ret = PTR_ERR(pid);
|
||||
task = pidfd_get_task(pidfd, &f_flags);
|
||||
if (IS_ERR(task)) {
|
||||
ret = PTR_ERR(task);
|
||||
goto free_iov;
|
||||
}
|
||||
|
||||
task = get_pid_task(pid, PIDTYPE_PID);
|
||||
if (!task) {
|
||||
ret = -ESRCH;
|
||||
goto put_pid;
|
||||
}
|
||||
|
||||
if (!process_madvise_behavior_valid(behavior)) {
|
||||
ret = -EINVAL;
|
||||
goto release_task;
|
||||
@ -1301,8 +1294,6 @@ release_mm:
|
||||
mmput(mm);
|
||||
release_task:
|
||||
put_task_struct(task);
|
||||
put_pid:
|
||||
put_pid(pid);
|
||||
free_iov:
|
||||
kfree(iov);
|
||||
out:
|
||||
|
@ -1151,21 +1151,14 @@ SYSCALL_DEFINE2(process_mrelease, int, pidfd, unsigned int, flags)
|
||||
struct task_struct *p;
|
||||
unsigned int f_flags;
|
||||
bool reap = true;
|
||||
struct pid *pid;
|
||||
long ret = 0;
|
||||
|
||||
if (flags)
|
||||
return -EINVAL;
|
||||
|
||||
pid = pidfd_get_pid(pidfd, &f_flags);
|
||||
if (IS_ERR(pid))
|
||||
return PTR_ERR(pid);
|
||||
|
||||
task = get_pid_task(pid, PIDTYPE_TGID);
|
||||
if (!task) {
|
||||
ret = -ESRCH;
|
||||
goto put_pid;
|
||||
}
|
||||
task = pidfd_get_task(pidfd, &f_flags);
|
||||
if (IS_ERR(task))
|
||||
return PTR_ERR(task);
|
||||
|
||||
/*
|
||||
* Make sure to choose a thread which still has a reference to mm
|
||||
@ -1204,8 +1197,6 @@ drop_mm:
|
||||
mmdrop(mm);
|
||||
put_task:
|
||||
put_task_struct(task);
|
||||
put_pid:
|
||||
put_pid(pid);
|
||||
return ret;
|
||||
#else
|
||||
return -ENOSYS;
|
||||
|
Loading…
Reference in New Issue
Block a user