Skip to content

*at syscalls: Intro

Ulrich Drepper lkml 1 version In review

Get series with b4
b4 am [email protected]

Versions newest first

  1. v1 Latest3 patches 9 repliesIn review

Patches in v1 No applies recorded yet

#Subject and filesSizeRepliesApplied
1/3*at syscalls: Implementationfs/compat.c fs/exec.c fs/namei.c +6 more+286 -680 replies
2/3*at syscalls: x86 syscallsarch/i386/kernel/syscall_table.S include/asm-i386/unistd.h+23 -10 replies
3/3*at syscalls: x64 syscallsarch/x86_64/ia32/ia32entry.S include/asm-x86_64/ia32_unistd.h include/asm-x86_64/unistd.h+46 -20 replies

Reviews trailers per patch

No Reviewed-by, Acked-by or Tested-by trailers for v1 yet.

Read the v1 thread

Cover letter [PATCH 0/3] *at syscalls: Intro

Here is a series of patches which introduce in total 11 new system calls which take a file descriptor/filename pair instead of a single file name. These functions, openat etc, have been discussed on numerous occasions. They are needed to implement race-free filesystem traversal, they are necessary to implement a virtual per-thread current working directory (think multi-threaded backup software), etc.

We have in glibc today implementations of the interfaces which use the /proc/self/fd magic. But this code is rather expensive. Here are some results (similar to what Jim Meyering posted before):

The test creates a deep directory hierarchy on a tmpfs filesystem. Then rm -fr is used to remove all directories. Without syscall support I get this:

real    0m31.921s
user    0m0.688s
sys     0m31.234s

With syscall support the results are much better:

real    0m20.699s
user    0m0.536s
sys     0m20.149s

The implemenation is really small:

 arch/i386/kernel/syscall_table.S |   11 ++
 arch/x86_64/ia32/ia32entry.S     |   11 ++
 fs/compat.c                      |   48 +++++++++--
 fs/exec.c                        |    2 
 fs/namei.c                       |  167 ++++++++++++++++++++++++++++++---------
 fs/open.c                        |   60 +++++++++++---
 fs/stat.c                        |   54 ++++++++++--
 include/asm-i386/unistd.h        |   13 ++-
 include/asm-x86_64/ia32_unistd.h |   13 ++-
 include/asm-x86_64/unistd.h      |   24 +++++
 include/linux/fcntl.h            |    7 +
 include/linux/fs.h               |    7 +
 include/linux/namei.h            |    7 -
 include/linux/time.h             |    2 
 14 files changed, 355 insertions(+), 71 deletions(-)

I've split the patch in three parts. The first part is the actual code change. It mostly consists of passing down an additional parameter with a file descriptor and add wrapper functions which pass down the default parameter AT_FDCWD. Three new constants are defined in <linux/fcntl.h> which must correspond to the values already in use in glibc. In a few cases I've modified some code which would not necesarily need changing but the change makes it a bit more efficient in presence of the wrapper functions.

The real change needed is the additional else-clause in what is now do_path_lookup. That's it.

The other two patches contain the syscall definitions for x86 and x86-64. I've tested the code on x86-64, including the ia32 compat code. Because there is no architecture specific change all should work well on other archs once the syscalls are added.