[ia64] Add accept4() syscall (Closes: #647825)

svn path=/dists/trunk/linux-2.6/; revision=18510
This commit is contained in:
Ben Hutchings 2012-01-12 23:53:23 +00:00
parent 984ee4d67c
commit 036f34422f
3 changed files with 29 additions and 201 deletions

1
debian/changelog vendored
View File

@ -12,6 +12,7 @@ linux-2.6 (3.2.0-1~experimental.1) UNRELEASED; urgency=low
(fixes FTBFS) (fixes FTBFS)
* Install /lib/modules/<kernel-version>/modules.builtin in linux-image * Install /lib/modules/<kernel-version>/modules.builtin in linux-image
packages packages
* [ia64] Add accept4() syscall (Closes: #647825)
[ Bastian Blank ] [ Bastian Blank ]
* crypt: Enable some amd64 only ciphers. * crypt: Enable some amd64 only ciphers.

View File

@ -1,224 +1,52 @@
Date: Sat, 12 Nov 2011 15:17:25 +0100
From: Émeric Maschino <emeric.maschino@gmail.com> From: Émeric Maschino <emeric.maschino@gmail.com>
Subject: ia64: Add accept4() syscall Date: Mon, 9 Jan 2012 12:55:10 -0800
Subject: [PATCH] ia64: Add accept4() syscall
commit 65cc21b4523e94d5640542a818748cd3be8cd6b4 upstream.
While debugging udev > 170 failure on Debian Wheezy While debugging udev > 170 failure on Debian Wheezy
(http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=648325), it appears (http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=648325), it appears
that the issue was in fact due to missing accept4() in ia64. that the issue was in fact due to missing accept4() in ia64.
This patch simply adds accept4() to ia64. The This patch simply adds accept4() to ia64.
arch/ia64/include/asm/unistd.h and arch/ia64/kernel/entry.S diffs
apply cleanly against 3.2-rc1.
Patch has been successfully tested running an ia64-targeted version of
test_accept4.c (modified from x86/x86_64-centric original version from
http://git.kernel.org/linus/de11defebf00007677fb7ee91d9b089b78786fbb):
/* test_accept4.c
Copyright (C) 2008, Linux Foundation, written by Michael Kerrisk
<mtk.manpages@gmail.com>
Licensed under the GNU GPLv2 or later.
*/
#define _GNU_SOURCE
#include <unistd.h>
#include <sys/syscall.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#define PORT_NUM 33333
#define die(msg) do { perror(msg); exit(EXIT_FAILURE); } while (0)
/**********************************************************************/
/* The following is what we need until glibc gets a wrapper for
accept4() */
/* Flags for socket(), socketpair(), accept4() */
#ifndef SOCK_CLOEXEC
#define SOCK_CLOEXEC O_CLOEXEC
#endif
#ifndef SOCK_NONBLOCK
#define SOCK_NONBLOCK O_NONBLOCK
#endif
#define __NR_accept4 1334
static int
__accept4(int fd, struct sockaddr *sockaddr, socklen_t *addrlen, int flags)
{
printf("Calling accept4(): flags = %x", flags);
if (flags != 0) {
printf(" (");
if (flags & SOCK_CLOEXEC)
printf("SOCK_CLOEXEC");
if ((flags & SOCK_CLOEXEC) && (flags & SOCK_NONBLOCK))
printf(" ");
if (flags & SOCK_NONBLOCK)
printf("SOCK_NONBLOCK");
printf(")");
}
printf("\n");
return syscall(__NR_accept4, fd, sockaddr, addrlen, flags);
}
/**********************************************************************/
static int
do_test(int lfd, struct sockaddr_in *conn_addr,
int closeonexec_flag, int nonblock_flag)
{
int connfd, acceptfd;
int fdf, flf, fdf_pass, flf_pass;
struct sockaddr_in claddr;
socklen_t addrlen;
printf("=======================================\n");
connfd = socket(AF_INET, SOCK_STREAM, 0);
if (connfd == -1)
die("socket");
if (connect(connfd, (struct sockaddr *) conn_addr,
sizeof(struct sockaddr_in)) == -1)
die("connect");
addrlen = sizeof(struct sockaddr_in);
acceptfd = __accept4(lfd, (struct sockaddr *) &claddr, &addrlen,
closeonexec_flag | nonblock_flag);
if (acceptfd == -1) {
perror("accept4()");
close(connfd);
return 0;
}
fdf = fcntl(acceptfd, F_GETFD);
if (fdf == -1)
die("fcntl:F_GETFD");
fdf_pass = ((fdf & FD_CLOEXEC) != 0) ==
((closeonexec_flag & SOCK_CLOEXEC) != 0);
printf("Close-on-exec flag is %sset (%s); ",
(fdf & FD_CLOEXEC) ? "" : "not ",
fdf_pass ? "OK" : "failed");
flf = fcntl(acceptfd, F_GETFL);
if (flf == -1)
die("fcntl:F_GETFD");
flf_pass = ((flf & O_NONBLOCK) != 0) ==
((nonblock_flag & SOCK_NONBLOCK) !=0);
printf("nonblock flag is %sset (%s)\n",
(flf & O_NONBLOCK) ? "" : "not ",
flf_pass ? "OK" : "failed");
close(acceptfd);
close(connfd);
printf("Test result: %s\n", (fdf_pass && flf_pass) ? "PASS" : "FAIL");
return fdf_pass && flf_pass;
}
static int
create_listening_socket(int port_num)
{
struct sockaddr_in svaddr;
int lfd;
int optval;
memset(&svaddr, 0, sizeof(struct sockaddr_in));
svaddr.sin_family = AF_INET;
svaddr.sin_addr.s_addr = htonl(INADDR_ANY);
svaddr.sin_port = htons(port_num);
lfd = socket(AF_INET, SOCK_STREAM, 0);
if (lfd == -1)
die("socket");
optval = 1;
if (setsockopt(lfd, SOL_SOCKET, SO_REUSEADDR, &optval,
sizeof(optval)) == -1)
die("setsockopt");
if (bind(lfd, (struct sockaddr *) &svaddr,
sizeof(struct sockaddr_in)) == -1)
die("bind");
if (listen(lfd, 5) == -1)
die("listen");
return lfd;
}
int
main(int argc, char *argv[])
{
struct sockaddr_in conn_addr;
int lfd;
int port_num;
int passed;
passed = 1;
port_num = (argc > 1) ? atoi(argv[1]) : PORT_NUM;
memset(&conn_addr, 0, sizeof(struct sockaddr_in));
conn_addr.sin_family = AF_INET;
conn_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
conn_addr.sin_port = htons(port_num);
lfd = create_listening_socket(port_num);
if (!do_test(lfd, &conn_addr, 0, 0))
passed = 0;
if (!do_test(lfd, &conn_addr, SOCK_CLOEXEC, 0))
passed = 0;
if (!do_test(lfd, &conn_addr, 0, SOCK_NONBLOCK))
passed = 0;
if (!do_test(lfd, &conn_addr, SOCK_CLOEXEC, SOCK_NONBLOCK))
passed = 0;
close(lfd);
exit(passed ? EXIT_SUCCESS : EXIT_FAILURE);
}
Signed-off-by: Émeric Maschino <emeric.maschino@gmail.com> Signed-off-by: Émeric Maschino <emeric.maschino@gmail.com>
[bwh: Backport to 3.1: add non-implemented process_vm{read,write}v] Signed-off-by: Tony Luck <tony.luck@intel.com>
--- ---
arch/ia64/include/asm/unistd.h | 3 ++-
arch/ia64/kernel/entry.S | 1 +
2 files changed, 3 insertions(+), 1 deletions(-)
diff -uprN -X linux-3.2-rc1/Documentation/dontdiff a/arch/ia64/include/asm/unistd.h b/arch/ia64/include/asm/unistd.h diff --git a/arch/ia64/include/asm/unistd.h b/arch/ia64/include/asm/unistd.h
--- a/arch/ia64/include/asm/unistd.h 2011-11-08 01:16:02.000000000 +0100 index 7617248..7a3bd25 100644
+++ b/arch/ia64/include/asm/unistd.h 2011-11-12 11:31:53.000000000 +0100 --- a/arch/ia64/include/asm/unistd.h
@@ -321,11 +321,12 @@ +++ b/arch/ia64/include/asm/unistd.h
#define __NR_syncfs 1329 @@ -323,11 +323,12 @@
#define __NR_setns 1330
#define __NR_sendmmsg 1331 #define __NR_sendmmsg 1331
#define __NR_process_vm_readv 1332
#define __NR_process_vm_writev 1333
+#define __NR_accept4 1334 +#define __NR_accept4 1334
#ifdef __KERNEL__ #ifdef __KERNEL__
-#define NR_syscalls 308 /* length of syscall table */ -#define NR_syscalls 310 /* length of syscall table */
+#define NR_syscalls 311 /* length of syscall table */ +#define NR_syscalls 311 /* length of syscall table */
/* /*
* The following defines stop scripts/checksyscalls.sh from complaining about * The following defines stop scripts/checksyscalls.sh from complaining about
diff -uprN -X linux-3.2-rc1/Documentation/dontdiff a/arch/ia64/kernel/entry.S b/arch/ia64/kernel/entry.S diff --git a/arch/ia64/kernel/entry.S b/arch/ia64/kernel/entry.S
--- a/arch/ia64/kernel/entry.S 2011-11-08 01:16:02.000000000 +0100 index 5b31d46..1ccbe12 100644
+++ b/arch/ia64/kernel/entry.S 2011-11-12 11:33:40.000000000 +0100 --- a/arch/ia64/kernel/entry.S
@@ -1777,6 +1777,9 @@ sys_call_table: +++ b/arch/ia64/kernel/entry.S
data8 sys_syncfs @@ -1779,6 +1779,7 @@ sys_call_table:
data8 sys_setns // 1330
data8 sys_sendmmsg data8 sys_sendmmsg
+ data8 sys_ni_syscall // process_vm_readv data8 sys_process_vm_readv
+ data8 sys_ni_syscall // process_vm_writev data8 sys_process_vm_writev
+ data8 sys_accept4 + data8 sys_accept4
.org sys_call_table + 8*NR_syscalls // guard against failures to increase NR_syscalls .org sys_call_table + 8*NR_syscalls // guard against failures to increase NR_syscalls
#endif /* __IA64_ASM_PARAVIRTUALIZED_NATIVE */ #endif /* __IA64_ASM_PARAVIRTUALIZED_NATIVE */
--
1.7.8.2

View File

@ -43,8 +43,7 @@
+ bugfix/ia64/nouveau-ACPI-support-is-dependent-on-X86.patch + bugfix/ia64/nouveau-ACPI-support-is-dependent-on-X86.patch
+ features/x86/x86-Add-amilo-rfkill-driver-for-some-Fujitsu-Siemens.patch + features/x86/x86-Add-amilo-rfkill-driver-for-some-Fujitsu-Siemens.patch
# Defer until we're sure about the system call number + bugfix/ia64/ia64-Add-accept4-syscall.patch
#+ bugfix/ia64/ia64-Add-accept4-syscall.patch
+ bugfix/arm/ixp4xx_iobe.patch + bugfix/arm/ixp4xx_iobe.patch
+ debian/bcma-Do-not-claim-PCI-device-IDs-also-claimed-by-brc.patch + debian/bcma-Do-not-claim-PCI-device-IDs-also-claimed-by-brc.patch