Add one private header file and move private definitions into this file. Signed-off-by: Ming Lei <tom.leiming@xxxxxxxxx> --- drivers/block/ublk/main.c | 150 +----------------------------------- drivers/block/ublk/ublk.h | 157 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 158 insertions(+), 149 deletions(-) create mode 100644 drivers/block/ublk/ublk.h diff --git a/drivers/block/ublk/main.c b/drivers/block/ublk/main.c index 1a63a1aa99ed..2510193303bb 100644 --- a/drivers/block/ublk/main.c +++ b/drivers/block/ublk/main.c @@ -19,7 +19,6 @@ #include <linux/errno.h> #include <linux/major.h> #include <linux/wait.h> -#include <linux/blkdev.h> #include <linux/init.h> #include <linux/swap.h> #include <linux/slab.h> @@ -35,162 +34,15 @@ #include <linux/ioprio.h> #include <linux/sched/mm.h> #include <linux/uaccess.h> -#include <linux/cdev.h> #include <linux/io_uring/cmd.h> -#include <linux/blk-mq.h> #include <linux/delay.h> #include <linux/mm.h> #include <asm/page.h> #include <linux/task_work.h> #include <linux/namei.h> #include <linux/kref.h> -#include <uapi/linux/ublk_cmd.h> - -#define UBLK_MINORS (1U << MINORBITS) - -/* private ioctl command mirror */ -#define UBLK_CMD_DEL_DEV_ASYNC _IOC_NR(UBLK_U_CMD_DEL_DEV_ASYNC) - -/* All UBLK_F_* have to be included into UBLK_F_ALL */ -#define UBLK_F_ALL (UBLK_F_SUPPORT_ZERO_COPY \ - | UBLK_F_URING_CMD_COMP_IN_TASK \ - | UBLK_F_NEED_GET_DATA \ - | UBLK_F_USER_RECOVERY \ - | UBLK_F_USER_RECOVERY_REISSUE \ - | UBLK_F_UNPRIVILEGED_DEV \ - | UBLK_F_CMD_IOCTL_ENCODE \ - | UBLK_F_USER_COPY \ - | UBLK_F_ZONED \ - | UBLK_F_USER_RECOVERY_FAIL_IO) - -#define UBLK_F_ALL_RECOVERY_FLAGS (UBLK_F_USER_RECOVERY \ - | UBLK_F_USER_RECOVERY_REISSUE \ - | UBLK_F_USER_RECOVERY_FAIL_IO) - -/* All UBLK_PARAM_TYPE_* should be included here */ -#define UBLK_PARAM_TYPE_ALL \ - (UBLK_PARAM_TYPE_BASIC | UBLK_PARAM_TYPE_DISCARD | \ - UBLK_PARAM_TYPE_DEVT | UBLK_PARAM_TYPE_ZONED) - -struct ublk_rq_data { - struct llist_node node; - - struct kref ref; -}; - -struct ublk_uring_cmd_pdu { - struct ublk_queue *ubq; - u16 tag; -}; - -/* - * io command is active: sqe cmd is received, and its cqe isn't done - * - * If the flag is set, the io command is owned by ublk driver, and waited - * for incoming blk-mq request from the ublk block device. - * - * If the flag is cleared, the io command will be completed, and owned by - * ublk server. - */ -#define UBLK_IO_FLAG_ACTIVE 0x01 - -/* - * IO command is completed via cqe, and it is being handled by ublksrv, and - * not committed yet - * - * Basically exclusively with UBLK_IO_FLAG_ACTIVE, so can be served for - * cross verification - */ -#define UBLK_IO_FLAG_OWNED_BY_SRV 0x02 - -/* - * IO command is aborted, so this flag is set in case of - * !UBLK_IO_FLAG_ACTIVE. - * - * After this flag is observed, any pending or new incoming request - * associated with this io command will be failed immediately - */ -#define UBLK_IO_FLAG_ABORTED 0x04 - -/* - * UBLK_IO_FLAG_NEED_GET_DATA is set because IO command requires - * get data buffer address from ublksrv. - * - * Then, bio data could be copied into this data buffer for a WRITE request - * after the IO command is issued again and UBLK_IO_FLAG_NEED_GET_DATA is unset. - */ -#define UBLK_IO_FLAG_NEED_GET_DATA 0x08 - -/* atomic RW with ubq->cancel_lock */ -#define UBLK_IO_FLAG_CANCELED 0x80000000 -struct ublk_io { - /* userspace buffer address from io cmd */ - __u64 addr; - unsigned int flags; - int res; - - struct io_uring_cmd *cmd; -}; - -struct ublk_queue { - int q_id; - int q_depth; - - unsigned long flags; - struct task_struct *ubq_daemon; - char *io_cmd_buf; - - struct llist_head io_cmds; - - unsigned short force_abort:1; - unsigned short timeout:1; - unsigned short canceling:1; - unsigned short fail_io:1; /* copy of dev->state == UBLK_S_DEV_FAIL_IO */ - unsigned short nr_io_ready; /* how many ios setup */ - spinlock_t cancel_lock; - struct ublk_device *dev; - struct ublk_io ios[]; -}; - -struct ublk_device { - struct gendisk *ub_disk; - - char *__queues; - - unsigned int queue_size; - struct ublksrv_ctrl_dev_info dev_info; - - struct blk_mq_tag_set tag_set; - - struct cdev cdev; - struct device cdev_dev; - -#define UB_STATE_OPEN 0 -#define UB_STATE_USED 1 -#define UB_STATE_DELETED 2 - unsigned long state; - int ub_number; - - struct mutex mutex; - - spinlock_t lock; - struct mm_struct *mm; - - struct ublk_params params; - - struct completion completion; - unsigned int nr_queues_ready; - unsigned int nr_privileged_daemon; - - struct work_struct nosrv_work; -}; - -/* header of ublk_params */ -struct ublk_params_header { - __u32 len; - __u32 types; -}; +#include "ublk.h" static bool ublk_abort_requests(struct ublk_device *ub, struct ublk_queue *ubq); diff --git a/drivers/block/ublk/ublk.h b/drivers/block/ublk/ublk.h new file mode 100644 index 000000000000..12e39a33015a --- /dev/null +++ b/drivers/block/ublk/ublk.h @@ -0,0 +1,157 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +#ifndef UBLK_INTERNAL_HEADER +#define UBLK_INTERNAL_HEADER + +#include <linux/blkdev.h> +#include <linux/blk-mq.h> +#include <linux/cdev.h> +#include <uapi/linux/ublk_cmd.h> + +#define UBLK_MINORS (1U << MINORBITS) + +/* private ioctl command mirror */ +#define UBLK_CMD_DEL_DEV_ASYNC _IOC_NR(UBLK_U_CMD_DEL_DEV_ASYNC) + +/* All UBLK_F_* have to be included into UBLK_F_ALL */ +#define UBLK_F_ALL (UBLK_F_SUPPORT_ZERO_COPY \ + | UBLK_F_URING_CMD_COMP_IN_TASK \ + | UBLK_F_NEED_GET_DATA \ + | UBLK_F_USER_RECOVERY \ + | UBLK_F_USER_RECOVERY_REISSUE \ + | UBLK_F_UNPRIVILEGED_DEV \ + | UBLK_F_CMD_IOCTL_ENCODE \ + | UBLK_F_USER_COPY \ + | UBLK_F_ZONED \ + | UBLK_F_USER_RECOVERY_FAIL_IO) + +#define UBLK_F_ALL_RECOVERY_FLAGS (UBLK_F_USER_RECOVERY \ + | UBLK_F_USER_RECOVERY_REISSUE \ + | UBLK_F_USER_RECOVERY_FAIL_IO) + +/* All UBLK_PARAM_TYPE_* should be included here */ +#define UBLK_PARAM_TYPE_ALL \ + (UBLK_PARAM_TYPE_BASIC | UBLK_PARAM_TYPE_DISCARD | \ + UBLK_PARAM_TYPE_DEVT | UBLK_PARAM_TYPE_ZONED) + +struct ublk_rq_data { + struct llist_node node; + + struct kref ref; +}; + +struct ublk_uring_cmd_pdu { + struct ublk_queue *ubq; + u16 tag; +}; + +/* + * io command is active: sqe cmd is received, and its cqe isn't done + * + * If the flag is set, the io command is owned by ublk driver, and waited + * for incoming blk-mq request from the ublk block device. + * + * If the flag is cleared, the io command will be completed, and owned by + * ublk server. + */ +#define UBLK_IO_FLAG_ACTIVE 0x01 + +/* + * IO command is completed via cqe, and it is being handled by ublksrv, and + * not committed yet + * + * Basically exclusively with UBLK_IO_FLAG_ACTIVE, so can be served for + * cross verification + */ +#define UBLK_IO_FLAG_OWNED_BY_SRV 0x02 + +/* + * IO command is aborted, so this flag is set in case of + * !UBLK_IO_FLAG_ACTIVE. + * + * After this flag is observed, any pending or new incoming request + * associated with this io command will be failed immediately + */ +#define UBLK_IO_FLAG_ABORTED 0x04 + +/* + * UBLK_IO_FLAG_NEED_GET_DATA is set because IO command requires + * get data buffer address from ublksrv. + * + * Then, bio data could be copied into this data buffer for a WRITE request + * after the IO command is issued again and UBLK_IO_FLAG_NEED_GET_DATA is unset. + */ +#define UBLK_IO_FLAG_NEED_GET_DATA 0x08 + +/* atomic RW with ubq->cancel_lock */ +#define UBLK_IO_FLAG_CANCELED 0x80000000 + +struct ublk_io { + /* userspace buffer address from io cmd */ + __u64 addr; + unsigned int flags; + int res; + + struct io_uring_cmd *cmd; +}; + +struct ublk_queue { + int q_id; + int q_depth; + + unsigned long flags; + struct task_struct *ubq_daemon; + char *io_cmd_buf; + + struct llist_head io_cmds; + + unsigned short force_abort:1; + unsigned short timeout:1; + unsigned short canceling:1; + unsigned short fail_io:1; /* copy of dev->state == UBLK_S_DEV_FAIL_IO */ + unsigned short nr_io_ready; /* how many ios setup */ + spinlock_t cancel_lock; + struct ublk_device *dev; + struct ublk_io ios[]; +}; + +struct ublk_device { + struct gendisk *ub_disk; + + char *__queues; + + unsigned int queue_size; + struct ublksrv_ctrl_dev_info dev_info; + + struct blk_mq_tag_set tag_set; + + struct cdev cdev; + struct device cdev_dev; + +#define UB_STATE_OPEN 0 +#define UB_STATE_USED 1 +#define UB_STATE_DELETED 2 + unsigned long state; + int ub_number; + + struct mutex mutex; + + spinlock_t lock; + struct mm_struct *mm; + + struct ublk_params params; + + struct completion completion; + unsigned int nr_queues_ready; + unsigned int nr_privileged_daemon; + + struct work_struct nosrv_work; +}; + +/* header of ublk_params */ +struct ublk_params_header { + __u32 len; + __u32 types; +}; + + +#endif -- 2.47.0