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:
Michael Tokarev 2024-08-29 09:39:50 +03:00
parent 5691f4778e
commit ac1bbe8ca4
1 changed files with 30 additions and 32 deletions

View File

@ -759,10 +759,8 @@ safe_syscall6(ssize_t, copy_file_range, int, infd, loff_t *, pinoff,
* the libc function. * the libc function.
*/ */
#define safe_ioctl(...) safe_syscall(__NR_ioctl, __VA_ARGS__) #define safe_ioctl(...) safe_syscall(__NR_ioctl, __VA_ARGS__)
/* Similarly for fcntl. Note that callers must always: /* Similarly for fcntl. Since we always build with LFS enabled,
* pass the F_GETLK64 etc constants rather than the unsuffixed F_GETLK * we should be using the 64-bit structures automatically.
* 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.
*/ */
#ifdef __NR_fcntl64 #ifdef __NR_fcntl64
#define safe_fcntl(...) safe_syscall(__NR_fcntl64, __VA_ARGS__) #define safe_fcntl(...) safe_syscall(__NR_fcntl64, __VA_ARGS__)
@ -6722,13 +6720,13 @@ static int target_to_host_fcntl_cmd(int cmd)
ret = cmd; ret = cmd;
break; break;
case TARGET_F_GETLK: case TARGET_F_GETLK:
ret = F_GETLK64; ret = F_GETLK;
break; break;
case TARGET_F_SETLK: case TARGET_F_SETLK:
ret = F_SETLK64; ret = F_SETLK;
break; break;
case TARGET_F_SETLKW: case TARGET_F_SETLKW:
ret = F_SETLKW64; ret = F_SETLKW;
break; break;
case TARGET_F_GETOWN: case TARGET_F_GETOWN:
ret = F_GETOWN; ret = F_GETOWN;
@ -6744,13 +6742,13 @@ static int target_to_host_fcntl_cmd(int cmd)
break; break;
#if TARGET_ABI_BITS == 32 #if TARGET_ABI_BITS == 32
case TARGET_F_GETLK64: case TARGET_F_GETLK64:
ret = F_GETLK64; ret = F_GETLK;
break; break;
case TARGET_F_SETLK64: case TARGET_F_SETLK64:
ret = F_SETLK64; ret = F_SETLK;
break; break;
case TARGET_F_SETLKW64: case TARGET_F_SETLKW64:
ret = F_SETLKW64; ret = F_SETLKW;
break; break;
#endif #endif
case TARGET_F_SETLEASE: 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 * them to 5, 6 and 7 before making the syscall(). Since we make the
* syscall directly, adjust to what is supported by the kernel. * syscall directly, adjust to what is supported by the kernel.
*/ */
if (ret >= F_GETLK64 && ret <= F_SETLKW64) { if (ret >= F_GETLK && ret <= F_SETLKW) {
ret -= F_GETLK64 - 5; ret -= F_GETLK - 5;
} }
#endif #endif
@ -6838,7 +6836,7 @@ static int host_to_target_flock(int type)
return 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) abi_ulong target_flock_addr)
{ {
struct target_flock *target_fl; 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, 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; struct target_flock *target_fl;
short l_type; short l_type;
@ -6882,8 +6880,8 @@ static inline abi_long copy_to_user_flock(abi_ulong target_flock_addr,
return 0; return 0;
} }
typedef abi_long from_flock64_fn(struct flock64 *fl, abi_ulong target_addr); 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 flock64 *fl); typedef abi_long to_flock64_fn(abi_ulong target_addr, const struct flock *fl);
#if defined(TARGET_ARM) && TARGET_ABI_BITS == 32 #if defined(TARGET_ARM) && TARGET_ABI_BITS == 32
struct target_oabi_flock64 { struct target_oabi_flock64 {
@ -6894,7 +6892,7 @@ struct target_oabi_flock64 {
abi_int l_pid; abi_int l_pid;
} QEMU_PACKED; } 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) abi_ulong target_flock_addr)
{ {
struct target_oabi_flock64 *target_fl; 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, 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; struct target_oabi_flock64 *target_fl;
short l_type; short l_type;
@ -6939,7 +6937,7 @@ static inline abi_long copy_to_user_oabi_flock64(abi_ulong target_flock_addr,
} }
#endif #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) abi_ulong target_flock_addr)
{ {
struct target_flock64 *target_fl; 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, 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; struct target_flock64 *target_fl;
short l_type; 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) static abi_long do_fcntl(int fd, int cmd, abi_ulong arg)
{ {
struct flock64 fl64; struct flock fl;
#ifdef F_GETOWN_EX #ifdef F_GETOWN_EX
struct f_owner_ex fox; struct f_owner_ex fox;
struct target_f_owner_ex *target_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) { switch(cmd) {
case TARGET_F_GETLK: case TARGET_F_GETLK:
ret = copy_from_user_flock(&fl64, arg); ret = copy_from_user_flock(&fl, arg);
if (ret) { if (ret) {
return ret; return ret;
} }
ret = get_errno(safe_fcntl(fd, host_cmd, &fl64)); ret = get_errno(safe_fcntl(fd, host_cmd, &fl));
if (ret == 0) { if (ret == 0) {
ret = copy_to_user_flock(arg, &fl64); ret = copy_to_user_flock(arg, &fl);
} }
break; break;
case TARGET_F_SETLK: case TARGET_F_SETLK:
case TARGET_F_SETLKW: case TARGET_F_SETLKW:
ret = copy_from_user_flock(&fl64, arg); ret = copy_from_user_flock(&fl, arg);
if (ret) { if (ret) {
return ret; return ret;
} }
ret = get_errno(safe_fcntl(fd, host_cmd, &fl64)); ret = get_errno(safe_fcntl(fd, host_cmd, &fl));
break; break;
case TARGET_F_GETLK64: case TARGET_F_GETLK64:
case TARGET_F_OFD_GETLK: case TARGET_F_OFD_GETLK:
ret = copy_from_user_flock64(&fl64, arg); ret = copy_from_user_flock64(&fl, arg);
if (ret) { if (ret) {
return ret; return ret;
} }
ret = get_errno(safe_fcntl(fd, host_cmd, &fl64)); ret = get_errno(safe_fcntl(fd, host_cmd, &fl));
if (ret == 0) { if (ret == 0) {
ret = copy_to_user_flock64(arg, &fl64); ret = copy_to_user_flock64(arg, &fl);
} }
break; break;
case TARGET_F_SETLK64: case TARGET_F_SETLK64:
case TARGET_F_SETLKW64: case TARGET_F_SETLKW64:
case TARGET_F_OFD_SETLK: case TARGET_F_OFD_SETLK:
case TARGET_F_OFD_SETLKW: case TARGET_F_OFD_SETLKW:
ret = copy_from_user_flock64(&fl64, arg); ret = copy_from_user_flock64(&fl, arg);
if (ret) { if (ret) {
return ret; return ret;
} }
ret = get_errno(safe_fcntl(fd, host_cmd, &fl64)); ret = get_errno(safe_fcntl(fd, host_cmd, &fl));
break; break;
case TARGET_F_GETFL: 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: case TARGET_NR_fcntl64:
{ {
int cmd; int cmd;
struct flock64 fl; struct flock fl;
from_flock64_fn *copyfrom = copy_from_user_flock64; from_flock64_fn *copyfrom = copy_from_user_flock64;
to_flock64_fn *copyto = copy_to_user_flock64; to_flock64_fn *copyto = copy_to_user_flock64;