ublk: enable zoned storage support
Add zoned storage support to ublk: report_zones and operations: - REQ_OP_ZONE_OPEN - REQ_OP_ZONE_CLOSE - REQ_OP_ZONE_FINISH - REQ_OP_ZONE_RESET - REQ_OP_ZONE_APPEND The zone append feature uses the `addr` field of `struct ublksrv_io_cmd` to communicate ALBA back to the kernel. Therefore ublk must be used with the user copy feature (UBLK_F_USER_COPY) for zoned storage support to be available. Without this feature, ublk will not allow zoned storage support. Signed-off-by: Andreas Hindborg <a.hindborg@samsung.com> Reviewed-by: Ming Lei <ming.lei@redhat.com> Tested-by: Ming Lei <ming.lei@redhat.com> Link: https://lore.kernel.org/r/20230804114610.179530-4-nmi@metaspace.dk Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
1a6e88b959
commit
29802d7ca3
2 changed files with 370 additions and 24 deletions
|
|
@ -176,6 +176,12 @@
|
|||
/* Copy between request and user buffer by pread()/pwrite() */
|
||||
#define UBLK_F_USER_COPY (1UL << 7)
|
||||
|
||||
/*
|
||||
* User space sets this flag when setting up the device to request zoned storage support. Kernel may
|
||||
* deny the request by returning an error.
|
||||
*/
|
||||
#define UBLK_F_ZONED (1ULL << 8)
|
||||
|
||||
/* device state */
|
||||
#define UBLK_S_DEV_DEAD 0
|
||||
#define UBLK_S_DEV_LIVE 1
|
||||
|
|
@ -232,9 +238,26 @@ struct ublksrv_ctrl_dev_info {
|
|||
#define UBLK_IO_OP_READ 0
|
||||
#define UBLK_IO_OP_WRITE 1
|
||||
#define UBLK_IO_OP_FLUSH 2
|
||||
#define UBLK_IO_OP_DISCARD 3
|
||||
#define UBLK_IO_OP_WRITE_SAME 4
|
||||
#define UBLK_IO_OP_WRITE_ZEROES 5
|
||||
#define UBLK_IO_OP_DISCARD 3
|
||||
#define UBLK_IO_OP_WRITE_SAME 4
|
||||
#define UBLK_IO_OP_WRITE_ZEROES 5
|
||||
#define UBLK_IO_OP_ZONE_OPEN 10
|
||||
#define UBLK_IO_OP_ZONE_CLOSE 11
|
||||
#define UBLK_IO_OP_ZONE_FINISH 12
|
||||
#define UBLK_IO_OP_ZONE_APPEND 13
|
||||
#define UBLK_IO_OP_ZONE_RESET 15
|
||||
/*
|
||||
* Construct a zone report. The report request is carried in `struct
|
||||
* ublksrv_io_desc`. The `start_sector` field must be the first sector of a zone
|
||||
* and shall indicate the first zone of the report. The `nr_zones` shall
|
||||
* indicate how many zones should be reported at most. The report shall be
|
||||
* delivered as a `struct blk_zone` array. To report fewer zones than requested,
|
||||
* zero the last entry of the returned array.
|
||||
*
|
||||
* Related definitions(blk_zone, blk_zone_cond, blk_zone_type, ...) in
|
||||
* include/uapi/linux/blkzoned.h are part of ublk UAPI.
|
||||
*/
|
||||
#define UBLK_IO_OP_REPORT_ZONES 18
|
||||
|
||||
#define UBLK_IO_F_FAILFAST_DEV (1U << 8)
|
||||
#define UBLK_IO_F_FAILFAST_TRANSPORT (1U << 9)
|
||||
|
|
@ -255,7 +278,10 @@ struct ublksrv_io_desc {
|
|||
/* op: bit 0-7, flags: bit 8-31 */
|
||||
__u32 op_flags;
|
||||
|
||||
__u32 nr_sectors;
|
||||
union {
|
||||
__u32 nr_sectors;
|
||||
__u32 nr_zones; /* for UBLK_IO_OP_REPORT_ZONES */
|
||||
};
|
||||
|
||||
/* start sector for this io */
|
||||
__u64 start_sector;
|
||||
|
|
@ -284,11 +310,21 @@ struct ublksrv_io_cmd {
|
|||
/* io result, it is valid for COMMIT* command only */
|
||||
__s32 result;
|
||||
|
||||
/*
|
||||
* userspace buffer address in ublksrv daemon process, valid for
|
||||
* FETCH* command only
|
||||
*/
|
||||
__u64 addr;
|
||||
union {
|
||||
/*
|
||||
* userspace buffer address in ublksrv daemon process, valid for
|
||||
* FETCH* command only
|
||||
*
|
||||
* `addr` should not be used when UBLK_F_USER_COPY is enabled,
|
||||
* because userspace handles data copy by pread()/pwrite() over
|
||||
* /dev/ublkcN. But in case of UBLK_F_ZONED, this union is
|
||||
* re-used to pass back the allocated LBA for
|
||||
* UBLK_IO_OP_ZONE_APPEND which actually depends on
|
||||
* UBLK_F_USER_COPY
|
||||
*/
|
||||
__u64 addr;
|
||||
__u64 zone_append_lba;
|
||||
};
|
||||
};
|
||||
|
||||
struct ublk_param_basic {
|
||||
|
|
@ -331,6 +367,13 @@ struct ublk_param_devt {
|
|||
__u32 disk_minor;
|
||||
};
|
||||
|
||||
struct ublk_param_zoned {
|
||||
__u32 max_open_zones;
|
||||
__u32 max_active_zones;
|
||||
__u32 max_zone_append_sectors;
|
||||
__u8 reserved[20];
|
||||
};
|
||||
|
||||
struct ublk_params {
|
||||
/*
|
||||
* Total length of parameters, userspace has to set 'len' for both
|
||||
|
|
@ -342,11 +385,13 @@ struct ublk_params {
|
|||
#define UBLK_PARAM_TYPE_BASIC (1 << 0)
|
||||
#define UBLK_PARAM_TYPE_DISCARD (1 << 1)
|
||||
#define UBLK_PARAM_TYPE_DEVT (1 << 2)
|
||||
#define UBLK_PARAM_TYPE_ZONED (1 << 3)
|
||||
__u32 types; /* types of parameter included */
|
||||
|
||||
struct ublk_param_basic basic;
|
||||
struct ublk_param_discard discard;
|
||||
struct ublk_param_devt devt;
|
||||
struct ublk_param_zoned zoned;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue