From: Arnaud Patard (Rtp) <arnaud.patard@rtp-net.org>
To: Riku Voipio <riku.voipio@iki.fi>
Cc: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH] fix fcntl support in linux-user.
Date: Tue, 21 Apr 2009 10:21:38 +0200 [thread overview]
Message-ID: <87d4b6fmct.fsf@lechat.rtp-net.org> (raw)
In-Reply-To: <20090420132206.GB10865@kos.to> (Riku Voipio's message of "Mon\, 20 Apr 2009 16\:22\:06 +0300")
[-- Attachment #1: Type: text/plain, Size: 977 bytes --]
Riku Voipio <riku.voipio@iki.fi> writes:
Hi,
> On Sun, Apr 19, 2009 at 10:45:39PM +0200, Arnaud Patard wrote:
>>
>> The current code in do_fcntl is passing the target command as a host
>> command. This is introducing 2 problems:
>>
>> - When building with "-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE", we
>> may end up passing commands like F_GETFL instead of F_GETFL64. This is
>> likely to return an error.
>>
>> - The F_*64 constants doesn't always have the same value between host
>> and target.
>
> This appears to be the case for some other fcntl constants as well. Howabout
> implementing this as a target_to_host_fcntl_cmd() mapping function instead?
Ok, done. New patch attached. Please comment :)
>
>> Without this patch locking is not working (My test-case was pwck with arm as
>> target and mips as host).
>
> Could you also add the MIPS target definition for F_*64 so that mips on arm
> would get fixed too?
oops. Forgot to include that in my patch
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: fix_fcntl-2.patch --]
[-- Type: text/x-diff, Size: 5432 bytes --]
Index: qemu/linux-user/syscall.c
===================================================================
--- qemu.orig/linux-user/syscall.c
+++ qemu/linux-user/syscall.c
@@ -253,6 +253,18 @@ static bitmask_transtbl fcntl_flags_tbl[
{ 0, 0, 0, 0 }
};
+static char target_to_host_fcntl_cmd[] = {
+ [ TARGET_F_GETLK ] = F_GETLK,
+ [ TARGET_F_SETLK ] = F_SETLK,
+ [ TARGET_F_SETLKW ] = F_SETLKW,
+ [ TARGET_F_GETLK64 ] = F_GETLK64,
+ [ TARGET_F_SETLK64 ] = F_SETLK64,
+ [ TARGET_F_SETLKW64 ] = F_SETLKW64,
+ [ TARGET_F_SETOWN ] = F_SETOWN,
+ [ TARGET_F_GETOWN ] = F_GETOWN,
+ [ TARGET_F_SETSIG ] = F_SETSIG,
+ [ TARGET_F_GETSIG ] = F_GETSIG,
+};
#define COPY_UTSNAME_FIELD(dest, src) \
do { \
/* __NEW_UTS_LEN doesn't include terminating null */ \
@@ -3365,6 +3377,7 @@ static abi_long do_fcntl(int fd, int cmd
struct flock64 fl64;
struct target_flock64 *target_fl64;
abi_long ret;
+ int cmd2 = target_to_host_fcntl_cmd[cmd];
switch(cmd) {
case TARGET_F_GETLK:
@@ -3376,7 +3389,7 @@ static abi_long do_fcntl(int fd, int cmd
fl.l_len = tswapl(target_fl->l_len);
fl.l_pid = tswapl(target_fl->l_pid);
unlock_user_struct(target_fl, arg, 0);
- ret = get_errno(fcntl(fd, cmd, &fl));
+ ret = get_errno(fcntl(fd, cmd2, &fl));
if (ret == 0) {
if (!lock_user_struct(VERIFY_WRITE, target_fl, arg, 0))
return -TARGET_EFAULT;
@@ -3399,7 +3412,7 @@ static abi_long do_fcntl(int fd, int cmd
fl.l_len = tswapl(target_fl->l_len);
fl.l_pid = tswapl(target_fl->l_pid);
unlock_user_struct(target_fl, arg, 0);
- ret = get_errno(fcntl(fd, cmd, &fl));
+ ret = get_errno(fcntl(fd, cmd2, &fl));
break;
case TARGET_F_GETLK64:
@@ -3411,7 +3424,7 @@ static abi_long do_fcntl(int fd, int cmd
fl64.l_len = tswapl(target_fl64->l_len);
fl64.l_pid = tswap16(target_fl64->l_pid);
unlock_user_struct(target_fl64, arg, 0);
- ret = get_errno(fcntl(fd, cmd >> 1, &fl64));
+ ret = get_errno(fcntl(fd, cmd2, &fl64));
if (ret == 0) {
if (!lock_user_struct(VERIFY_WRITE, target_fl64, arg, 0))
return -TARGET_EFAULT;
@@ -3433,18 +3446,25 @@ static abi_long do_fcntl(int fd, int cmd
fl64.l_len = tswapl(target_fl64->l_len);
fl64.l_pid = tswap16(target_fl64->l_pid);
unlock_user_struct(target_fl64, arg, 0);
- ret = get_errno(fcntl(fd, cmd >> 1, &fl64));
+ ret = get_errno(fcntl(fd, cmd2, &fl64));
break;
- case F_GETFL:
- ret = get_errno(fcntl(fd, cmd, arg));
+ case TARGET_F_GETFL:
+ ret = get_errno(fcntl(fd, cmd2, arg));
if (ret >= 0) {
ret = host_to_target_bitmask(ret, fcntl_flags_tbl);
}
break;
- case F_SETFL:
- ret = get_errno(fcntl(fd, cmd, target_to_host_bitmask(arg, fcntl_flags_tbl)));
+ case TARGET_F_SETFL:
+ ret = get_errno(fcntl(fd, cmd2, target_to_host_bitmask(arg, fcntl_flags_tbl)));
+ break;
+
+ case TARGET_F_SETOWN:
+ case TARGET_F_GETOWN:
+ case TARGET_F_SETSIG:
+ case TARGET_F_GETSIG:
+ ret = get_errno(fcntl(fd, cmd2, arg));
break;
default:
@@ -6222,20 +6242,7 @@ abi_long do_syscall(void *cpu_env, int n
struct target_eabi_flock64 *target_efl;
#endif
- switch(arg2){
- case TARGET_F_GETLK64:
- cmd = F_GETLK64;
- break;
- case TARGET_F_SETLK64:
- cmd = F_SETLK64;
- break;
- case TARGET_F_SETLKW64:
- cmd = F_SETLK64;
- break;
- default:
- cmd = arg2;
- break;
- }
+ cmd = target_to_host_fcntl_cmd[arg2];
switch(arg2) {
case TARGET_F_GETLK64:
@@ -6315,7 +6322,7 @@ abi_long do_syscall(void *cpu_env, int n
ret = get_errno(fcntl(arg1, cmd, &fl));
break;
default:
- ret = do_fcntl(arg1, cmd, arg3);
+ ret = do_fcntl(arg1, arg2, arg3);
break;
}
break;
Index: qemu/linux-user/syscall_defs.h
===================================================================
--- qemu.orig/linux-user/syscall_defs.h
+++ qemu/linux-user/syscall_defs.h
@@ -1662,6 +1662,12 @@ struct target_statfs64 {
#define TARGET_F_SETLKW 9
#define TARGET_F_SETOWN 5 /* for sockets. */
#define TARGET_F_GETOWN 6 /* for sockets. */
+#elif defined(TARGET_MIPS)
+#define TARGET_F_GETLK 14
+#define TARGET_F_SETLK 6
+#define TARGET_F_SETLKW 7
+#define TARGET_F_SETOWN 24 /* for sockets. */
+#define TARGET_F_GETOWN 25 /* for sockets. */
#else
#define TARGET_F_GETLK 5
#define TARGET_F_SETLK 6
@@ -1673,10 +1679,15 @@ struct target_statfs64 {
#define TARGET_F_SETSIG 10 /* for sockets. */
#define TARGET_F_GETSIG 11 /* for sockets. */
+#if defined(TARGET_MIPS)
+#define TARGET_F_GETLK64 33 /* using 'struct flock64' */
+#define TARGET_F_SETLK64 34
+#define TARGET_F_SETLKW64 35
+#else
#define TARGET_F_GETLK64 12 /* using 'struct flock64' */
#define TARGET_F_SETLK64 13
#define TARGET_F_SETLKW64 14
-
+#endif
#if defined (TARGET_ARM)
#define TARGET_O_ACCMODE 0003
#define TARGET_O_RDONLY 00
next prev parent reply other threads:[~2009-04-21 8:14 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-04-19 20:45 [Qemu-devel] [PATCH] fix fcntl support in linux-user Arnaud Patard
2009-04-20 13:22 ` Riku Voipio
2009-04-21 8:21 ` Arnaud Patard [this message]
2009-04-21 12:51 ` Riku Voipio
2009-04-21 14:39 ` Jamie Lokier
2009-04-21 17:58 ` Riku Voipio
2009-04-22 10:04 ` Arnaud Patard
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87d4b6fmct.fsf@lechat.rtp-net.org \
--to=arnaud.patard@rtp-net.org \
--cc=qemu-devel@nongnu.org \
--cc=riku.voipio@iki.fi \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.