Patchwork linux-user: fix fallocate

login
register
mail settings
Submitter Alexander Graf
Date Feb. 6, 2012, 8:45 p.m.
Message ID <1328561133-5485-1-git-send-email-agraf@suse.de>
Download mbox | patch
Permalink /patch/139792/
State New
Headers show

Comments

Alexander Graf - Feb. 6, 2012, 8:45 p.m.
Fallocate gets off_t parameters passed in, so we should also read them out
accordingly.

Signed-off-by: Alexander Graf <agraf@suse.de>
---
 linux-user/syscall.c |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)
Peter Maydell - Feb. 6, 2012, 9:03 p.m.
On 6 February 2012 20:45, Alexander Graf <agraf@suse.de> wrote:
> Fallocate gets off_t parameters passed in, so we should also read them out
> accordingly.
>
> Signed-off-by: Alexander Graf <agraf@suse.de>
> ---
>  linux-user/syscall.c |    3 ++-
>  1 files changed, 2 insertions(+), 1 deletions(-)
>
> diff --git a/linux-user/syscall.c b/linux-user/syscall.c
> index ee8899e..ca63594 100644
> --- a/linux-user/syscall.c
> +++ b/linux-user/syscall.c
> @@ -8237,7 +8237,8 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
>  #endif /* CONFIG_EVENTFD  */
>  #if defined(CONFIG_FALLOCATE) && defined(TARGET_NR_fallocate)
>     case TARGET_NR_fallocate:
> -        ret = get_errno(fallocate(arg1, arg2, arg3, arg4));
> +        ret = get_errno(fallocate(arg1, arg2, target_offset64(arg3, arg4),
> +                                  target_offset64(arg5, arg6)));
>         break;
>  #endif
>  #if defined(CONFIG_SYNC_FILE_RANGE)

This needs to be guarded with a TARGET_ABI_BITS == 32 conditional:
64 bit guests want the original version.

-- PMM
Alexander Graf - Feb. 6, 2012, 9:04 p.m.
On 06.02.2012, at 22:03, Peter Maydell wrote:

> On 6 February 2012 20:45, Alexander Graf <agraf@suse.de> wrote:
>> Fallocate gets off_t parameters passed in, so we should also read them out
>> accordingly.
>> 
>> Signed-off-by: Alexander Graf <agraf@suse.de>
>> ---
>>  linux-user/syscall.c |    3 ++-
>>  1 files changed, 2 insertions(+), 1 deletions(-)
>> 
>> diff --git a/linux-user/syscall.c b/linux-user/syscall.c
>> index ee8899e..ca63594 100644
>> --- a/linux-user/syscall.c
>> +++ b/linux-user/syscall.c
>> @@ -8237,7 +8237,8 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
>>  #endif /* CONFIG_EVENTFD  */
>>  #if defined(CONFIG_FALLOCATE) && defined(TARGET_NR_fallocate)
>>     case TARGET_NR_fallocate:
>> -        ret = get_errno(fallocate(arg1, arg2, arg3, arg4));
>> +        ret = get_errno(fallocate(arg1, arg2, target_offset64(arg3, arg4),
>> +                                  target_offset64(arg5, arg6)));
>>         break;
>>  #endif
>>  #if defined(CONFIG_SYNC_FILE_RANGE)
> 
> This needs to be guarded with a TARGET_ABI_BITS == 32 conditional:
> 64 bit guests want the original version.

Good point. Thanks!


Alex

Patch

diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index ee8899e..ca63594 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -8237,7 +8237,8 @@  abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
 #endif /* CONFIG_EVENTFD  */
 #if defined(CONFIG_FALLOCATE) && defined(TARGET_NR_fallocate)
     case TARGET_NR_fallocate:
-        ret = get_errno(fallocate(arg1, arg2, arg3, arg4));
+        ret = get_errno(fallocate(arg1, arg2, target_offset64(arg3, arg4),
+                                  target_offset64(arg5, arg6)));
         break;
 #endif
 #if defined(CONFIG_SYNC_FILE_RANGE)