Ming Lei <ming.lei@xxxxxxxxxx> writes: > On Tue, Aug 01, 2023 at 02:11:56PM +0200, Andreas Hindborg (Samsung) wrote: >> >> Niklas Cassel <Niklas.Cassel@xxxxxxx> writes: >> >> > On Fri, Jul 14, 2023 at 09:25:10AM +0200, Andreas Hindborg wrote: >> >> From: Andreas Hindborg <a.hindborg@xxxxxxxxxxx> >> > >> > Hello Andreas! >> > >> >> <snip> >> >> >> /* for READ request, writing data in iod->addr to rq buffers */ >> >> @@ -1120,6 +1404,11 @@ static void ublk_commit_completion(struct ublk_device *ub, >> >> /* find the io request and complete */ >> >> req = blk_mq_tag_to_rq(ub->tag_set.tags[qid], tag); >> >> >> >> + if (io->flags & UBLK_IO_FLAG_ZONE_APPEND) { >> > >> > Do we really need to introduce a completely new flag just for this? >> > >> > if (req_op(req) == REQ_OP_ZONE_APPEND) >> > >> > should work just as well, no? >> >> Makes sense, thanks. > > The above one can be replaced with req_op(). > > But extra cost is added when retrieving request for the check in > __ublk_ch_uring_cmd(). > How about this (diff to v9): @@ -1709,7 +1702,7 @@ static int __ublk_ch_uring_cmd(struct io_uring_cmd *cmd, goto out; if (ublk_support_user_copy(ubq) && - !(io->flags & UBLK_IO_FLAG_ZONE_APPEND) && ub_cmd->addr) { + _IOC_NR(cmd_op) != UBLK_IO_COMMIT_AND_FETCH_REQ && ub_cmd->addr) { ret = -EINVAL; goto out; } @@ -1751,6 +1744,12 @@ static int __ublk_ch_uring_cmd(struct io_uring_cmd *cmd, if (!(io->flags & UBLK_IO_FLAG_OWNED_BY_SRV)) goto out; + if (ublk_support_user_copy(ubq) && + req_op(req) != REQ_OP_ZONE_APPEND && ub_cmd->addr) { + ret = -EINVAL; + goto out; + } + if (!ublk_support_user_copy(ubq)) { /* * COMMIT_AND_FETCH_REQ has to provide IO buffer if BR Andreas