--- ./include/linux/socket.h.diff02	2010-01-25 14:52:26.000000000 +0300
+++ ./include/linux/socket.h	2010-01-25 16:02:00.000000000 +0300
@@ -88,7 +88,6 @@ enum sock_type {
 extern int vz_security_proto_check(int family, int type, int protocol);
 
 struct socket;
-struct file * sock_map_file(struct socket *sock);
 extern int sock_map_fd(struct socket *sock);
 extern struct socket *sockfd_lookup(int fd, int *err);
 
--- ./include/linux/net.h.diff02	2010-01-25 14:52:26.000000000 +0300
+++ ./include/linux/net.h	2010-01-25 16:02:00.000000000 +0300
@@ -88,6 +88,13 @@ enum sock_type {
 };
 
 #define SOCK_MAX (SOCK_PACKET + 1)
+/* Mask which covers at least up to SOCK_MASK-1.  The
+ * remaining bits are used as flags. */
+#define SOCK_TYPE_MASK 0xf
+
+/* Flags for socket, socketpair, accept4 */
+#define SOCK_CLOEXEC	O_CLOEXEC
+#define SOCK_NONBLOCK	O_NONBLOCK
 
 #endif /* ARCH_HAS_SOCKET_TYPES */
 
--- ./net/socket.c.diff02	2010-01-25 14:52:26.000000000 +0300
+++ ./net/socket.c	2010-01-25 16:08:24.000000000 +0300
@@ -365,7 +365,7 @@ static struct dentry_operations sockfs_d
  *	but we take care of internal coherence yet.
  */
 
-struct file * sock_map_file(struct socket *sock)
+static struct file * sock_map_file_flags(struct socket *sock, int flags)
 {
 	struct file *file;
 	struct qstr this;
@@ -396,13 +396,13 @@ file->f_mapping = file->f_dentry->d_inod
 	sock->file = file;
 	file->f_op = SOCK_INODE(sock)->i_fop = &socket_file_ops;
 	file->f_mode = FMODE_READ | FMODE_WRITE;
-	file->f_flags = O_RDWR;
+	file->f_flags = O_RDWR | (flags & O_NONBLOCK);
 	file->f_pos = 0;
 
 	return file;
 }
 
-int sock_map_fd(struct socket *sock)
+int sock_map_fd_flags(struct socket *sock, int flags)
 {
 	int fd;
 	struct file *file;
@@ -411,11 +411,11 @@ int sock_map_fd(struct socket *sock)
 	 *	Find a file descriptor suitable for return to the user. 
 	 */
   
-	fd = get_unused_fd();
+	fd = get_unused_fd_flags(flags);
 	if (fd < 0)
 		return fd;
   
-	file = sock_map_file(sock);
+	file = sock_map_file_flags(sock, flags);
 	if (IS_ERR(file)) {
 		put_unused_fd(fd);
 		return PTR_ERR(file);
@@ -425,6 +425,11 @@ int sock_map_fd(struct socket *sock)
 	return fd;
 }
 
+int sock_map_fd(struct socket *sock)
+{
+	return sock_map_fd_flags(sock, 0);
+}
+
 /**
  *	sockfd_lookup	- 	Go from a file number to its socket slot
  *	@fd: file handle
@@ -1248,12 +1253,22 @@ asmlinkage long sys_socket(int family, i
 {
 	int retval;
 	struct socket *sock;
+	int flags;
+
+	/* Check the SOCK_* constants for consistency.  */
+	BUILD_BUG_ON((SOCK_MAX | SOCK_TYPE_MASK) != SOCK_TYPE_MASK);
+	BUILD_BUG_ON((SOCK_CLOEXEC | SOCK_NONBLOCK) & SOCK_TYPE_MASK);
+
+	flags = type & ~SOCK_TYPE_MASK;
+	if (flags & ~(SOCK_CLOEXEC | SOCK_NONBLOCK))
+		return -EINVAL;
+	type &= SOCK_TYPE_MASK;
 
 	retval = sock_create(family, type, protocol, &sock);
 	if (retval < 0)
 		goto out;
 
-	retval = sock_map_fd(sock);
+	retval = sock_map_fd_flags(sock, flags);
 	if (retval < 0)
 		goto out_release;
 
@@ -1274,6 +1289,12 @@ asmlinkage long sys_socketpair(int famil
 {
 	struct socket *sock1, *sock2;
 	int fd1, fd2, err;
+	int flags;
+
+	flags = type & ~SOCK_TYPE_MASK;
+	if (flags & ~(SOCK_CLOEXEC | SOCK_NONBLOCK))
+		return -EINVAL;
+	type &= SOCK_TYPE_MASK;
 
 	/*
 	 * Obtain the first socket and check if the underlying protocol
@@ -1294,12 +1315,12 @@ asmlinkage long sys_socketpair(int famil
 
 	fd1 = fd2 = -1;
 
-	err = sock_map_fd(sock1);
+	err = sock_map_fd_flags(sock1, flags);
 	if (err < 0)
 		goto out_release_both;
 	fd1 = err;
 
-	err = sock_map_fd(sock2);
+	err = sock_map_fd_flags(sock2, flags);
 	if (err < 0)
 		goto out_close_1;
 	fd2 = err;
@@ -1404,12 +1425,15 @@ asmlinkage long sys_listen(int fd, int b
  *	clean when we restucture accept also.
  */
 
-asmlinkage long sys_accept(int fd, struct sockaddr __user *upeer_sockaddr, int __user *upeer_addrlen)
+asmlinkage long sys_accept4(int fd, struct sockaddr __user *upeer_sockaddr, int __user *upeer_addrlen, int flags)
 {
 	struct socket *sock, *newsock;
 	int err, len;
 	char address[MAX_SOCK_ADDR];
 
+	if (flags & ~(SOCK_CLOEXEC | SOCK_NONBLOCK))
+		return -EINVAL;
+
 	sock = sockfd_lookup(fd, &err);
 	if (!sock)
 		goto out;
@@ -1447,7 +1471,7 @@ asmlinkage long sys_accept(int fd, struc
 
 	/* File flags are not inherited via accept() unlike another OSes. */
 
-	if ((err = sock_map_fd(newsock)) < 0)
+	if ((err = sock_map_fd_flags(newsock, flags)) < 0)
 		goto out_release;
 
 	security_socket_post_accept(sock, newsock);
@@ -1461,6 +1485,10 @@ out_release:
 	goto out_put;
 }
 
+asmlinkage long sys_accept(int fd, struct sockaddr __user *upeer_sockaddr, int __user *upeer_addrlen)
+{
+	return sys_accept4(fd, upeer_sockaddr, upeer_addrlen, 0);
+}
 
 /*
  *	Attempt to connect to a socket with the server address.  The address
