block: add example ioctl
authorJens Axboe <axboe@kernel.dk>
Thu, 16 Dec 2021 12:46:21 +0000 (18:16 +0530)
committerJens Axboe <axboe@kernel.dk>
Fri, 17 Dec 2021 16:52:30 +0000 (09:52 -0700)
commitd11e20acbd93fbbcdaf87e73615cdac53b814eca
treedd8306152e6a8a7e726f6df759c56b792e5ed1dc
parentf8d1afd705e719088caaad866a8517193ba3de4c
block: add example ioctl

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@kernel.dk>
block/fops.c
include/linux/blkdev.h