From: Andreas Schwab <schwab@suse.de>
This is needed for new architectures like RISC-V which do not provide any
other rename-like syscall.
Signed-off-by: Andreas Schwab <schwab@suse.de>
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
Message-Id: <mvm607su9qs.fsf@suse.de>
Signed-off-by: Laurent Vivier <laurent@vivier.eu>
---
linux-user/syscall.c | 34 ++++++++++++++++++++++++++++++++++
1 file changed, 34 insertions(+)
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 104408c050..74378947f0 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -600,6 +600,24 @@ static int sys_utimensat(int dirfd, const char *pathname,
#endif
#endif /* TARGET_NR_utimensat */
+#ifdef TARGET_NR_renameat2
+#if defined(__NR_renameat2)
+#define __NR_sys_renameat2 __NR_renameat2
+_syscall5(int, sys_renameat2, int, oldfd, const char *, old, int, newfd,
+ const char *, new, unsigned int, flags)
+#else
+static int sys_renameat2(int oldfd, const char *old,
+ int newfd, const char *new, int flags)
+{
+ if (flags == 0) {
+ return renameat(oldfd, old, newfd, new);
+ }
+ errno = ENOSYS;
+ return -1;
+}
+#endif
+#endif /* TARGET_NR_renameat2 */
+
#ifdef CONFIG_INOTIFY
#include <sys/inotify.h>
@@ -8426,6 +8444,22 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
}
break;
#endif
+#if defined(TARGET_NR_renameat2)
+ case TARGET_NR_renameat2:
+ {
+ void *p2;
+ p = lock_user_string(arg2);
+ p2 = lock_user_string(arg4);
+ if (!p || !p2) {
+ ret = -TARGET_EFAULT;
+ } else {
+ ret = get_errno(sys_renameat2(arg1, p, arg3, p2, arg5));
+ }
+ unlock_user(p2, arg4, 0);
+ unlock_user(p, arg2, 0);
+ }
+ break;
+#endif
#ifdef TARGET_NR_mkdir
case TARGET_NR_mkdir:
if (!(p = lock_user_string(arg1)))
--
2.14.3
On Tue, 23 Jan 2018 06:48:07 PST (-0800), laurent@vivier.eu wrote:
> From: Andreas Schwab <schwab@suse.de>
>
> This is needed for new architectures like RISC-V which do not provide any
> other rename-like syscall.
>
> Signed-off-by: Andreas Schwab <schwab@suse.de>
> Reviewed-by: Laurent Vivier <laurent@vivier.eu>
> Message-Id: <mvm607su9qs.fsf@suse.de>
> Signed-off-by: Laurent Vivier <laurent@vivier.eu>
> ---
> linux-user/syscall.c | 34 ++++++++++++++++++++++++++++++++++
> 1 file changed, 34 insertions(+)
>
> diff --git a/linux-user/syscall.c b/linux-user/syscall.c
> index 104408c050..74378947f0 100644
> --- a/linux-user/syscall.c
> +++ b/linux-user/syscall.c
> @@ -600,6 +600,24 @@ static int sys_utimensat(int dirfd, const char *pathname,
> #endif
> #endif /* TARGET_NR_utimensat */
>
> +#ifdef TARGET_NR_renameat2
> +#if defined(__NR_renameat2)
> +#define __NR_sys_renameat2 __NR_renameat2
> +_syscall5(int, sys_renameat2, int, oldfd, const char *, old, int, newfd,
> + const char *, new, unsigned int, flags)
> +#else
> +static int sys_renameat2(int oldfd, const char *old,
> + int newfd, const char *new, int flags)
> +{
> + if (flags == 0) {
> + return renameat(oldfd, old, newfd, new);
> + }
> + errno = ENOSYS;
> + return -1;
> +}
> +#endif
> +#endif /* TARGET_NR_renameat2 */
> +
> #ifdef CONFIG_INOTIFY
> #include <sys/inotify.h>
>
> @@ -8426,6 +8444,22 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
> }
> break;
> #endif
> +#if defined(TARGET_NR_renameat2)
> + case TARGET_NR_renameat2:
> + {
> + void *p2;
> + p = lock_user_string(arg2);
> + p2 = lock_user_string(arg4);
> + if (!p || !p2) {
> + ret = -TARGET_EFAULT;
> + } else {
> + ret = get_errno(sys_renameat2(arg1, p, arg3, p2, arg5));
> + }
> + unlock_user(p2, arg4, 0);
> + unlock_user(p, arg2, 0);
> + }
> + break;
> +#endif
> #ifdef TARGET_NR_mkdir
> case TARGET_NR_mkdir:
> if (!(p = lock_user_string(arg1)))
Thanks! My patch got lost in the shuffle, but I think these are functionally
identical. Feel free to add my
Reviewed-by: Palmer Dabbelt <palmer@sifive.com>
Le 23/01/2018 à 20:13, Palmer Dabbelt a écrit :
> On Tue, 23 Jan 2018 06:48:07 PST (-0800), laurent@vivier.eu wrote:
>> From: Andreas Schwab <schwab@suse.de>
>>
>> This is needed for new architectures like RISC-V which do not provide any
>> other rename-like syscall.
>>
>> Signed-off-by: Andreas Schwab <schwab@suse.de>
>> Reviewed-by: Laurent Vivier <laurent@vivier.eu>
>> Message-Id: <mvm607su9qs.fsf@suse.de>
>> Signed-off-by: Laurent Vivier <laurent@vivier.eu>
>> ---
>> linux-user/syscall.c | 34 ++++++++++++++++++++++++++++++++++
>> 1 file changed, 34 insertions(+)
>>
>> diff --git a/linux-user/syscall.c b/linux-user/syscall.c
>> index 104408c050..74378947f0 100644
>> --- a/linux-user/syscall.c
>> +++ b/linux-user/syscall.c
>> @@ -600,6 +600,24 @@ static int sys_utimensat(int dirfd, const char
>> *pathname,
>> #endif
>> #endif /* TARGET_NR_utimensat */
>>
>> +#ifdef TARGET_NR_renameat2
>> +#if defined(__NR_renameat2)
>> +#define __NR_sys_renameat2 __NR_renameat2
>> +_syscall5(int, sys_renameat2, int, oldfd, const char *, old, int, newfd,
>> + const char *, new, unsigned int, flags)
>> +#else
>> +static int sys_renameat2(int oldfd, const char *old,
>> + int newfd, const char *new, int flags)
>> +{
>> + if (flags == 0) {
>> + return renameat(oldfd, old, newfd, new);
>> + }
>> + errno = ENOSYS;
>> + return -1;
>> +}
>> +#endif
>> +#endif /* TARGET_NR_renameat2 */
>> +
>> #ifdef CONFIG_INOTIFY
>> #include <sys/inotify.h>
>>
>> @@ -8426,6 +8444,22 @@ abi_long do_syscall(void *cpu_env, int num,
>> abi_long arg1,
>> }
>> break;
>> #endif
>> +#if defined(TARGET_NR_renameat2)
>> + case TARGET_NR_renameat2:
>> + {
>> + void *p2;
>> + p = lock_user_string(arg2);
>> + p2 = lock_user_string(arg4);
>> + if (!p || !p2) {
>> + ret = -TARGET_EFAULT;
>> + } else {
>> + ret = get_errno(sys_renameat2(arg1, p, arg3, p2, arg5));
>> + }
>> + unlock_user(p2, arg4, 0);
>> + unlock_user(p, arg2, 0);
>> + }
>> + break;
>> +#endif
>> #ifdef TARGET_NR_mkdir
>> case TARGET_NR_mkdir:
>> if (!(p = lock_user_string(arg1)))
>
> Thanks! My patch got lost in the shuffle, but I think these are
> functionally identical. Feel free to add my
I've seen your patch, but Andreas has implemented what was requested by
Peter (use renameat() when flags == 0), so I took his one.
> Reviewed-by: Palmer Dabbelt <palmer@sifive.com>
To late for that (it's a pull request), sorry.
Thank you,
Laurent
On Tue, 23 Jan 2018 12:13:07 PST (-0800), laurent@vivier.eu wrote:
> Le 23/01/2018 à 20:13, Palmer Dabbelt a écrit :
>> On Tue, 23 Jan 2018 06:48:07 PST (-0800), laurent@vivier.eu wrote:
>>> From: Andreas Schwab <schwab@suse.de>
>>>
>>> This is needed for new architectures like RISC-V which do not provide any
>>> other rename-like syscall.
>>>
>>> Signed-off-by: Andreas Schwab <schwab@suse.de>
>>> Reviewed-by: Laurent Vivier <laurent@vivier.eu>
>>> Message-Id: <mvm607su9qs.fsf@suse.de>
>>> Signed-off-by: Laurent Vivier <laurent@vivier.eu>
>>> ---
>>> linux-user/syscall.c | 34 ++++++++++++++++++++++++++++++++++
>>> 1 file changed, 34 insertions(+)
>>>
>>> diff --git a/linux-user/syscall.c b/linux-user/syscall.c
>>> index 104408c050..74378947f0 100644
>>> --- a/linux-user/syscall.c
>>> +++ b/linux-user/syscall.c
>>> @@ -600,6 +600,24 @@ static int sys_utimensat(int dirfd, const char
>>> *pathname,
>>> #endif
>>> #endif /* TARGET_NR_utimensat */
>>>
>>> +#ifdef TARGET_NR_renameat2
>>> +#if defined(__NR_renameat2)
>>> +#define __NR_sys_renameat2 __NR_renameat2
>>> +_syscall5(int, sys_renameat2, int, oldfd, const char *, old, int, newfd,
>>> + const char *, new, unsigned int, flags)
>>> +#else
>>> +static int sys_renameat2(int oldfd, const char *old,
>>> + int newfd, const char *new, int flags)
>>> +{
>>> + if (flags == 0) {
>>> + return renameat(oldfd, old, newfd, new);
>>> + }
>>> + errno = ENOSYS;
>>> + return -1;
>>> +}
>>> +#endif
>>> +#endif /* TARGET_NR_renameat2 */
>>> +
>>> #ifdef CONFIG_INOTIFY
>>> #include <sys/inotify.h>
>>>
>>> @@ -8426,6 +8444,22 @@ abi_long do_syscall(void *cpu_env, int num,
>>> abi_long arg1,
>>> }
>>> break;
>>> #endif
>>> +#if defined(TARGET_NR_renameat2)
>>> + case TARGET_NR_renameat2:
>>> + {
>>> + void *p2;
>>> + p = lock_user_string(arg2);
>>> + p2 = lock_user_string(arg4);
>>> + if (!p || !p2) {
>>> + ret = -TARGET_EFAULT;
>>> + } else {
>>> + ret = get_errno(sys_renameat2(arg1, p, arg3, p2, arg5));
>>> + }
>>> + unlock_user(p2, arg4, 0);
>>> + unlock_user(p, arg2, 0);
>>> + }
>>> + break;
>>> +#endif
>>> #ifdef TARGET_NR_mkdir
>>> case TARGET_NR_mkdir:
>>> if (!(p = lock_user_string(arg1)))
>>
>> Thanks! My patch got lost in the shuffle, but I think these are
>> functionally identical. Feel free to add my
>
> I've seen your patch, but Andreas has implemented what was requested by
> Peter (use renameat() when flags == 0), so I took his one.
Ya, I wrote another one do to that bug forgot to send it :)
>
>> Reviewed-by: Palmer Dabbelt <palmer@sifive.com>
>
> To late for that (it's a pull request), sorry.
OK, no problem. I'm a bit new to QEMU.
Thanks!
>
> Thank you,
> Laurent
© 2016 - 2026 Red Hat, Inc.