[PATCH 6/8] block: add example ioctl
Jens Axboe
axboe at kernel.dk
Wed Mar 17 22:10:25 GMT 2021
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 at kernel.dk>
---
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
More information about the Linux-nvme
mailing list