diff --git a/include/asm-x86_64/unistd.h b/include/asm-x86_64/unistd.h
index 8129ac5..ef81a07 100644
--- a/include/asm-x86_64/unistd.h
+++ b/include/asm-x86_64/unistd.h
@@ -631,7 +631,8 @@ __SYSCALL(__NR_move_pages, sys_move_pages)
 __SYSCALL(285, sys_ni_syscall_warn)
 __SYSCALL(286, sys_ni_syscall_warn)
 __SYSCALL(287, sys_ni_syscall_warn)
-__SYSCALL(288, sys_ni_syscall_warn)
+#define __NR_accept4		288
+__SYSCALL(__NR_accept4, sys_accept4)
 __SYSCALL(289, sys_ni_syscall_warn)
 __SYSCALL(290, sys_ni_syscall_warn)
 __SYSCALL(291, sys_ni_syscall_warn)
diff --git a/include/linux/net.h b/include/linux/net.h
index ff2609a..b08c470 100644
--- a/include/linux/net.h
+++ b/include/linux/net.h
@@ -43,6 +43,7 @@ struct inode;
 #define SYS_GETSOCKOPT	15		/* sys_getsockopt(2)		*/
 #define SYS_SENDMSG	16		/* sys_sendmsg(2)		*/
 #define SYS_RECVMSG	17		/* sys_recvmsg(2)		*/
+#define SYS_ACCEPT4	18		/* sys_accept4(2)		*/
 
 typedef enum {
 	SS_FREE = 0,			/* not allocated		*/
diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h
index 13a1f2e..b1a8a43 100644
--- a/include/linux/syscalls.h
+++ b/include/linux/syscalls.h
@@ -408,6 +408,7 @@ asmlinkage long sys_getsockopt(int fd, int level, int optname,
 asmlinkage long sys_bind(int, struct sockaddr __user *, int);
 asmlinkage long sys_connect(int, struct sockaddr __user *, int);
 asmlinkage long sys_accept(int, struct sockaddr __user *, int __user *);
+asmlinkage long sys_accept4(int, struct sockaddr __user *, int __user *, int);
 asmlinkage long sys_getsockname(int, struct sockaddr __user *, int __user *);
 asmlinkage long sys_getpeername(int, struct sockaddr __user *, int __user *);
 asmlinkage long sys_send(int, void __user *, size_t, unsigned);
diff --git a/kernel/sys.c b/kernel/sys.c
index b6f9608..1caa43c 100644
--- a/kernel/sys.c
+++ b/kernel/sys.c
@@ -26,6 +26,7 @@ cond_syscall(sys_socketpair);
 cond_syscall(sys_bind)
 cond_syscall(sys_listen)
 cond_syscall(sys_accept)
+cond_syscall(sys_accept4)
 cond_syscall(sys_connect)
 cond_syscall(sys_getsockname)
 cond_syscall(sys_getpeername)
diff --git a/net/compat.c b/net/compat.c
index 86d3ebc..c2ab407 100644
--- a/net/compat.c
+++ b/net/compat.c
@@ -790,9 +790,9 @@ EXPORT_SYMBOL(compat_mc_getsockopt);
 
 /* Argument list sizes for compat_sys_socketcall */
 #define AL(x) ((x) * sizeof(u32))
-static unsigned char nas[18]={AL(0),AL(3),AL(3),AL(3),AL(2),AL(3),
+static unsigned char nas[19]={AL(0),AL(3),AL(3),AL(3),AL(2),AL(3),
 				AL(3),AL(3),AL(4),AL(4),AL(4),AL(6),
-				AL(6),AL(2),AL(5),AL(5),AL(3),AL(3)};
+				AL(6),AL(2),AL(5),AL(5),AL(3),AL(3),AL(4)};
 #undef AL
 
 asmlinkage long compat_sys_sendmsg(int fd, struct compat_msghdr __user *msg, unsigned flags)
@@ -811,7 +811,7 @@ asmlinkage long compat_sys_socketcall(int call, u32 __user *args)
 	u32 a[6];
 	u32 a0, a1;
 				 
-	if (call < SYS_SOCKET || call > SYS_RECVMSG)
+	if (call < SYS_SOCKET || call > SYS_ACCEPT4)
 		return -EINVAL;
 	if (copy_from_user(a, args, nas[call]))
 		return -EFAULT;
@@ -872,6 +872,9 @@ asmlinkage long compat_sys_socketcall(int call, u32 __user *args)
 	case SYS_RECVMSG:
 		ret = compat_sys_recvmsg(a0, compat_ptr(a1), a[2]);
 		break;
+	case SYS_ACCEPT4:
+		ret = sys_accept4(a0, compat_ptr(a1), compat_ptr(a[2]), a[3]);
+		break;
 	default:
 		ret = -EINVAL;
 		break;
diff --git a/net/socket.c b/net/socket.c
index 7234ba9..0f33ea5 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -2056,9 +2056,9 @@ out:
 
 /* Argument list sizes for sys_socketcall */
 #define AL(x) ((x) * sizeof(unsigned long))
-static unsigned char nargs[18]={AL(0),AL(3),AL(3),AL(3),AL(2),AL(3),
+static unsigned char nargs[19]={AL(0),AL(3),AL(3),AL(3),AL(2),AL(3),
 				AL(3),AL(3),AL(4),AL(4),AL(4),AL(6),
-				AL(6),AL(2),AL(5),AL(5),AL(3),AL(3)};
+				AL(6),AL(2),AL(5),AL(5),AL(3),AL(3),AL(4)};
 #undef AL
 
 /*
@@ -2075,7 +2075,7 @@ asmlinkage long sys_socketcall(int call, unsigned long __user *args)
 	unsigned long a0,a1;
 	int err;
 
-	if(call<1||call>SYS_RECVMSG)
+	if(call<1||call>SYS_ACCEPT4)
 		return -EINVAL;
 
 	/* copy_from_user should be SMP safe. */
@@ -2144,6 +2144,10 @@ asmlinkage long sys_socketcall(int call, unsigned long __user *args)
 		case SYS_RECVMSG:
 			err = sys_recvmsg(a0, (struct msghdr __user *) a1, a[2]);
 			break;
+		case SYS_ACCEPT4:
+			err = sys_accept4(a0, (struct sockaddr __user *)a1,
+				  (int __user *)a[2], a[3]);
+			break;
 		default:
 			err = -EINVAL;
 			break;
