On Mon, Mar 17, 2025 at 7:00 AM Sidong Yang <sidong.yang@xxxxxxxxxx> wrote: > > This patch introduces btrfs_uring_import_iovec(). In encoded read/write > with uring cmd, it uses import_iovec without supporting fixed buffer. > btrfs_using_import_iovec() could use fixed buffer if cmd flags has > IORING_URING_CMD_FIXED. > > Signed-off-by: Sidong Yang <sidong.yang@xxxxxxxxxx> > --- > fs/btrfs/ioctl.c | 32 ++++++++++++++++++++++++-------- > 1 file changed, 24 insertions(+), 8 deletions(-) > > diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c > index 6c18bad53cd3..a7b52fd99059 100644 > --- a/fs/btrfs/ioctl.c > +++ b/fs/btrfs/ioctl.c > @@ -4802,6 +4802,28 @@ struct btrfs_uring_encoded_data { > struct iov_iter iter; > }; > > +static int btrfs_uring_import_iovec(struct io_uring_cmd *cmd, > + unsigned int issue_flags, int rw) > +{ > + struct btrfs_uring_encoded_data *data = > + io_uring_cmd_get_async_data(cmd)->op_data; > + int ret; > + > + if (cmd && (cmd->flags & IORING_URING_CMD_FIXED)) { > + data->iov = NULL; > + ret = io_uring_cmd_import_fixed_vec(cmd, data->args.iov, > + data->args.iovcnt, > + ITER_DEST, issue_flags, Why ITER_DEST instead of rw? Best, Caleb > + &data->iter); > + } else { > + data->iov = data->iovstack; > + ret = import_iovec(rw, data->args.iov, data->args.iovcnt, > + ARRAY_SIZE(data->iovstack), &data->iov, > + &data->iter); > + } > + return ret; > +} > + > static int btrfs_uring_encoded_read(struct io_uring_cmd *cmd, unsigned int issue_flags) > { > size_t copy_end_kernel = offsetofend(struct btrfs_ioctl_encoded_io_args, flags); > @@ -4874,10 +4896,7 @@ static int btrfs_uring_encoded_read(struct io_uring_cmd *cmd, unsigned int issue > goto out_acct; > } > > - data->iov = data->iovstack; > - ret = import_iovec(ITER_DEST, data->args.iov, data->args.iovcnt, > - ARRAY_SIZE(data->iovstack), &data->iov, > - &data->iter); > + ret = btrfs_uring_import_iovec(cmd, issue_flags, ITER_DEST); > if (ret < 0) > goto out_acct; > > @@ -5022,10 +5041,7 @@ static int btrfs_uring_encoded_write(struct io_uring_cmd *cmd, unsigned int issu > if (data->args.len > data->args.unencoded_len - data->args.unencoded_offset) > goto out_acct; > > - data->iov = data->iovstack; > - ret = import_iovec(ITER_SOURCE, data->args.iov, data->args.iovcnt, > - ARRAY_SIZE(data->iovstack), &data->iov, > - &data->iter); > + ret = btrfs_uring_import_iovec(cmd, issue_flags, ITER_SOURCE); > if (ret < 0) > goto out_acct; > > -- > 2.43.0 > >