io_uring_prep_openat(3)
π io_uring_prep_openat β the liburing girlies' guide π
okay so bestie, you're in the liburing Manual and today we're learning how to prep an openat request with io_uring. yes this is the io_uring_prep_openat(3) page, and no I will not be normal about it. let's go β¨
πΈ NAME πΈ
io_uring_prep_openat β prepare an openat request
π SYNOPSIS π
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <liburing.h>
void io_uring_prep_open(struct io_uring_sqe *sqe,
const char *path,
int flags,
mode_t mode);
void io_uring_prep_open_direct(struct io_uring_sqe *sqe,
const char *path,
int flags,
mode_t mode,
unsigned file_index);
void io_uring_prep_openat(struct io_uring_sqe *sqe,
int dfd,
const char *path,
int flags,
mode_t mode);
void io_uring_prep_openat_direct(struct io_uring_sqe *sqe,
int dfd,
const char *path,
int flags,
mode_t mode,
unsigned file_index);
four whole glow-ups in one page, we're being so spoiled rn π
β¨ DESCRIPTION β¨
so. io_uring_prep_openat(3) prepares an openat request. the submission queue entry sqe gets set up to use the directory file descriptor dfd to start opening a file described by path, using the open flags in flags, and using the file mode bits specified in mode. and like, same energy: io_uring_prep_open(3) prepares an open request. two icons, one job π«Ά
π¦ the direct variants (aka the fancy ones) π¦
if you're using the direct variant, the application must first have registered a file table using io_uring_register_files(3) of the appropriate size. no table, no direct, that's the rule bestie.
once that's registered, a direct accept request may use any entry in that table, and you specify which one in file_index β as long as it's within the size of the registered table. if a specified entry already contains a file, the file will first be removed from the table and closed. this is consistent with the behavior of updating an existing file with io_uring_register_files_update(3). so yes, you're overwriting, and yes, it closes the old one first. noted π
if IORING_FILE_INDEX_ALLOC is used as the file_index for a direct open, then io_uring will allocate a free direct descriptor in the existing table. the allocated descriptor is returned in the CQE res field, just like it would be for a non-direct open request. and if there are no more entries available in the direct descriptor table? -ENFILE is returned instead. sad but true π
π what even IS a direct descriptor π
direct descriptors are io_uring private file descriptors. they avoid some of the overhead associated with thread shared file tables, and they can be used in any subsequent io_uring request that takes a file descriptor. to do that:
IOSQE_FIXED_FILEmust be set in the SQEflagsmember, and- the SQE
fdfield should use the direct descriptor value rather than the regular file descriptor.
direct descriptors are managed like registered files. periodt β¨
also, quick thing: the directory file descriptor dfd is always a regular file descriptor. no direct energy for dfd, sorry.
β οΈ heads up bestie: old kernels don't check the SQE file_index field. this is not a problem for liburing helpers, but users of the raw io_uring interface need to zero SQEs to avoid unexpected behavior. like, actually zero them. don't skip this π
and finally β these functions prepare an async openat(2) or open(2) request. go read that man page for details, iykyk π
π RETURN VALUE π
None. that's it, that's the whole section. nothing returned, we simply vibe πΈ
π ERRORS π
the CQE res field will contain the result of the operation. see the related man page for details on possible values.
β οΈ and this part matters: where synchronous system calls will return-1on failure and seterrnoto the actual error value, io_uring never useserrno. instead it returns the negated errno directly in the CQEresfield. so stop checkingerrno, bestie, it's not the moment π₯
π§ NOTES π§
as with any request that passes in data in a struct, that data must remain valid until the request has been successfully submitted. it need not remain valid until completion. once a request has been submitted, the in-kernel state is stable.
very early kernels (5.4 and earlier) required state to be stable until the completion occurred. applications can test for this behavior by inspecting the IORING_FEAT_SUBMIT_STABLE flag passed back from io_uring_queue_init_params(3). good to know, iconic to check π
π SEE ALSO π
k bye bestie, go open some files π this page is brought to you by liburing-2.2, dated March 13, 2022 β slay, mwah πβ¨
π¦ where this page comes from
- alpine 3.22: liburing-doc 2.9-r0 Β· LGPL-2.1-or-later OR MIT
- alpine 3.23: liburing-doc 2.12-r0 Β· LGPL-2.1-or-later OR MIT
- alpine 3.24: liburing-doc 2.14-r0 Β· LGPL-2.1-or-later OR MIT
- arch rolling: liburing 2.15-1 Β· GPL-2.0-only WITH Linux-syscall-note OR MIT AND LGPL-2.0-or-later AND MIT
- centos-stream 10: liburing-devel 2.12-1.el10 Β· (GPLv2 with exceptions and LGPLv2+) or MIT
- centos-stream 9: liburing-devel 2.12-1.el9 Β· (GPLv2 with exceptions and LGPLv2+) or MIT
- centos-stream 9: liburing-devel 2.12-1.el9 Β· (GPLv2 with exceptions and LGPLv2+) or MIT
- debian trixie: liburing-dev 2.9-1
- fedora 43: liburing-devel 2.9-2.fc43 Β· (GPL-2.0-only WITH Linux-syscall-note OR MIT) AND (LGPL-2.0-or-later OR MIT)
- fedora 43: liburing-devel 2.9-2.fc43 Β· (GPL-2.0-only WITH Linux-syscall-note OR MIT) AND (LGPL-2.0-or-later OR MIT)
- fedora 44: liburing-devel 2.13-2.fc44 Β· (GPL-2.0-only WITH Linux-syscall-note OR MIT) AND (LGPL-2.0-or-later OR MIT)
- fedora 44: liburing-devel 2.13-2.fc44 Β· (GPL-2.0-only WITH Linux-syscall-note OR MIT) AND (LGPL-2.0-or-later OR MIT)
- nixpkgs unstable: liburing 2.14
- opensuse-leap 16.0: liburing-devel 2.8-160000.3.1 Β· (GPL-2.0-only AND LGPL-2.1-or-later) OR MIT
- opensuse-leap 16.0: liburing-devel 2.8-160000.3.1 Β· (GPL-2.0-only AND LGPL-2.1-or-later) OR MIT
- opensuse-leap 16.0: liburing-devel 2.8-160000.3.1 Β· (GPL-2.0-only AND LGPL-2.1-or-later) OR MIT
- opensuse-leap 16.0: liburing-devel 2.8-160000.3.1 Β· (GPL-2.0-only AND LGPL-2.1-or-later) OR MIT
- ubuntu questing: liburing-dev 2.11-1
- ubuntu resolute: liburing-dev 2.14-1
- ubuntu stonking: liburing-dev 2.15-1
- π the page's license: LGPL-2.0-or-later
- Copyright (C) 2022 Jens Axboe <axboe@kernel.dk>
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms