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

View File

@ -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;