diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/fork.c | 25 | 
1 files changed, 3 insertions, 22 deletions
diff --git a/kernel/fork.c b/kernel/fork.c index 18bdc87209d0..cc760491f201 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -2053,23 +2053,10 @@ static int __pidfd_prepare(struct pid *pid, unsigned int flags, struct file **re   */  int pidfd_prepare(struct pid *pid, unsigned int flags, struct file **ret)  { -	if (!pid) -		return -EINVAL; - -	scoped_guard(rcu) { -		struct task_struct *tsk; - -		if (flags & PIDFD_THREAD) -			tsk = pid_task(pid, PIDTYPE_PID); -		else -			tsk = pid_task(pid, PIDTYPE_TGID); -		if (!tsk) -			return -EINVAL; +	bool thread = flags & PIDFD_THREAD; -		/* Don't create pidfds for kernel threads for now. */ -		if (tsk->flags & PF_KTHREAD) -			return -EINVAL; -	} +	if (!pid || !pid_has_task(pid, thread ? PIDTYPE_PID : PIDTYPE_TGID)) +		return -EINVAL;  	return __pidfd_prepare(pid, flags, ret);  } @@ -2416,12 +2403,6 @@ __latent_entropy struct task_struct *copy_process(  	if (clone_flags & CLONE_PIDFD) {  		int flags = (clone_flags & CLONE_THREAD) ? PIDFD_THREAD : 0; -		/* Don't create pidfds for kernel threads for now. */ -		if (args->kthread) { -			retval = -EINVAL; -			goto bad_fork_free_pid; -		} -  		/* Note that no task has been attached to @pid yet. */  		retval = __pidfd_prepare(pid, flags, &pidfile);  		if (retval < 0)  | 
