diff options
| -rw-r--r-- | include/uapi/linux/pidfd.h | 12 | ||||
| -rw-r--r-- | kernel/pid.c | 12 | 
2 files changed, 19 insertions, 5 deletions
| diff --git a/include/uapi/linux/pidfd.h b/include/uapi/linux/pidfd.h new file mode 100644 index 000000000000..5406fbc13074 --- /dev/null +++ b/include/uapi/linux/pidfd.h @@ -0,0 +1,12 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + +#ifndef _UAPI_LINUX_PIDFD_H +#define _UAPI_LINUX_PIDFD_H + +#include <linux/types.h> +#include <linux/fcntl.h> + +/* Flags for pidfd_open().  */ +#define PIDFD_NONBLOCK O_NONBLOCK + +#endif /* _UAPI_LINUX_PIDFD_H */ diff --git a/kernel/pid.c b/kernel/pid.c index b2562a7ce525..74ddbff1a6ba 100644 --- a/kernel/pid.c +++ b/kernel/pid.c @@ -43,6 +43,7 @@  #include <linux/sched/task.h>  #include <linux/idr.h>  #include <net/sock.h> +#include <uapi/linux/pidfd.h>  struct pid init_struct_pid = {  	.count		= REFCOUNT_INIT(1), @@ -522,7 +523,8 @@ struct pid *find_ge_pid(int nr, struct pid_namespace *ns)  /**   * pidfd_create() - Create a new pid file descriptor.   * - * @pid:  struct pid that the pidfd will reference + * @pid:   struct pid that the pidfd will reference + * @flags: flags to pass   *   * This creates a new pid file descriptor with the O_CLOEXEC flag set.   * @@ -532,12 +534,12 @@ struct pid *find_ge_pid(int nr, struct pid_namespace *ns)   * Return: On success, a cloexec pidfd is returned.   *         On error, a negative errno number will be returned.   */ -static int pidfd_create(struct pid *pid) +static int pidfd_create(struct pid *pid, unsigned int flags)  {  	int fd;  	fd = anon_inode_getfd("[pidfd]", &pidfd_fops, get_pid(pid), -			      O_RDWR | O_CLOEXEC); +			      flags | O_RDWR | O_CLOEXEC);  	if (fd < 0)  		put_pid(pid); @@ -565,7 +567,7 @@ SYSCALL_DEFINE2(pidfd_open, pid_t, pid, unsigned int, flags)  	int fd;  	struct pid *p; -	if (flags) +	if (flags & ~PIDFD_NONBLOCK)  		return -EINVAL;  	if (pid <= 0) @@ -576,7 +578,7 @@ SYSCALL_DEFINE2(pidfd_open, pid_t, pid, unsigned int, flags)  		return -ESRCH;  	if (pid_has_task(p, PIDTYPE_TGID)) -		fd = pidfd_create(p); +		fd = pidfd_create(p, flags);  	else  		fd = -EINVAL; | 
