Thread (45 messages) 45 messages, 7 authors, 2019-07-19

Re: [PATCH v9 08/10] open: openat2(2) syscall

From: Arnd Bergmann <arnd@arndb.de>
Date: 2019-07-18 15:10:46
Also in: linux-alpha, linux-arch, linux-arm-kernel, linux-fsdevel, linux-kselftest, linux-mips, linux-s390, linux-sh, linuxppc-dev, lkml, sparclinux

On Sat, Jul 6, 2019 at 5:00 PM Aleksa Sarai [off-list ref] wrote:
quoted hunk ↗ jump to hunk
diff --git a/arch/alpha/kernel/syscalls/syscall.tbl b/arch/alpha/kernel/syscalls/syscall.tbl
index 9e7704e44f6d..1703d048c141 100644
--- a/arch/alpha/kernel/syscalls/syscall.tbl
+++ b/arch/alpha/kernel/syscalls/syscall.tbl
@@ -461,6 +461,7 @@
 530    common  getegid                         sys_getegid
 531    common  geteuid                         sys_geteuid
 532    common  getppid                         sys_getppid
+533    common  openat2                         sys_openat2
 # all other architectures have common numbers for new syscall, alpha
 # is the exception.
 534    common  pidfd_send_signal               sys_pidfd_send_signal
My plan here was to add new syscalls in the same order as everwhere else,
just with the number 110 higher. In the long run, I hope we can automate
this.
quoted hunk ↗ jump to hunk
diff --git a/arch/arm/tools/syscall.tbl b/arch/arm/tools/syscall.tbl
index aaf479a9e92d..4ad262698396 100644
--- a/arch/arm/tools/syscall.tbl
+++ b/arch/arm/tools/syscall.tbl
@@ -447,3 +447,4 @@
 431    common  fsconfig                        sys_fsconfig
 432    common  fsmount                         sys_fsmount
 433    common  fspick                          sys_fspick
+434    common  openat2                         sys_openat2
434 is already used in linux-next, I suggest you use 437 (Palmer
just submitted fchmodat4, which could become 436).
+/**
+ * Arguments for how openat2(2) should open the target path. If @extra is zero,
+ * then openat2(2) is identical to openat(2).
+ *
+ * @flags: O_* flags (unknown flags ignored).
+ * @mode: O_CREAT file mode (ignored otherwise).
+ * @upgrade_mask: restrict how the O_PATH may be re-opened (ignored otherwise).
+ * @resolve: RESOLVE_* flags (-EINVAL on unknown flags).
+ * @reserved: reserved for future extensions, must be zeroed.
+ */
+struct open_how {
+       __u32 flags;
+       union {
+               __u16 mode;
+               __u16 upgrade_mask;
+       };
+       __u16 resolve;
+       __u64 reserved[7]; /* must be zeroed */
+};
We can have system calls with up to six arguments on all architectures, so
this could still be done more conventionally without the indirection: like

long openat2(int dfd, const char __user * filename, int flags, mode_t
mode_mask, __u16 resolve);

In fact, that seems similar enough to the existing openat() that I think
you could also just add the fifth argument to the existing call when
a newly defined flag is set, similarly to how we only use the 'mode'
argument when O_CREAT or O_TMPFILE are set.
quoted hunk ↗ jump to hunk
--- a/include/linux/syscalls.h
+++ b/include/linux/syscalls.h
This file seems to lack a declaration for the system call, which means it
will cause a build failure on some architectures, e.g. arch/arc/kernel/sys.c:

#define __SYSCALL(nr, call) [nr] = (call),
void *sys_call_table[NR_syscalls] = {
        [0 ... NR_syscalls-1] = sys_ni_syscall,
#include <asm/unistd.h>
};

        Arnd
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help