OSDN Git Service

io_uring: cleanly separate request types for iopoll
authorJens Axboe <axboe@kernel.dk>
Fri, 2 Sep 2022 21:16:29 +0000 (15:16 -0600)
committerJens Axboe <axboe@kernel.dk>
Wed, 21 Sep 2022 16:30:42 +0000 (10:30 -0600)
After the addition of iopoll support for passthrough, there's a bit of
a mixup here. Clean it up and get rid of the casting for the passthrough
command type.

Signed-off-by: Jens Axboe <axboe@kernel.dk>
io_uring/rw.c

index b6f9c75..9187344 100644 (file)
@@ -1000,7 +1000,7 @@ int io_do_iopoll(struct io_ring_ctx *ctx, bool force_nonspin)
 
        wq_list_for_each(pos, start, &ctx->iopoll_list) {
                struct io_kiocb *req = container_of(pos, struct io_kiocb, comp_list);
-               struct io_rw *rw = io_kiocb_to_cmd(req, struct io_rw);
+               struct file *file = req->file;
                int ret;
 
                /*
@@ -1012,12 +1012,15 @@ int io_do_iopoll(struct io_ring_ctx *ctx, bool force_nonspin)
                        break;
 
                if (req->opcode == IORING_OP_URING_CMD) {
-                       struct io_uring_cmd *ioucmd = (struct io_uring_cmd *)rw;
+                       struct io_uring_cmd *ioucmd;
 
-                       ret = req->file->f_op->uring_cmd_iopoll(ioucmd);
-               } else
-                       ret = rw->kiocb.ki_filp->f_op->iopoll(&rw->kiocb, &iob,
-                                                       poll_flags);
+                       ioucmd = io_kiocb_to_cmd(req, struct io_uring_cmd);
+                       ret = file->f_op->uring_cmd_iopoll(ioucmd);
+               } else {
+                       struct io_rw *rw = io_kiocb_to_cmd(req, struct io_rw);
+
+                       ret = file->f_op->iopoll(&rw->kiocb, &iob, poll_flags);
+               }
                if (unlikely(ret < 0))
                        return ret;
                else if (ret)