io\_uring\_prep\_msg\_ring\_fd(3) liburing Manual io\_uring\_prep\_msg\_ring\_fd(3)

# [NAME](#NAME)

io\_uring\_prep\_msg\_ring\_fd - send a direct descriptor to another ring

# [SYNOPSIS](#SYNOPSIS)

```
#include <liburing.h>
```

```
void io_uring_prep_msg_ring_fd(struct io_uring_sqe *sqe,
                        int fd,
                        int source_fd,
                        int target_fd,
                        __u64 data,
                        unsigned int flags);
```

```
void io_uring_prep_msg_ring_fd_alloc(struct io_uring_sqe *sqe,
                        int fd,
                        int source_fd,
                        __u64 data,
                        unsigned int flags);
```

# [DESCRIPTION](#DESCRIPTION)

[**io\_uring\_prep\_msg\_ring\_fd**(3)](/man/os/liburing/io_uring_prep_msg_ring_fd.3) prepares an SQE to send a direct file descriptor to another ring. The submission queue entry *sqe* is setup to use the file descriptor *fd*, which must identify a target io\_uring context, to send the locally registered file descriptor with value *source\_fd* to the destination ring into index *target\_fd* and passing *data* as the user data in the target CQE with the request modifier flags set by *flags*. Currently there are no valid flag modifiers, this field must contain **0**.

[**io\_uring\_prep\_msg\_ring\_fd\_alloc**(3)](/man/os/liburing/io_uring_prep_msg_ring_fd_alloc.3) is similar to [**io\_uring\_prep\_msg\_ring\_fd**(3)](/man/os/liburing/io_uring_prep_msg_ring_fd.3)**,** but doesn't specify a target index for the direct descriptor. Instead, this index is allocated in the target ring and returned in the CQE *res* field.

# [RETURN VALUE](#RETURN_VALUE)

None

# [ERRORS](#ERRORS)

These are the errors that are reported in the CQE *res* field.

[**-ENOMEM**](#ENOMEM)

The kernel was unable to allocate memory for the request.

[**-EINVAL**](#EINVAL)

One of the fields set in the SQE was invalid.

[**-EINVAL**](#EINVAL~2)

Target ring is identical to the source ring.

[**-EBADFD**](#EBADFD)

The descriptor passed in *fd* does not refer to an io\_uring file descriptor, or the ring is in a disabled state.

[**-EOVERFLOW**](#EOVERFLOW)

The kernel was unable to fill a CQE on the target ring. This can happen if the target CQ ring is in an overflow state and the kernel wasn't able to allocate memory for a new CQE entry.

[**-ENFILE**](#ENFILE)

The direct descriptor table in the target ring was full, no new descriptors could be successfully allocated.

March 16, 2023 liburing-2.4

---

Document: io_uring_prep_msg_ring_fd_alloc(3) from liburing 2.15-r4 (Chainguard OS)
Source: https://github.com/axboe/liburing.git
