@@ -0,0 +1,168 @@
+Fixes swaps on l_pid which were pretty much of random size. Implements
+F_SETLEASE, F_GETLEASE. Now passes all LTP fcntl tests.
+
+Signed-off-by: Ulrich Hecht <uli@suse.de>
+---
+ linux-user/syscall.c | 34 ++++++++++++++++++++++------------
+ linux-user/syscall_defs.h | 7 +++++++
+ 2 files changed, 29 insertions(+), 12 deletions(-)
+
+diff --git a/linux-user/syscall.c b/linux-user/syscall.c
+index b03e879..d9c4af0 100644
+--- a/linux-user/syscall.c
++++ b/linux-user/syscall.c
+@@ -3678,6 +3678,14 @@ static int target_to_host_fcntl_cmd(int cmd)
+ case TARGET_F_SETLKW64:
+ return F_SETLKW64;
+ #endif
++ case TARGET_F_SETLEASE:
++ return F_SETLEASE;
++ case TARGET_F_GETLEASE:
++ return F_GETLEASE;
++ case TARGET_F_DUPFD_CLOEXEC:
++ return F_DUPFD_CLOEXEC;
++ case TARGET_F_NOTIFY:
++ return F_NOTIFY;
+ default:
+ return -TARGET_EINVAL;
+ }
+@@ -3704,7 +3712,7 @@ static abi_long do_fcntl(int fd, int cmd, abi_ulong arg)
+ fl.l_whence = tswap16(target_fl->l_whence);
+ fl.l_start = tswapl(target_fl->l_start);
+ fl.l_len = tswapl(target_fl->l_len);
+- fl.l_pid = tswapl(target_fl->l_pid);
++ fl.l_pid = tswap32(target_fl->l_pid);
+ unlock_user_struct(target_fl, arg, 0);
+ ret = get_errno(fcntl(fd, host_cmd, &fl));
+ if (ret == 0) {
+@@ -3714,7 +3722,7 @@ static abi_long do_fcntl(int fd, int cmd, abi_ulong arg)
+ target_fl->l_whence = tswap16(fl.l_whence);
+ target_fl->l_start = tswapl(fl.l_start);
+ target_fl->l_len = tswapl(fl.l_len);
+- target_fl->l_pid = tswapl(fl.l_pid);
++ target_fl->l_pid = tswap32(fl.l_pid);
+ unlock_user_struct(target_fl, arg, 1);
+ }
+ break;
+@@ -3727,7 +3735,7 @@ static abi_long do_fcntl(int fd, int cmd, abi_ulong arg)
+ fl.l_whence = tswap16(target_fl->l_whence);
+ fl.l_start = tswapl(target_fl->l_start);
+ fl.l_len = tswapl(target_fl->l_len);
+- fl.l_pid = tswapl(target_fl->l_pid);
++ fl.l_pid = tswap32(target_fl->l_pid);
+ unlock_user_struct(target_fl, arg, 0);
+ ret = get_errno(fcntl(fd, host_cmd, &fl));
+ break;
+@@ -3739,7 +3747,7 @@ static abi_long do_fcntl(int fd, int cmd, abi_ulong arg)
+ fl64.l_whence = tswap16(target_fl64->l_whence);
+ fl64.l_start = tswapl(target_fl64->l_start);
+ fl64.l_len = tswapl(target_fl64->l_len);
+- fl64.l_pid = tswap16(target_fl64->l_pid);
++ fl64.l_pid = tswap32(target_fl64->l_pid);
+ unlock_user_struct(target_fl64, arg, 0);
+ ret = get_errno(fcntl(fd, host_cmd, &fl64));
+ if (ret == 0) {
+@@ -3749,7 +3757,7 @@ static abi_long do_fcntl(int fd, int cmd, abi_ulong arg)
+ target_fl64->l_whence = tswap16(fl64.l_whence);
+ target_fl64->l_start = tswapl(fl64.l_start);
+ target_fl64->l_len = tswapl(fl64.l_len);
+- target_fl64->l_pid = tswapl(fl64.l_pid);
++ target_fl64->l_pid = tswap32(fl64.l_pid);
+ unlock_user_struct(target_fl64, arg, 1);
+ }
+ break;
+@@ -3761,7 +3769,7 @@ static abi_long do_fcntl(int fd, int cmd, abi_ulong arg)
+ fl64.l_whence = tswap16(target_fl64->l_whence);
+ fl64.l_start = tswapl(target_fl64->l_start);
+ fl64.l_len = tswapl(target_fl64->l_len);
+- fl64.l_pid = tswap16(target_fl64->l_pid);
++ fl64.l_pid = tswap32(target_fl64->l_pid);
+ unlock_user_struct(target_fl64, arg, 0);
+ ret = get_errno(fcntl(fd, host_cmd, &fl64));
+ break;
+@@ -3781,6 +3789,8 @@ static abi_long do_fcntl(int fd, int cmd, abi_ulong arg)
+ case TARGET_F_GETOWN:
+ case TARGET_F_SETSIG:
+ case TARGET_F_GETSIG:
++ case TARGET_F_SETLEASE:
++ case TARGET_F_GETLEASE:
+ ret = get_errno(fcntl(fd, host_cmd, arg));
+ break;
+
+@@ -6601,7 +6611,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
+ fl.l_whence = tswap16(target_efl->l_whence);
+ fl.l_start = tswap64(target_efl->l_start);
+ fl.l_len = tswap64(target_efl->l_len);
+- fl.l_pid = tswapl(target_efl->l_pid);
++ fl.l_pid = tswap32(target_efl->l_pid);
+ unlock_user_struct(target_efl, arg3, 0);
+ } else
+ #endif
+@@ -6612,7 +6622,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
+ fl.l_whence = tswap16(target_fl->l_whence);
+ fl.l_start = tswap64(target_fl->l_start);
+ fl.l_len = tswap64(target_fl->l_len);
+- fl.l_pid = tswapl(target_fl->l_pid);
++ fl.l_pid = tswap32(target_fl->l_pid);
+ unlock_user_struct(target_fl, arg3, 0);
+ }
+ ret = get_errno(fcntl(arg1, cmd, &fl));
+@@ -6625,7 +6635,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
+ target_efl->l_whence = tswap16(fl.l_whence);
+ target_efl->l_start = tswap64(fl.l_start);
+ target_efl->l_len = tswap64(fl.l_len);
+- target_efl->l_pid = tswapl(fl.l_pid);
++ target_efl->l_pid = tswap32(fl.l_pid);
+ unlock_user_struct(target_efl, arg3, 1);
+ } else
+ #endif
+@@ -6636,7 +6646,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
+ target_fl->l_whence = tswap16(fl.l_whence);
+ target_fl->l_start = tswap64(fl.l_start);
+ target_fl->l_len = tswap64(fl.l_len);
+- target_fl->l_pid = tswapl(fl.l_pid);
++ target_fl->l_pid = tswap32(fl.l_pid);
+ unlock_user_struct(target_fl, arg3, 1);
+ }
+ }
+@@ -6652,7 +6662,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
+ fl.l_whence = tswap16(target_efl->l_whence);
+ fl.l_start = tswap64(target_efl->l_start);
+ fl.l_len = tswap64(target_efl->l_len);
+- fl.l_pid = tswapl(target_efl->l_pid);
++ fl.l_pid = tswap32(target_efl->l_pid);
+ unlock_user_struct(target_efl, arg3, 0);
+ } else
+ #endif
+@@ -6663,7 +6673,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
+ fl.l_whence = tswap16(target_fl->l_whence);
+ fl.l_start = tswap64(target_fl->l_start);
+ fl.l_len = tswap64(target_fl->l_len);
+- fl.l_pid = tswapl(target_fl->l_pid);
++ fl.l_pid = tswap32(target_fl->l_pid);
+ unlock_user_struct(target_fl, arg3, 0);
+ }
+ ret = get_errno(fcntl(arg1, cmd, &fl));
+diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h
+index 3056997..2771fae 100644
+--- a/linux-user/syscall_defs.h
++++ b/linux-user/syscall_defs.h
+@@ -1824,6 +1824,13 @@ struct target_statfs64 {
+ #define TARGET_F_SETLK64 13
+ #define TARGET_F_SETLKW64 14
+ #endif
++
++#define TARGET_F_LINUX_SPECIFIC_BASE 1024
++#define TARGET_F_SETLEASE (TARGET_F_LINUX_SPECIFIC_BASE + 0)
++#define TARGET_F_GETLEASE (TARGET_F_LINUX_SPECIFIC_BASE + 1)
++#define TARGET_F_DUPFD_CLOEXEC (TARGET_F_LINUX_SPECIFIC_BASE + 6)
++#define TARGET_F_NOTIFY (TARGET_F_LINUX_SPECIFIC_BASE+2)
++
+ #if defined (TARGET_ARM)
+ #define TARGET_O_ACCMODE 0003
+ #define TARGET_O_RDONLY 00
+--
+1.6.2.1
+
+
+
|