linux-user: implement renameat2
PATCH 1/1 linux-user: implement renameat2
This is needed for new architectures like RISC-V which do not provide any other rename-like syscall.
--- linux-user/syscall.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+)
linux-user/syscall.c +33 -0
@@ -598,6 +598,23 @@ 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 chat *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>
@@ -8342,6 +8359,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, +target_to_host_bitmask (arg5, fcntl_flags_tbl))); +unlock_user (p2, arg4,0 ); +unlock_user (p, arg2,0 ); + } +break ; +#endif #ifdef TARGET_NR_mkdircase TARGET_NR_mkdir:if (!(p =lock_user_string (arg1)))
Signature · 6 lines
2.16.0 -- Andreas Schwab, SUSE Labs, [email protected] GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE 1748 E4D4 88E3 0EEA B9D7 "And now for something completely different."
This series seems to have some coding style problems. See output below for more information:
Hi,
This series seems to have some coding style problems. See output below for more information:
Type: series
Message-id: [email protected]
Subject: [Qemu-devel] [PATCH] linux-user: implement renameat2
=== TEST SCRIPT BEGIN ===
#!/bin/bash
BASE=base
n=1
total=$(git log --oneline $BASE.. | wc -l)
failed=0
git config --local diff.renamelimit 0
git config --local diff.renames True
commits="$(git log --format=%H --reverse $BASE..)" for c in $commits; do
echo "Checking PATCH $n/$total: $(git log -n 1 --format=%s $c)..."
if ! git show $c --format=email | ./scripts/checkpatch.pl --mailback -; then
failed=1
echo
fi
n=$((n+1))done
exit $failed
=== TEST SCRIPT END ===
Updating 3c8cf5a9c21ff8782164d1def7f44bd888713384
From https://github.com/patchew-project/qemu
t [tag update] patchew/[email protected] -> patchew/[email protected]
* [new tag] patchew/[email protected] -> patchew/[email protected]
Switched to a new branch 'test'59d79798ac linux-user: implement renameat2
=== OUTPUT BEGIN ===
Checking PATCH 1/1: linux-user: implement renameat2...
WARNING: architecture specific defines should be avoided #21: FILE: linux-user/syscall.c:602:
+#if defined(__NR_renameat2)
ERROR: spaces required around that '*' (ctx:WxV)
#27: FILE: linux-user/syscall.c:608:
+ int newfd, const chat *new, int flags)
^
ERROR: braces {} are necessary for all arms of this statement #29: FILE: linux-user/syscall.c:610:
+ if (flags == 0)
[...]
ERROR: braces {} are necessary for all arms of this statement #50: FILE: linux-user/syscall.c:8368:
+ if (!p || !p2)
[...]
+ else
[...]
ERROR: line over 90 characters
#54: FILE: linux-user/syscall.c:8372:
+ target_to_host_bitmask(arg5, fcntl_flags_tbl)));
total: 4 errors, 1 warnings, 45 lines checked
Your patch has style problems, please review. If any of these errors are false positives report them to the maintainer, see CHECKPATCH in MAINTAINERS.
=== OUTPUT END ===
Test command exited with code: 1
---
Email generated automatically by Patchew [http://patchew.org/].
Please send your feedback to [email protected]
Le 22/01/2018 à 18:44, Andreas Schwab a écrit :
Quoted 17 lines
This is needed for new architectures like RISC-V which do not provide any other rename-like syscall.
Signed-off-by Andreas Schwab <[email protected]>--- linux-user/syscall.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+)linux-user/syscall.c +1
-0@@ -598,6 +598,23 @@ static int sys_utimensat(int dirfd, const char *pathname,#endif #endif /* TARGET_NR_utimensat */ +#ifdef TARGET_NR_renameat2
linux-user/syscall.c static int sys_utimensat(int dirfd, const char *pathname, · line 611
Quoted 10 lines
linux-user/syscall.c +10
-0+#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 chat *new,int flags) +{ +if (flags ==0 ) +return renameat (oldfd, old, newfd, new);
Please fix style problem reported by patchew
(or ./scripts/checkpatch.pl)
Quoted 14 lines
linux-user/syscall.c +7
-0+ errno =ENOSYS ; +return -1 ; +} +#endif +#endif /* TARGET_NR_renameat2 */ +#ifdef CONFIG_INOTIFY #include <sys/inotify.h> @@ -8342,6 +8359,22 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, }break ;#endif +#if defined(TARGET_NR_renameat2)
linux-user/syscall.c abi_long do_syscall(void *cpu_env, int num, abi_long arg1, · line 8372
Quoted 10 lines
linux-user/syscall.c +10
-0+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, +target_to_host_bitmask (arg5, fcntl_flags_tbl)));
You can't use fcntl_flags_tbl
(because it converts fcntl/open flags O_*).
I think you can provide directly arg5 to sys_renameat2() because flags are the same for all architectures (and value is already byte-swapped).
Thanks,
Laurent
Le 22/01/2018 à 18:44, Andreas Schwab a écrit :
Quoted 14 lines
This is needed for new architectures like RISC-V which do not provide any other rename-like syscall.
Signed-off-by Andreas Schwab <[email protected]>--- linux-user/syscall.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+)linux-user/syscall.c +0
-0@@ -598,6 +598,23 @@ static int sys_utimensat(int dirfd, const char *pathname,#endif
linux-user/syscall.c static int sys_utimensat(int dirfd, const char *pathname, · line 608
Quoted 10 lines
linux-user/syscall.c +8
-0#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 chat *new,int flags)
"const char *" would look better.
And, please, test it (build/run).
Thanks,
Laurent
Quoted 2 lines · Laurent Vivier
Please fix style problem reported by patchew
(or./scripts/checkpatch.pl)
This was mostly copy-pasted from surrounding code. :-)
Quoted 9 lines
Quoted 9 lines
linux-user/syscall.c +5
-0@@ -8342,6 +8359,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);
Quoted 8 lines
linux-user/syscall.c abi_long do_syscall(void *cpu_env, int num, abi_long arg1, · line 8372
Quoted 6 lines
linux-user/syscall.c +6
-0+ p2 =lock_user_string (arg4); +if (!p || !p2) + ret = -TARGET_EFAULT ; +else + ret =get_errno (sys_renameat2 (arg1, p, arg3, p2, +target_to_host_bitmask (arg5, fcntl_flags_tbl)));You can't use
fcntl_flags_tbl
Of course! I was confused by another patch I was working on which does need such a conversion. :-/
Andreas.
Signature · 3 lines
Andreas Schwab, SUSE Labs, [email protected] GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE 1748 E4D4 88E3 0EEA B9D7 "And now for something completely different."
Quoted 1 line · Laurent Vivier
And, please, test it (build/run).
This was tested by bootstrapping openSUSE Factory for RISC-V.
Andreas.
Signature · 3 lines
Andreas Schwab, SUSE Labs, [email protected] GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE 1748 E4D4 88E3 0EEA B9D7 "And now for something completely different."
Le 23/01/2018 à 11:26, Andreas Schwab a écrit :
Quoted 5 lines · Laurent Vivier
Quoted 2 lines
And, please, test it (build/run).
This was tested by bootstrapping openSUSE Factory for RISC-V.
I have no doubt on this part, but you should test the "#else" part too, by, for instance, undefining "__NR_renameat2" locally/temporarily.
Thanks,
Laurent
PATCH v2 1/1 linux-user: implement renameat2
In reply to Andreas SchwabThis is needed for new architectures like RISC-V which do not provide any other rename-like syscall.
--- linux-user/syscall.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+)
linux-user/syscall.c +34 -0
@@ -598,6 +598,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>
@@ -8342,6 +8360,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_mkdircase TARGET_NR_mkdir:if (!(p =lock_user_string (arg1)))
Signature · 7 lines
2.16.1 -- Andreas Schwab, SUSE Labs, [email protected] GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE 1748 E4D4 88E3 0EEA B9D7 "And now for something completely different."
Le 23/01/2018 à 11:53, Andreas Schwab a écrit :
Quoted 51 lines
This is needed for new architectures like RISC-V which do not provide any other rename-like syscall.
Signed-off-by Andreas Schwab <[email protected]>--- linux-user/syscall.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+)linux-user/syscall.c +27
-0@@ -598,6 +598,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> @@ -8342,6 +8360,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 {
linux-user/syscall.c abi_long do_syscall(void *cpu_env, int num, abi_long arg1, · line 8381
Quoted 10 lines
linux-user/syscall.c +7
-0+ 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_mkdircase TARGET_NR_mkdir:if (!(p =lock_user_string (arg1)))