diff mbox

[PULL,13/13] linux-user: implement renameat2

Message ID 20180123144807.5618-14-laurent@vivier.eu (mailing list archive)
State New, archived
Headers show

Commit Message

Laurent Vivier Jan. 23, 2018, 2:48 p.m. UTC
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(+)

Comments

Palmer Dabbelt Jan. 23, 2018, 7:13 p.m. UTC | #1
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>
Laurent Vivier Jan. 23, 2018, 8:13 p.m. UTC | #2
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
Palmer Dabbelt Jan. 23, 2018, 8:55 p.m. UTC | #3
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
diff mbox

Patch

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)))