obj-$(CONFIG_IO_URING)         += io_uring.o xattr.o nop.o fs.o splice.o \
                                        sync.o advise.o filetable.o \
                                        openclose.o uring_cmd.o epoll.o \
-                                       statx.o net.o
+                                       statx.o net.o msg_ring.o
 obj-$(CONFIG_IO_WQ)            += io-wq.o
 
 #include "epoll.h"
 #include "statx.h"
 #include "net.h"
+#include "msg_ring.h"
 
 #define IORING_MAX_ENTRIES     32768
 #define IORING_MAX_CQ_ENTRIES  (2 * IORING_MAX_ENTRIES)
        __u16                           bid;
 };
 
-struct io_msg {
-       struct file                     *file;
-       u64 user_data;
-       u32 len;
-};
-
 struct io_rw_state {
        struct iov_iter                 iter;
        struct iov_iter_state           iter_state;
        return ret;
 }
 
-static int io_msg_ring_prep(struct io_kiocb *req,
-                           const struct io_uring_sqe *sqe)
-{
-       struct io_msg *msg = io_kiocb_to_cmd(req);
-
-       if (unlikely(sqe->addr || sqe->rw_flags || sqe->splice_fd_in ||
-                    sqe->buf_index || sqe->personality))
-               return -EINVAL;
-
-       msg->user_data = READ_ONCE(sqe->off);
-       msg->len = READ_ONCE(sqe->len);
-       return 0;
-}
-
-static int io_msg_ring(struct io_kiocb *req, unsigned int issue_flags)
-{
-       struct io_msg *msg = io_kiocb_to_cmd(req);
-       struct io_ring_ctx *target_ctx;
-       bool filled;
-       int ret;
-
-       ret = -EBADFD;
-       if (req->file->f_op != &io_uring_fops)
-               goto done;
-
-       ret = -EOVERFLOW;
-       target_ctx = req->file->private_data;
-
-       spin_lock(&target_ctx->completion_lock);
-       filled = io_fill_cqe_aux(target_ctx, msg->user_data, msg->len, 0);
-       io_commit_cqring(target_ctx);
-       spin_unlock(&target_ctx->completion_lock);
-
-       if (filled) {
-               io_cqring_ev_posted(target_ctx);
-               ret = 0;
-       }
-
-done:
-       if (ret < 0)
-               req_set_fail(req);
-       io_req_set_res(req, ret, 0);
-       /* put file to avoid an attempt to IOPOLL the req */
-       io_put_file(req->file);
-       req->file = NULL;
-       return IOU_OK;
-}
-
 /*
  * Note when io_fixed_fd_install() returns error value, it will ensure
  * fput() is called correspondingly.
 
--- /dev/null
+// SPDX-License-Identifier: GPL-2.0
+#include <linux/kernel.h>
+#include <linux/errno.h>
+#include <linux/file.h>
+#include <linux/slab.h>
+#include <linux/io_uring.h>
+
+#include <uapi/linux/io_uring.h>
+
+#include "io_uring_types.h"
+#include "io_uring.h"
+#include "msg_ring.h"
+
+struct io_msg {
+       struct file                     *file;
+       u64 user_data;
+       u32 len;
+};
+
+int io_msg_ring_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
+{
+       struct io_msg *msg = io_kiocb_to_cmd(req);
+
+       if (unlikely(sqe->addr || sqe->rw_flags || sqe->splice_fd_in ||
+                    sqe->buf_index || sqe->personality))
+               return -EINVAL;
+
+       msg->user_data = READ_ONCE(sqe->off);
+       msg->len = READ_ONCE(sqe->len);
+       return 0;
+}
+
+int io_msg_ring(struct io_kiocb *req, unsigned int issue_flags)
+{
+       struct io_msg *msg = io_kiocb_to_cmd(req);
+       struct io_ring_ctx *target_ctx;
+       bool filled;
+       int ret;
+
+       ret = -EBADFD;
+       if (!io_is_uring_fops(req->file))
+               goto done;
+
+       ret = -EOVERFLOW;
+       target_ctx = req->file->private_data;
+
+       spin_lock(&target_ctx->completion_lock);
+       filled = io_fill_cqe_aux(target_ctx, msg->user_data, msg->len, 0);
+       io_commit_cqring(target_ctx);
+       spin_unlock(&target_ctx->completion_lock);
+
+       if (filled) {
+               io_cqring_ev_posted(target_ctx);
+               ret = 0;
+       }
+
+done:
+       if (ret < 0)
+               req_set_fail(req);
+       io_req_set_res(req, ret, 0);
+       /* put file to avoid an attempt to IOPOLL the req */
+       io_put_file(req->file);
+       req->file = NULL;
+       return IOU_OK;
+}
 
--- /dev/null
+// SPDX-License-Identifier: GPL-2.0
+
+int io_msg_ring_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe);
+int io_msg_ring(struct io_kiocb *req, unsigned int issue_flags);