From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LvtRq-00043K-Ln for qemu-devel@nongnu.org; Mon, 20 Apr 2009 09:22:10 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LvtRq-000438-6T for qemu-devel@nongnu.org; Mon, 20 Apr 2009 09:22:10 -0400 Received: from [199.232.76.173] (port=41170 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LvtRq-000435-0l for qemu-devel@nongnu.org; Mon, 20 Apr 2009 09:22:10 -0400 Received: from naru.obs2.net ([84.20.150.76]:35991) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1LvtRp-0006q9-BF for qemu-devel@nongnu.org; Mon, 20 Apr 2009 09:22:09 -0400 Date: Mon, 20 Apr 2009 16:22:06 +0300 From: Riku Voipio Subject: Re: [Qemu-devel] [PATCH] fix fcntl support in linux-user. Message-ID: <20090420132206.GB10865@kos.to> References: <87r5zofk3w.fsf@lechat.rtp-net.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <87r5zofk3w.fsf@lechat.rtp-net.org> Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: arnaud.patard@rtp-net.org 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? > 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? > Signed-off-by: Arnaud Patard > --- > diff --git a/linux-user/syscall.c b/linux-user/syscall.c > index 2d51d6b..2d876c1 100644 > --- a/linux-user/syscall.c > +++ b/linux-user/syscall.c > @@ -3126,7 +3141,7 @@ static abi_long do_fcntl(int fd, int cmd, abi_ulong arg) > 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, F_GETLK, &fl)); > if (ret == 0) { > if (!lock_user_struct(VERIFY_WRITE, target_fl, arg, 0)) > return -TARGET_EFAULT; > @@ -3149,7 +3164,7 @@ static abi_long do_fcntl(int fd, int cmd, abi_ulong arg) > 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, F_SETLK+(cmd-TARGET_F_SETLK), &fl)); > break; > > case TARGET_F_GETLK64: > @@ -3161,7 +3176,7 @@ static abi_long do_fcntl(int fd, int cmd, abi_ulong arg) > 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, F_GETLK64, &fl64)); > if (ret == 0) { > if (!lock_user_struct(VERIFY_WRITE, target_fl64, arg, 0)) > return -TARGET_EFAULT; > @@ -3183,7 +3198,7 @@ static abi_long do_fcntl(int fd, int cmd, abi_ulong arg) > 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, F_SETLK64+(cmd-TARGET_F_SETLK64), &fl64)); > break; > > case F_GETFL: > @@ -6022,7 +6039,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, > ret = get_errno(fcntl(arg1, cmd, &fl)); > break; > default: > - ret = do_fcntl(arg1, cmd, arg3); > + ret = do_fcntl(arg1, arg2, arg3); > break; > } > break;