This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[PATCH v2] Linux: consolidate rename()
- From: Yury Norov <ynorov at caviumnetworks dot com>
- To: <libc-alpha at sourceware dot org>
- Cc: <zackw at panix dot com>, <schwab at linux-m68k dot org>, <arnd at arndb dot de>, Yury Norov <ynorov at caviumnetworks dot com>
- Date: Thu, 20 Oct 2016 03:52:36 +0300
- Subject: [PATCH v2] Linux: consolidate rename()
- Authentication-results: sourceware.org; auth=none
- Authentication-results: spf=none (sender IP is ) smtp.mailfrom=Yuri dot Norov at caviumnetworks dot com;
- Spamdiagnosticmetadata: NSPM
- Spamdiagnosticoutput: 1:99
renameat syscall was deprecated in kernel in patch b0da6d44
(asm-generic: Drop renameat syscall from default list).
In this patch linux/ and linux/generic/ implementations of
rename() and renameat() are consolidated and forced to call
renameat2 if renameat is not exposed by kernel headers. The
change affects only new ports. Old ports work as usual.
Tested on arm64/lp64 which supports renameat and renameat2,
and aarch64/ilp32 which supports renameat2 only.
Kernel and glibc series for aarch64/ilp32:
https://github.com/norov/linux/commits/ilp32-4.9
https://github.com/norov/glibc/commits/master-ilp32
v2:
- rename() calls renameat() now;
- renameat() is implemented in a file, not in syscalls.list;
- __NR_renameat2 is used if kernel doesn't define __NR_renameat,
which is the case for new platforms, currently only aarch64/ilp32;
* sysdeps/unix/sysv/linux/generic/rename.c: Remove.
* sysdeps/unix/sysv/linux/rename.c: New file.
* sysdeps/unix/sysv/linux/renameat.c: New file.
* sysdeps/unix/sysv/linux/syscalls.list: Drop renameat.
Signed-off-by: Yury Norov <ynorov@caviumnetworks.com>
---
sysdeps/unix/sysv/linux/generic/rename.c | 29 ------------------------
sysdeps/unix/sysv/linux/rename.c | 27 +++++++++++++++++++++++
sysdeps/unix/sysv/linux/renameat.c | 38 ++++++++++++++++++++++++++++++++
sysdeps/unix/sysv/linux/syscalls.list | 1 -
4 files changed, 65 insertions(+), 30 deletions(-)
delete mode 100644 sysdeps/unix/sysv/linux/generic/rename.c
create mode 100644 sysdeps/unix/sysv/linux/rename.c
create mode 100644 sysdeps/unix/sysv/linux/renameat.c
diff --git a/sysdeps/unix/sysv/linux/generic/rename.c b/sysdeps/unix/sysv/linux/generic/rename.c
deleted file mode 100644
index 174c147..0000000
--- a/sysdeps/unix/sysv/linux/generic/rename.c
+++ /dev/null
@@ -1,29 +0,0 @@
-/* Copyright (C) 2011-2016 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library. If not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <stdio.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <sysdep.h>
-
-/* Rename the file OLD to NEW. */
-int
-rename (const char *old, const char *new)
-{
- return INLINE_SYSCALL (renameat, 4, AT_FDCWD, old, AT_FDCWD, new);
-}
diff --git a/sysdeps/unix/sysv/linux/rename.c b/sysdeps/unix/sysv/linux/rename.c
new file mode 100644
index 0000000..8e14d7d
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/rename.c
@@ -0,0 +1,27 @@
+/* rename() implemantation.
+ Copyright (C) 2016 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library. If not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <fcntl.h>
+
+/* Rename the file OLD to NEW. */
+int
+rename (const char *old, const char *new)
+{
+ return renameat (AT_FDCWD, old, AT_FDCWD, new);
+}
diff --git a/sysdeps/unix/sysv/linux/renameat.c b/sysdeps/unix/sysv/linux/renameat.c
new file mode 100644
index 0000000..a735e2d
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/renameat.c
@@ -0,0 +1,38 @@
+/* renameat() syscall
+ Copyright (C) 2016 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library. If not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <stdio.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sysdep.h>
+
+#if !defined (__NR_renameat) && !defined (__NR_renameat2)
+# error "Both renameat and renameat2 not supported"
+#endif
+
+/* Rename the file OLD to NEW. */
+int
+renameat (int oldfd, const char *old, int newfd, const char *new)
+{
+#ifdef __NR_renameat
+ return INLINE_SYSCALL_CALL (renameat, oldfd, old, newfd, new);
+#else
+ return INLINE_SYSCALL_CALL (renameat2, oldfd, old, newfd, new, 0);
+#endif
+}
diff --git a/sysdeps/unix/sysv/linux/syscalls.list b/sysdeps/unix/sysv/linux/syscalls.list
index 68af897..4d7d71e 100644
--- a/sysdeps/unix/sysv/linux/syscalls.list
+++ b/sysdeps/unix/sysv/linux/syscalls.list
@@ -88,7 +88,6 @@ fchownat - fchownat i:isiii fchownat
linkat - linkat i:isisi linkat
mkdirat - mkdirat i:isi mkdirat
readlinkat - readlinkat i:issi readlinkat
-renameat - renameat i:isis renameat
symlinkat - symlinkat i:sis symlinkat
unlinkat - unlinkat i:isi unlinkat
--
2.7.4