linux-user/syscall.c: drop 64 suffix from flock64 &Co
Since we are always building with LFS enabled, in particular with -D_FILE_OFFSET_BITS=64, we should always have struct flock mapped to the 64bit variant (with off64_t), and F_GETLK mapped to F_GETLK64 etc, automatically. So there should be no need to explicitly use the "64" suffix for these things anymore. Also fix a misleading comment near safe_fcntl telling us to always use flock64 (since v2.6.0-1311-g435da5e7092a "linux-user: Use safe_syscall wrapper for fcntl"). Reference: https://gitlab.com/qemu-project/qemu/-/issues/2215 Signed-off-by: Michael Tokarev <mjt@tls.msk.ru> Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
5691f4778e
commit
ac1bbe8ca4
@ -759,10 +759,8 @@ safe_syscall6(ssize_t, copy_file_range, int, infd, loff_t *, pinoff,
|
||||
* the libc function.
|
||||
*/
|
||||
#define safe_ioctl(...) safe_syscall(__NR_ioctl, __VA_ARGS__)
|
||||
/* Similarly for fcntl. Note that callers must always:
|
||||
* pass the F_GETLK64 etc constants rather than the unsuffixed F_GETLK
|
||||
* use the flock64 struct rather than unsuffixed flock
|
||||
* This will then work and use a 64-bit offset for both 32-bit and 64-bit hosts.
|
||||
/* Similarly for fcntl. Since we always build with LFS enabled,
|
||||
* we should be using the 64-bit structures automatically.
|
||||
*/
|
||||
#ifdef __NR_fcntl64
|
||||
#define safe_fcntl(...) safe_syscall(__NR_fcntl64, __VA_ARGS__)
|
||||
@ -6722,13 +6720,13 @@ static int target_to_host_fcntl_cmd(int cmd)
|
||||
ret = cmd;
|
||||
break;
|
||||
case TARGET_F_GETLK:
|
||||
ret = F_GETLK64;
|
||||
ret = F_GETLK;
|
||||
break;
|
||||
case TARGET_F_SETLK:
|
||||
ret = F_SETLK64;
|
||||
ret = F_SETLK;
|
||||
break;
|
||||
case TARGET_F_SETLKW:
|
||||
ret = F_SETLKW64;
|
||||
ret = F_SETLKW;
|
||||
break;
|
||||
case TARGET_F_GETOWN:
|
||||
ret = F_GETOWN;
|
||||
@ -6744,13 +6742,13 @@ static int target_to_host_fcntl_cmd(int cmd)
|
||||
break;
|
||||
#if TARGET_ABI_BITS == 32
|
||||
case TARGET_F_GETLK64:
|
||||
ret = F_GETLK64;
|
||||
ret = F_GETLK;
|
||||
break;
|
||||
case TARGET_F_SETLK64:
|
||||
ret = F_SETLK64;
|
||||
ret = F_SETLK;
|
||||
break;
|
||||
case TARGET_F_SETLKW64:
|
||||
ret = F_SETLKW64;
|
||||
ret = F_SETLKW;
|
||||
break;
|
||||
#endif
|
||||
case TARGET_F_SETLEASE:
|
||||
@ -6804,8 +6802,8 @@ static int target_to_host_fcntl_cmd(int cmd)
|
||||
* them to 5, 6 and 7 before making the syscall(). Since we make the
|
||||
* syscall directly, adjust to what is supported by the kernel.
|
||||
*/
|
||||
if (ret >= F_GETLK64 && ret <= F_SETLKW64) {
|
||||
ret -= F_GETLK64 - 5;
|
||||
if (ret >= F_GETLK && ret <= F_SETLKW) {
|
||||
ret -= F_GETLK - 5;
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -6838,7 +6836,7 @@ static int host_to_target_flock(int type)
|
||||
return type;
|
||||
}
|
||||
|
||||
static inline abi_long copy_from_user_flock(struct flock64 *fl,
|
||||
static inline abi_long copy_from_user_flock(struct flock *fl,
|
||||
abi_ulong target_flock_addr)
|
||||
{
|
||||
struct target_flock *target_fl;
|
||||
@ -6863,7 +6861,7 @@ static inline abi_long copy_from_user_flock(struct flock64 *fl,
|
||||
}
|
||||
|
||||
static inline abi_long copy_to_user_flock(abi_ulong target_flock_addr,
|
||||
const struct flock64 *fl)
|
||||
const struct flock *fl)
|
||||
{
|
||||
struct target_flock *target_fl;
|
||||
short l_type;
|
||||
@ -6882,8 +6880,8 @@ static inline abi_long copy_to_user_flock(abi_ulong target_flock_addr,
|
||||
return 0;
|
||||
}
|
||||
|
||||
typedef abi_long from_flock64_fn(struct flock64 *fl, abi_ulong target_addr);
|
||||
typedef abi_long to_flock64_fn(abi_ulong target_addr, const struct flock64 *fl);
|
||||
typedef abi_long from_flock64_fn(struct flock *fl, abi_ulong target_addr);
|
||||
typedef abi_long to_flock64_fn(abi_ulong target_addr, const struct flock *fl);
|
||||
|
||||
#if defined(TARGET_ARM) && TARGET_ABI_BITS == 32
|
||||
struct target_oabi_flock64 {
|
||||
@ -6894,7 +6892,7 @@ struct target_oabi_flock64 {
|
||||
abi_int l_pid;
|
||||
} QEMU_PACKED;
|
||||
|
||||
static inline abi_long copy_from_user_oabi_flock64(struct flock64 *fl,
|
||||
static inline abi_long copy_from_user_oabi_flock64(struct flock *fl,
|
||||
abi_ulong target_flock_addr)
|
||||
{
|
||||
struct target_oabi_flock64 *target_fl;
|
||||
@ -6919,7 +6917,7 @@ static inline abi_long copy_from_user_oabi_flock64(struct flock64 *fl,
|
||||
}
|
||||
|
||||
static inline abi_long copy_to_user_oabi_flock64(abi_ulong target_flock_addr,
|
||||
const struct flock64 *fl)
|
||||
const struct flock *fl)
|
||||
{
|
||||
struct target_oabi_flock64 *target_fl;
|
||||
short l_type;
|
||||
@ -6939,7 +6937,7 @@ static inline abi_long copy_to_user_oabi_flock64(abi_ulong target_flock_addr,
|
||||
}
|
||||
#endif
|
||||
|
||||
static inline abi_long copy_from_user_flock64(struct flock64 *fl,
|
||||
static inline abi_long copy_from_user_flock64(struct flock *fl,
|
||||
abi_ulong target_flock_addr)
|
||||
{
|
||||
struct target_flock64 *target_fl;
|
||||
@ -6964,7 +6962,7 @@ static inline abi_long copy_from_user_flock64(struct flock64 *fl,
|
||||
}
|
||||
|
||||
static inline abi_long copy_to_user_flock64(abi_ulong target_flock_addr,
|
||||
const struct flock64 *fl)
|
||||
const struct flock *fl)
|
||||
{
|
||||
struct target_flock64 *target_fl;
|
||||
short l_type;
|
||||
@ -6985,7 +6983,7 @@ static inline abi_long copy_to_user_flock64(abi_ulong target_flock_addr,
|
||||
|
||||
static abi_long do_fcntl(int fd, int cmd, abi_ulong arg)
|
||||
{
|
||||
struct flock64 fl64;
|
||||
struct flock fl;
|
||||
#ifdef F_GETOWN_EX
|
||||
struct f_owner_ex fox;
|
||||
struct target_f_owner_ex *target_fox;
|
||||
@ -6998,45 +6996,45 @@ static abi_long do_fcntl(int fd, int cmd, abi_ulong arg)
|
||||
|
||||
switch(cmd) {
|
||||
case TARGET_F_GETLK:
|
||||
ret = copy_from_user_flock(&fl64, arg);
|
||||
ret = copy_from_user_flock(&fl, arg);
|
||||
if (ret) {
|
||||
return ret;
|
||||
}
|
||||
ret = get_errno(safe_fcntl(fd, host_cmd, &fl64));
|
||||
ret = get_errno(safe_fcntl(fd, host_cmd, &fl));
|
||||
if (ret == 0) {
|
||||
ret = copy_to_user_flock(arg, &fl64);
|
||||
ret = copy_to_user_flock(arg, &fl);
|
||||
}
|
||||
break;
|
||||
|
||||
case TARGET_F_SETLK:
|
||||
case TARGET_F_SETLKW:
|
||||
ret = copy_from_user_flock(&fl64, arg);
|
||||
ret = copy_from_user_flock(&fl, arg);
|
||||
if (ret) {
|
||||
return ret;
|
||||
}
|
||||
ret = get_errno(safe_fcntl(fd, host_cmd, &fl64));
|
||||
ret = get_errno(safe_fcntl(fd, host_cmd, &fl));
|
||||
break;
|
||||
|
||||
case TARGET_F_GETLK64:
|
||||
case TARGET_F_OFD_GETLK:
|
||||
ret = copy_from_user_flock64(&fl64, arg);
|
||||
ret = copy_from_user_flock64(&fl, arg);
|
||||
if (ret) {
|
||||
return ret;
|
||||
}
|
||||
ret = get_errno(safe_fcntl(fd, host_cmd, &fl64));
|
||||
ret = get_errno(safe_fcntl(fd, host_cmd, &fl));
|
||||
if (ret == 0) {
|
||||
ret = copy_to_user_flock64(arg, &fl64);
|
||||
ret = copy_to_user_flock64(arg, &fl);
|
||||
}
|
||||
break;
|
||||
case TARGET_F_SETLK64:
|
||||
case TARGET_F_SETLKW64:
|
||||
case TARGET_F_OFD_SETLK:
|
||||
case TARGET_F_OFD_SETLKW:
|
||||
ret = copy_from_user_flock64(&fl64, arg);
|
||||
ret = copy_from_user_flock64(&fl, arg);
|
||||
if (ret) {
|
||||
return ret;
|
||||
}
|
||||
ret = get_errno(safe_fcntl(fd, host_cmd, &fl64));
|
||||
ret = get_errno(safe_fcntl(fd, host_cmd, &fl));
|
||||
break;
|
||||
|
||||
case TARGET_F_GETFL:
|
||||
@ -12403,7 +12401,7 @@ static abi_long do_syscall1(CPUArchState *cpu_env, int num, abi_long arg1,
|
||||
case TARGET_NR_fcntl64:
|
||||
{
|
||||
int cmd;
|
||||
struct flock64 fl;
|
||||
struct flock fl;
|
||||
from_flock64_fn *copyfrom = copy_from_user_flock64;
|
||||
to_flock64_fn *copyto = copy_to_user_flock64;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user