io_uring/poll: add requeue return code from poll multishot handling
[platform/kernel/linux-starfive.git] / io_uring / uring_cmd.c
index 476c787..5fa1986 100644 (file)
@@ -7,6 +7,7 @@
 #include <linux/nospec.h>
 
 #include <uapi/linux/io_uring.h>
+#include <asm/ioctls.h>
 
 #include "io_uring.h"
 #include "rsrc.h"
@@ -42,9 +43,8 @@ EXPORT_SYMBOL_GPL(io_uring_cmd_do_in_task_lazy);
 static inline void io_req_set_cqe32_extra(struct io_kiocb *req,
                                          u64 extra1, u64 extra2)
 {
-       req->extra1 = extra1;
-       req->extra2 = extra2;
-       req->flags |= REQ_F_CQE32_INIT;
+       req->big_cqe.extra1 = extra1;
+       req->big_cqe.extra2 = extra2;
 }
 
 /*
@@ -164,3 +164,30 @@ int io_uring_cmd_import_fixed(u64 ubuf, unsigned long len, int rw,
        return io_import_fixed(rw, iter, req->imu, ubuf, len);
 }
 EXPORT_SYMBOL_GPL(io_uring_cmd_import_fixed);
+
+int io_uring_cmd_sock(struct io_uring_cmd *cmd, unsigned int issue_flags)
+{
+       struct socket *sock = cmd->file->private_data;
+       struct sock *sk = sock->sk;
+       struct proto *prot = READ_ONCE(sk->sk_prot);
+       int ret, arg = 0;
+
+       if (!prot || !prot->ioctl)
+               return -EOPNOTSUPP;
+
+       switch (cmd->sqe->cmd_op) {
+       case SOCKET_URING_OP_SIOCINQ:
+               ret = prot->ioctl(sk, SIOCINQ, &arg);
+               if (ret)
+                       return ret;
+               return arg;
+       case SOCKET_URING_OP_SIOCOUTQ:
+               ret = prot->ioctl(sk, SIOCOUTQ, &arg);
+               if (ret)
+                       return ret;
+               return arg;
+       default:
+               return -EOPNOTSUPP;
+       }
+}
+EXPORT_SYMBOL_GPL(io_uring_cmd_sock);