From: Linus Torvalds Date: Sun, 7 May 2023 17:00:09 +0000 (-0700) Subject: Merge tag 'for-6.4/io_uring-2023-05-07' of git://git.kernel.dk/linux X-Git-Tag: v6.6.17~4893 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=03e5cb7b50feb687508946a702febaba24c77f0b;p=platform%2Fkernel%2Flinux-rpi.git Merge tag 'for-6.4/io_uring-2023-05-07' of git://git.kernel.dk/linux Pull more io_uring updates from Jens Axboe: "Nothing major in here, just two different parts: - A small series from Breno that enables passing the full SQE down for ->uring_cmd(). This is a prerequisite for enabling full network socket operations. Queued up a bit late because of some stylistic concerns that got resolved, would be nice to have this in 6.4-rc1 so the dependent work will be easier to handle for 6.5. - Fix for the huge page coalescing, which was a regression introduced in the 6.3 kernel release (Tobias)" * tag 'for-6.4/io_uring-2023-05-07' of git://git.kernel.dk/linux: io_uring: Remove unnecessary BUILD_BUG_ON io_uring: Pass whole sqe to commands io_uring: Create a helper to return the SQE size io_uring/rsrc: check for nonconsecutive pages --- 03e5cb7b50feb687508946a702febaba24c77f0b diff --cc drivers/block/ublk_drv.c index 72a5cde,42f4d7c..c7331f5 --- a/drivers/block/ublk_drv.c +++ b/drivers/block/ublk_drv.c @@@ -1277,23 -1261,9 +1277,23 @@@ static void ublk_handle_need_get_data(s ublk_queue_cmd(ubq, req); } -static int ublk_ch_uring_cmd(struct io_uring_cmd *cmd, unsigned int issue_flags) +static inline int ublk_check_cmd_op(u32 cmd_op) +{ + u32 ioc_type = _IOC_TYPE(cmd_op); + + if (IS_ENABLED(CONFIG_BLKDEV_UBLK_LEGACY_OPCODES) && ioc_type != 'u') + return -EOPNOTSUPP; + + if (ioc_type != 'u' && ioc_type != 0) + return -EOPNOTSUPP; + + return 0; +} + +static int __ublk_ch_uring_cmd(struct io_uring_cmd *cmd, + unsigned int issue_flags, - struct ublksrv_io_cmd *ub_cmd) ++ const struct ublksrv_io_cmd *ub_cmd) { - const struct ublksrv_io_cmd *ub_cmd = io_uring_sqe_cmd(cmd->sqe); struct ublk_device *ub = cmd->file->private_data; struct ublk_queue *ubq; struct ublk_io *io; @@@ -1397,23 -1362,6 +1397,23 @@@ return -EIOCBQUEUED; } +static int ublk_ch_uring_cmd(struct io_uring_cmd *cmd, unsigned int issue_flags) +{ - struct ublksrv_io_cmd *ub_src = (struct ublksrv_io_cmd *) cmd->cmd; - struct ublksrv_io_cmd ub_cmd; - + /* + * Not necessary for async retry, but let's keep it simple and always + * copy the values to avoid any potential reuse. + */ - ub_cmd.q_id = READ_ONCE(ub_src->q_id); - ub_cmd.tag = READ_ONCE(ub_src->tag); - ub_cmd.result = READ_ONCE(ub_src->result); - ub_cmd.addr = READ_ONCE(ub_src->addr); ++ const struct ublksrv_io_cmd *ub_src = io_uring_sqe_cmd(cmd->sqe); ++ const struct ublksrv_io_cmd ub_cmd = { ++ .q_id = READ_ONCE(ub_src->q_id), ++ .tag = READ_ONCE(ub_src->tag), ++ .result = READ_ONCE(ub_src->result), ++ .addr = READ_ONCE(ub_src->addr) ++ }; + + return __ublk_ch_uring_cmd(cmd, issue_flags, &ub_cmd); +} + static const struct file_operations ublk_ch_fops = { .owner = THIS_MODULE, .open = ublk_ch_open, @@@ -2240,9 -2171,8 +2240,9 @@@ exit static int ublk_ctrl_uring_cmd(struct io_uring_cmd *cmd, unsigned int issue_flags) { - struct ublksrv_ctrl_cmd *header = (struct ublksrv_ctrl_cmd *)cmd->cmd; + const struct ublksrv_ctrl_cmd *header = io_uring_sqe_cmd(cmd->sqe); struct ublk_device *ub = NULL; + u32 cmd_op = cmd->cmd_op; int ret = -EINVAL; if (issue_flags & IO_URING_F_NONBLOCK)