172 lines
7.5 KiB
Diff
172 lines
7.5 KiB
Diff
|
From e4f2e031fe5b5f9f11560a51ce607ffdd3090c05 Mon Sep 17 00:00:00 2001
|
||
|
From: Ulrich Hecht <uli@suse.de>
|
||
|
Date: Thu, 23 Jul 2009 15:10:30 +0200
|
||
|
Subject: [PATCH 27/33] linux-user: fcntl fixes for LTP
|
||
|
|
||
|
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 4fb7998..86754f1 100644
|
||
|
--- a/linux-user/syscall.c
|
||
|
+++ b/linux-user/syscall.c
|
||
|
@@ -3705,6 +3705,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;
|
||
|
}
|
||
|
@@ -3731,7 +3739,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) {
|
||
|
@@ -3741,7 +3749,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;
|
||
|
@@ -3754,7 +3762,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;
|
||
|
@@ -3766,7 +3774,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) {
|
||
|
@@ -3776,7 +3784,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;
|
||
|
@@ -3788,7 +3796,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;
|
||
|
@@ -3808,6 +3816,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;
|
||
|
|
||
|
@@ -6630,7 +6640,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
|
||
|
@@ -6641,7 +6651,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));
|
||
|
@@ -6654,7 +6664,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
|
||
|
@@ -6665,7 +6675,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);
|
||
|
}
|
||
|
}
|
||
|
@@ -6681,7 +6691,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
|
||
|
@@ -6692,7 +6702,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 0f4fbd7..481ce59 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
|
||
|
|