From patchwork Mon Jan 7 22:24:46 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laurent Vivier X-Patchwork-Id: 210254 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 8F3F42C0086 for ; Tue, 8 Jan 2013 09:25:06 +1100 (EST) Received: from localhost ([::1]:34480 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TsL7w-0000Gm-Ok for incoming@patchwork.ozlabs.org; Mon, 07 Jan 2013 17:25:04 -0500 Received: from eggs.gnu.org ([208.118.235.92]:47876) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TsL7p-0000Gf-Dw for qemu-devel@nongnu.org; Mon, 07 Jan 2013 17:24:58 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TsL7n-0001iF-M7 for qemu-devel@nongnu.org; Mon, 07 Jan 2013 17:24:57 -0500 Received: from smtp6-g21.free.fr ([2a01:e0c:1:1599::15]:49786) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TsL7n-0001f3-3p for qemu-devel@nongnu.org; Mon, 07 Jan 2013 17:24:55 -0500 Received: from localhost.localdomain (unknown [78.238.229.36]) by smtp6-g21.free.fr (Postfix) with ESMTP id 37D598224C; Mon, 7 Jan 2013 23:24:48 +0100 (CET) From: Laurent Vivier To: qemu-devel@nongnu.org Date: Mon, 7 Jan 2013 23:24:46 +0100 Message-Id: <1357597486-19395-1-git-send-email-laurent@vivier.eu> X-Mailer: git-send-email 1.7.10.4 X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2a01:e0c:1:1599::15 Cc: Riku Voipio , Laurent Vivier , dillona@dillona.com, Richard Henderson Subject: [Qemu-devel] [PATCH] linux-user, alpha: l_type of fcntl() flock differs X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org on alpha, F_RDLCK, F_WRLCK, F_UNLCK, F_EXLCK, F_SHLCK are not the standard ones. This patch allows to run "dpkg" (database lock). Signed-off-by: Laurent Vivier --- linux-user/syscall.c | 50 +++++++++++++++++++++++++++++++++++++++------ linux-user/syscall_defs.h | 18 ++++++++++++++++ 2 files changed, 62 insertions(+), 6 deletions(-) diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 3167a87..2232bb8 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -4512,6 +4512,41 @@ static int target_to_host_fcntl_cmd(int cmd) return -TARGET_EINVAL; } +static short target_to_host_flock_type(short type) +{ + switch (type) { + case TARGET_F_RDLCK: + return F_RDLCK; + case TARGET_F_WRLCK: + return F_WRLCK; + case TARGET_F_UNLCK: + return F_UNLCK; + case TARGET_F_EXLCK: + return F_EXLCK; + case TARGET_F_SHLCK: + return F_SHLCK; + default: + return type; + } +} + +static short host_to_target_flock_type(short type) +{ + switch (type) { + case F_RDLCK: + return TARGET_F_RDLCK; + case F_WRLCK: + return TARGET_F_WRLCK; + case F_UNLCK: + return TARGET_F_UNLCK; + case F_EXLCK: + return TARGET_F_EXLCK; + case F_SHLCK: + return TARGET_F_SHLCK; + default: + return type; + } +} static abi_long do_fcntl(int fd, int cmd, abi_ulong arg) { struct flock fl; @@ -4528,7 +4563,7 @@ static abi_long do_fcntl(int fd, int cmd, abi_ulong arg) case TARGET_F_GETLK: if (!lock_user_struct(VERIFY_READ, target_fl, arg, 1)) return -TARGET_EFAULT; - fl.l_type = tswap16(target_fl->l_type); + fl.l_type = target_to_host_flock_type(tswap16(target_fl->l_type)); fl.l_whence = tswap16(target_fl->l_whence); fl.l_start = tswapal(target_fl->l_start); fl.l_len = tswapal(target_fl->l_len); @@ -4538,7 +4573,7 @@ static abi_long do_fcntl(int fd, int cmd, abi_ulong arg) if (ret == 0) { if (!lock_user_struct(VERIFY_WRITE, target_fl, arg, 0)) return -TARGET_EFAULT; - target_fl->l_type = tswap16(fl.l_type); + target_fl->l_type = host_to_target_flock_type(tswap16(fl.l_type)); target_fl->l_whence = tswap16(fl.l_whence); target_fl->l_start = tswapal(fl.l_start); target_fl->l_len = tswapal(fl.l_len); @@ -4551,7 +4586,7 @@ static abi_long do_fcntl(int fd, int cmd, abi_ulong arg) case TARGET_F_SETLKW: if (!lock_user_struct(VERIFY_READ, target_fl, arg, 1)) return -TARGET_EFAULT; - fl.l_type = tswap16(target_fl->l_type); + fl.l_type = target_to_host_flock_type(tswap16(target_fl->l_type)); fl.l_whence = tswap16(target_fl->l_whence); fl.l_start = tswapal(target_fl->l_start); fl.l_len = tswapal(target_fl->l_len); @@ -4563,7 +4598,8 @@ static abi_long do_fcntl(int fd, int cmd, abi_ulong arg) case TARGET_F_GETLK64: if (!lock_user_struct(VERIFY_READ, target_fl64, arg, 1)) return -TARGET_EFAULT; - fl64.l_type = tswap16(target_fl64->l_type) >> 1; + fl64.l_type = + target_to_host_flock_type(tswap16(target_fl64->l_type)) >> 1; fl64.l_whence = tswap16(target_fl64->l_whence); fl64.l_start = tswap64(target_fl64->l_start); fl64.l_len = tswap64(target_fl64->l_len); @@ -4573,7 +4609,8 @@ static abi_long do_fcntl(int fd, int cmd, abi_ulong arg) if (ret == 0) { if (!lock_user_struct(VERIFY_WRITE, target_fl64, arg, 0)) return -TARGET_EFAULT; - target_fl64->l_type = tswap16(fl64.l_type) >> 1; + target_fl64->l_type = + host_to_target_flock_type(tswap16(fl64.l_type)) >> 1; target_fl64->l_whence = tswap16(fl64.l_whence); target_fl64->l_start = tswap64(fl64.l_start); target_fl64->l_len = tswap64(fl64.l_len); @@ -4585,7 +4622,8 @@ static abi_long do_fcntl(int fd, int cmd, abi_ulong arg) case TARGET_F_SETLKW64: if (!lock_user_struct(VERIFY_READ, target_fl64, arg, 1)) return -TARGET_EFAULT; - fl64.l_type = tswap16(target_fl64->l_type) >> 1; + fl64.l_type = + target_to_host_flock_type(tswap16(target_fl64->l_type)) >> 1; fl64.l_whence = tswap16(target_fl64->l_whence); fl64.l_start = tswap64(target_fl64->l_start); fl64.l_len = tswap64(target_fl64->l_len); diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h index 69aa6b8..6095992 100644 --- a/linux-user/syscall_defs.h +++ b/linux-user/syscall_defs.h @@ -2017,6 +2017,12 @@ struct target_statfs64 { #define TARGET_F_SETLKW 9 #define TARGET_F_SETOWN 5 /* for sockets. */ #define TARGET_F_GETOWN 6 /* for sockets. */ + +#define TARGET_F_RDLCK 1 +#define TARGET_F_WRLCK 2 +#define TARGET_F_UNLCK 8 +#define TARGET_F_EXLCK 16 +#define TARGET_F_SHLCK 32 #elif defined(TARGET_MIPS) #define TARGET_F_GETLK 14 #define TARGET_F_SETLK 6 @@ -2031,6 +2037,18 @@ struct target_statfs64 { #define TARGET_F_GETOWN 9 /* for sockets. */ #endif +#ifndef TARGET_F_RDLCK +#define TARGET_F_RDLCK 0 +#define TARGET_F_WRLCK 1 +#define TARGET_F_UNLCK 2 +#endif + +#ifndef TARGET_F_EXLCK +#define TARGET_F_EXLCK 4 +#define TARGET_F_SHLCK 8 +#endif + + #define TARGET_F_SETSIG 10 /* for sockets. */ #define TARGET_F_GETSIG 11 /* for sockets. */