Grab op == 1, BLOCK_URING_OP_IOCTL, and use it to implement basic ioctl functionality. Example code, to issue BLKBSZGET through IORING_OP_URING_CMD: struct block_uring_cmd { __u32 ioctl_cmd; __u32 unused1; __u64 unused2[4]; }; static int get_bs(struct io_uring *ring, const char *dev) { struct io_uring_cqe *cqe; struct io_uring_sqe *sqe; struct io_uring_cmd_sqe *csqe; struct block_uring_cmd *cmd; int ret, fd; fd = open(dev, O_RDONLY); sqe = io_uring_get_sqe(ring); csqe = (void *) sqe; memset(csqe, 0, sizeof(*csqe)); csqe->hdr.opcode = IORING_OP_URING_CMD; csqe->hdr.fd = fd; csqe->user_data = 0x1234; csqe->op = BLOCK_URING_OP_IOCTL; io_uring_submit(ring); io_uring_wait_cqe(ring, &cqe); printf("bs=%d\n", cqe->res); io_uring_cqe_seen(ring, cqe); return 0; err: return 1; } Signed-off-by: Jens Axboe <axboe@xxxxxxxxx> --- fs/block_dev.c | 20 ++++++++++++++++++++ include/linux/blkdev.h | 11 +++++++++++ 2 files changed, 31 insertions(+) diff --git a/fs/block_dev.c b/fs/block_dev.c index cbc403ad0330..9e44f63a0fe1 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c @@ -318,11 +318,31 @@ struct blkdev_dio { static struct bio_set blkdev_dio_pool; +static int blkdev_uring_ioctl(struct block_device *bdev, + struct io_uring_cmd *cmd) +{ + struct block_uring_cmd *bcmd = (struct block_uring_cmd *) &cmd->pdu; + + switch (bcmd->ioctl_cmd) { + case BLKBSZGET: + return block_size(bdev); + default: + return -ENOTTY; + } +} + static int blkdev_uring_cmd(struct io_uring_cmd *cmd, enum io_uring_cmd_flags flags) { struct block_device *bdev = I_BDEV(cmd->file->f_mapping->host); + switch (cmd->op) { + case BLOCK_URING_OP_IOCTL: + return blkdev_uring_ioctl(bdev, cmd); + default: + break; + } + return blk_uring_cmd(bdev, cmd, flags); } diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 7eb993e82783..fa895aa3b51a 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -44,6 +44,17 @@ struct blk_queue_stats; struct blk_stat_callback; struct blk_keyslot_manager; +enum { + BLOCK_URING_OP_IOCTL = 1, +}; + +/* This overlays struct io_uring_cmd pdu (40 bytes) */ +struct block_uring_cmd { + __u32 ioctl_cmd; + __u32 unused1; + __u64 unused2[4]; +}; + #define BLKDEV_MIN_RQ 4 #define BLKDEV_MAX_RQ 128 /* Default maximum */ -- 2.31.0