kernel: add a kernel_wait helper
Add a helper that waits for a pid and stores the status in the passed in kernel pointer. Use it to fix the usage of kernel_wait4 in call_usermodehelper_exec_sync that only happens to work due to the implicit set_fs(KERNEL_DS) for kernel threads. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Reviewed-by: Andrew Morton <akpm@linux-foundation.org> Acked-by: "Eric W. Biederman" <ebiederm@xmission.com> Cc: Luis Chamberlain <mcgrof@kernel.org> Link: http://lkml.kernel.org/r/20200721130449.5008-1-hch@lst.de Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
committed by
Linus Torvalds
parent
f48ff83e9c
commit
8043fc147a
@@ -1626,6 +1626,22 @@ long kernel_wait4(pid_t upid, int __user *stat_addr, int options,
|
||||
return ret;
|
||||
}
|
||||
|
||||
int kernel_wait(pid_t pid, int *stat)
|
||||
{
|
||||
struct wait_opts wo = {
|
||||
.wo_type = PIDTYPE_PID,
|
||||
.wo_pid = find_get_pid(pid),
|
||||
.wo_flags = WEXITED,
|
||||
};
|
||||
int ret;
|
||||
|
||||
ret = do_wait(&wo);
|
||||
if (ret > 0 && wo.wo_stat)
|
||||
*stat = wo.wo_stat;
|
||||
put_pid(wo.wo_pid);
|
||||
return ret;
|
||||
}
|
||||
|
||||
SYSCALL_DEFINE4(wait4, pid_t, upid, int __user *, stat_addr,
|
||||
int, options, struct rusage __user *, ru)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user