If 'open_fd' being passed in is != -1, make accept4() use the specific fd instead of finding a free unused one. Signed-off-by: Jens Axboe <axboe@xxxxxxxxx> --- include/linux/socket.h | 2 +- net/socket.c | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/include/linux/socket.h b/include/linux/socket.h index fc59ac825561..ce6c97d4a439 100644 --- a/include/linux/socket.h +++ b/include/linux/socket.h @@ -405,7 +405,7 @@ extern int __sys_sendto(int fd, void __user *buff, size_t len, int addr_len); extern int __sys_accept4_file(struct file *file, unsigned file_flags, struct sockaddr __user *upeer_sockaddr, - int __user *upeer_addrlen, int flags); + int __user *upeer_addrlen, int flags, int open_fd); extern int __sys_accept4(int fd, struct sockaddr __user *upeer_sockaddr, int __user *upeer_addrlen, int flags); extern int __sys_socket(int family, int type, int protocol); diff --git a/net/socket.c b/net/socket.c index 70ede74ab24b..a9793b778701 100644 --- a/net/socket.c +++ b/net/socket.c @@ -1707,7 +1707,7 @@ SYSCALL_DEFINE2(listen, int, fd, int, backlog) int __sys_accept4_file(struct file *file, unsigned file_flags, struct sockaddr __user *upeer_sockaddr, - int __user *upeer_addrlen, int flags) + int __user *upeer_addrlen, int flags, int open_fd) { struct socket *sock, *newsock; struct file *newfile; @@ -1719,6 +1719,8 @@ int __sys_accept4_file(struct file *file, unsigned file_flags, if (SOCK_NONBLOCK != O_NONBLOCK && (flags & SOCK_NONBLOCK)) flags = (flags & ~SOCK_NONBLOCK) | O_NONBLOCK; + if (open_fd != -1) + flags |= O_SPECIFIC_FD; sock = sock_from_file(file, &err); if (!sock) @@ -1738,7 +1740,7 @@ int __sys_accept4_file(struct file *file, unsigned file_flags, */ __module_get(newsock->ops->owner); - newfd = get_unused_fd_flags(flags); + newfd = get_specific_unused_fd_flags(open_fd, flags); if (unlikely(newfd < 0)) { err = newfd; sock_release(newsock); @@ -1807,7 +1809,7 @@ int __sys_accept4(int fd, struct sockaddr __user *upeer_sockaddr, f = fdget(fd); if (f.file) { ret = __sys_accept4_file(f.file, 0, upeer_sockaddr, - upeer_addrlen, flags); + upeer_addrlen, flags, -1); if (f.flags) fput(f.file); } -- 2.25.1