1 /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
2 #ifndef USER_BLK_DRV_CMD_INC_H
3 #define USER_BLK_DRV_CMD_INC_H
5 #include <linux/types.h>
7 /* ublk server command definition */
10 * Admin commands, issued by ublk server, and handled by ublk driver.
12 #define UBLK_CMD_GET_QUEUE_AFFINITY 0x01
13 #define UBLK_CMD_GET_DEV_INFO 0x02
14 #define UBLK_CMD_ADD_DEV 0x04
15 #define UBLK_CMD_DEL_DEV 0x05
16 #define UBLK_CMD_START_DEV 0x06
17 #define UBLK_CMD_STOP_DEV 0x07
20 * IO commands, issued by ublk server, and handled by ublk driver.
22 * FETCH_REQ: issued via sqe(URING_CMD) beforehand for fetching IO request
23 * from ublk driver, should be issued only when starting device. After
24 * the associated cqe is returned, request's tag can be retrieved via
27 * COMMIT_AND_FETCH_REQ: issued via sqe(URING_CMD) after ublkserver handled
28 * this IO request, request's handling result is committed to ublk
29 * driver, meantime FETCH_REQ is piggyback, and FETCH_REQ has to be
30 * handled before completing io request.
32 #define UBLK_IO_FETCH_REQ 0x20
33 #define UBLK_IO_COMMIT_AND_FETCH_REQ 0x21
35 /* only ABORT means that no re-fetch */
36 #define UBLK_IO_RES_OK 0
37 #define UBLK_IO_RES_ABORT (-ENODEV)
39 #define UBLKSRV_CMD_BUF_OFFSET 0
40 #define UBLKSRV_IO_BUF_OFFSET 0x80000000
42 /* tag bit is 12bit, so at most 4096 IOs for each queue */
43 #define UBLK_MAX_QUEUE_DEPTH 4096
46 * zero copy requires 4k block size, and can remap ublk driver's io
47 * request into ublksrv's vm space
49 #define UBLK_F_SUPPORT_ZERO_COPY (1UL << 0)
52 #define UBLK_S_DEV_DEAD 0
53 #define UBLK_S_DEV_LIVE 1
55 /* shipped via sqe->cmd of io_uring command */
56 struct ublksrv_ctrl_cmd {
57 /* sent to which device, must be valid */
60 /* sent to which queue, must be -1 if the cmd isn't for queue */
63 * cmd specific buffer, can be IN or OUT.
72 struct ublksrv_ctrl_dev_info {
87 /* For ublksrv internal use, invisible to ublk driver */
92 #define UBLK_IO_OP_READ 0
93 #define UBLK_IO_OP_WRITE 1
94 #define UBLK_IO_OP_FLUSH 2
95 #define UBLK_IO_OP_DISCARD 3
96 #define UBLK_IO_OP_WRITE_SAME 4
97 #define UBLK_IO_OP_WRITE_ZEROES 5
99 #define UBLK_IO_F_FAILFAST_DEV (1U << 8)
100 #define UBLK_IO_F_FAILFAST_TRANSPORT (1U << 9)
101 #define UBLK_IO_F_FAILFAST_DRIVER (1U << 10)
102 #define UBLK_IO_F_META (1U << 11)
103 #define UBLK_IO_F_INTEGRITY (1U << 12)
104 #define UBLK_IO_F_FUA (1U << 13)
105 #define UBLK_IO_F_PREFLUSH (1U << 14)
106 #define UBLK_IO_F_NOUNMAP (1U << 15)
107 #define UBLK_IO_F_SWAP (1U << 16)
110 * io cmd is described by this structure, and stored in share memory, indexed
113 * The data is stored by ublk driver, and read by ublksrv after one fetch command
116 struct ublksrv_io_desc {
117 /* op: bit 0-7, flags: bit 8-31 */
122 /* start sector for this io */
125 /* buffer address in ublksrv daemon vm space, from ublk driver */
129 static inline __u8 ublksrv_get_op(const struct ublksrv_io_desc *iod)
131 return iod->op_flags & 0xff;
134 static inline __u32 ublksrv_get_flags(const struct ublksrv_io_desc *iod)
136 return iod->op_flags >> 8;
139 /* issued to ublk driver via /dev/ublkcN */
140 struct ublksrv_io_cmd {
143 /* for fetch/commit which result */
146 /* io result, it is valid for COMMIT* command only */
150 * userspace buffer address in ublksrv daemon process, valid for
151 * FETCH* command only