Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1759145AbXKUH3u (ORCPT ); Wed, 21 Nov 2007 02:29:50 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1758538AbXKUH3V (ORCPT ); Wed, 21 Nov 2007 02:29:21 -0500 Received: from mx1.redhat.com ([66.187.233.31]:43555 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1758520AbXKUH3U (ORCPT ); Wed, 21 Nov 2007 02:29:20 -0500 Date: Wed, 21 Nov 2007 02:28:50 -0500 From: Ulrich Drepper Message-Id: <200711210728.lAL7So5L015049@devserv.devel.redhat.com> To: linux-kernel@vger.kernel.org Subject: [PATCHv5 3/5] Allow setting FD_CLOEXEC flag for new sockets Cc: akpm@linux-foundation.org, mingo@elte.hu, tglx@linutronix.de, torvalds@linux-foundation.org Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3739 Lines: 141 This is a first user of sys_indirect. Several of the socket-related system calls which produce a file handle now can be passed an additional parameter to set the FD_CLOEXEC flag. include/asm-x86/ia32_unistd.h | 1 + include/linux/indirect.h | 27 +++++++++++++++++++++++++++ net/socket.c | 21 +++++++++++++-------- 3 files changed, 41 insertions(+), 8 deletions(-) diff -u linux/include/linux/indirect.h linux/include/linux/indirect.h --- linux/include/linux/indirect.h +++ linux/include/linux/indirect.h @@ -1,3 +1,4 @@ +#ifndef INDSYSCALL #ifndef _LINUX_INDIRECT_H #define _LINUX_INDIRECT_H @@ -13,5 +14,31 @@ + struct { + int flags; + } file_flags; }; #define INDIRECT_PARAM(set, name) current->indirect_params.set.name #endif +#else + +/* Here comes the list of system calls which can be called through + sys_indirect. When the list if support system calls is needed the + file including this header is supposed to define a macro "INDSYSCALL" + which adds a prefix fitting to the use. If the resulting macro is + defined we generate a line + case MACRO: + */ +#if INDSYSCALL(accept) + case INDSYSCALL(accept): +#endif +#if INDSYSCALL(socket) + case INDSYSCALL(socket): +#endif +#if INDSYSCALL(socketcall) + case INDSYSCALL(socketcall): +#endif +#if INDSYSCALL(socketpair) + case INDSYSCALL(socketpair): +#endif + +#endif --- linux/include/asm-x86/ia32_unistd.h +++ linux/include/asm-x86/ia32_unistd.h @@ -12,6 +12,7 @@ #define __NR_ia32_exit 1 #define __NR_ia32_read 3 #define __NR_ia32_write 4 +#define __NR_ia32_socketcall 102 #define __NR_ia32_sigreturn 119 #define __NR_ia32_rt_sigreturn 173 diff -u linux/net/socket.c linux/net/socket.c --- linux/net/socket.c +++ linux/net/socket.c @@ -344,11 +344,11 @@ * but we take care of internal coherence yet. */ -static int sock_alloc_fd(struct file **filep) +static int sock_alloc_fd(struct file **filep, int flags) { int fd; - fd = get_unused_fd(); + fd = get_unused_fd_flags(flags); if (likely(fd >= 0)) { struct file *file = get_empty_filp(); @@ -391,10 +391,10 @@ return 0; } -int sock_map_fd(struct socket *sock) +static int sock_map_fd_flags(struct socket *sock, int flags) { struct file *newfile; - int fd = sock_alloc_fd(&newfile); + int fd = sock_alloc_fd(&newfile, flags); if (likely(fd >= 0)) { int err = sock_attach_fd(sock, newfile); @@ -409,6 +409,11 @@ return fd; } +int sock_map_fd(struct socket *sock) +{ + return sock_map_fd_flags(sock, 0); +} + static struct socket *sock_from_file(struct file *file, int *err) { if (file->f_op == &socket_file_ops) @@ -1208,7 +1213,7 @@ if (retval < 0) goto out; - retval = sock_map_fd(sock); + retval = sock_map_fd_flags(sock, INDIRECT_PARAM(file_flags, flags)); if (retval < 0) goto out_release; @@ -1249,13 +1254,13 @@ if (err < 0) goto out_release_both; - fd1 = sock_alloc_fd(&newfile1); + fd1 = sock_alloc_fd(&newfile1, INDIRECT_PARAM(file_flags, flags)); if (unlikely(fd1 < 0)) { err = fd1; goto out_release_both; } - fd2 = sock_alloc_fd(&newfile2); + fd2 = sock_alloc_fd(&newfile2, INDIRECT_PARAM(file_flags, flags)); if (unlikely(fd2 < 0)) { err = fd2; put_filp(newfile1); @@ -1411,7 +1416,7 @@ */ __module_get(newsock->ops->owner); - newfd = sock_alloc_fd(&newfile); + newfd = sock_alloc_fd(&newfile, INDIRECT_PARAM(file_flags, flags)); if (unlikely(newfd < 0)) { err = newfd; sock_release(newsock); - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/