Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
2/*
3 * Zoned block devices handling.
4 *
5 * Copyright (C) 2015 Seagate Technology PLC
6 *
7 * Written by: Shaun Tancheff <shaun.tancheff@seagate.com>
8 *
9 * Modified by: Damien Le Moal <damien.lemoal@hgst.com>
10 * Copyright (C) 2016 Western Digital
11 *
12 * This file is licensed under the terms of the GNU General Public
13 * License version 2. This program is licensed "as is" without any
14 * warranty of any kind, whether express or implied.
15 */
16#ifndef _UAPI_BLKZONED_H
17#define _UAPI_BLKZONED_H
18
19#include <linux/types.h>
20#include <linux/ioctl.h>
21
22/**
23 * enum blk_zone_type - Types of zones allowed in a zoned device.
24 *
25 * @BLK_ZONE_TYPE_CONVENTIONAL: The zone has no write pointer and can be writen
26 * randomly. Zone reset has no effect on the zone.
27 * @BLK_ZONE_TYPE_SEQWRITE_REQ: The zone must be written sequentially
28 * @BLK_ZONE_TYPE_SEQWRITE_PREF: The zone can be written non-sequentially
29 *
30 * Any other value not defined is reserved and must be considered as invalid.
31 */
32enum blk_zone_type {
33 BLK_ZONE_TYPE_CONVENTIONAL = 0x1,
34 BLK_ZONE_TYPE_SEQWRITE_REQ = 0x2,
35 BLK_ZONE_TYPE_SEQWRITE_PREF = 0x3,
36};
37
38/**
39 * enum blk_zone_cond - Condition [state] of a zone in a zoned device.
40 *
41 * @BLK_ZONE_COND_NOT_WP: The zone has no write pointer, it is conventional.
42 * @BLK_ZONE_COND_EMPTY: The zone is empty.
43 * @BLK_ZONE_COND_IMP_OPEN: The zone is open, but not explicitly opened.
44 * @BLK_ZONE_COND_EXP_OPEN: The zones was explicitly opened by an
45 * OPEN ZONE command.
46 * @BLK_ZONE_COND_CLOSED: The zone was [explicitly] closed after writing.
47 * @BLK_ZONE_COND_FULL: The zone is marked as full, possibly by a zone
48 * FINISH ZONE command.
49 * @BLK_ZONE_COND_READONLY: The zone is read-only.
50 * @BLK_ZONE_COND_OFFLINE: The zone is offline (sectors cannot be read/written).
51 * @BLK_ZONE_COND_ACTIVE: The zone is either implicitly open, explicitly open,
52 * or closed.
53 *
54 * The Zone Condition state machine in the ZBC/ZAC standards maps the above
55 * deinitions as:
56 * - ZC1: Empty | BLK_ZONE_COND_EMPTY
57 * - ZC2: Implicit Open | BLK_ZONE_COND_IMP_OPEN
58 * - ZC3: Explicit Open | BLK_ZONE_COND_EXP_OPEN
59 * - ZC4: Closed | BLK_ZONE_COND_CLOSED
60 * - ZC5: Full | BLK_ZONE_COND_FULL
61 * - ZC6: Read Only | BLK_ZONE_COND_READONLY
62 * - ZC7: Offline | BLK_ZONE_COND_OFFLINE
63 *
64 * Conditions 0x5 to 0xC are reserved by the current ZBC/ZAC spec and should
65 * be considered invalid.
66 *
67 * The condition BLK_ZONE_COND_ACTIVE is used only with cached zone reports.
68 * It is used to report any of the BLK_ZONE_COND_IMP_OPEN,
69 * BLK_ZONE_COND_EXP_OPEN and BLK_ZONE_COND_CLOSED conditions. Conversely, a
70 * regular zone report will never report a zone condition using
71 * BLK_ZONE_COND_ACTIVE and instead use the conditions BLK_ZONE_COND_IMP_OPEN,
72 * BLK_ZONE_COND_EXP_OPEN or BLK_ZONE_COND_CLOSED as reported by the device.
73 */
74enum blk_zone_cond {
75 BLK_ZONE_COND_NOT_WP = 0x0,
76 BLK_ZONE_COND_EMPTY = 0x1,
77 BLK_ZONE_COND_IMP_OPEN = 0x2,
78 BLK_ZONE_COND_EXP_OPEN = 0x3,
79 BLK_ZONE_COND_CLOSED = 0x4,
80 BLK_ZONE_COND_READONLY = 0xD,
81 BLK_ZONE_COND_FULL = 0xE,
82 BLK_ZONE_COND_OFFLINE = 0xF,
83
84 BLK_ZONE_COND_ACTIVE = 0xFF,
85};
86
87/**
88 * enum blk_zone_report_flags - Feature flags of reported zone descriptors.
89 *
90 * @BLK_ZONE_REP_CAPACITY: Output only. Indicates that zone descriptors in a
91 * zone report have a valid capacity field.
92 * @BLK_ZONE_REP_CACHED: Input only. Indicates that the zone report should be
93 * generated using cached zone information. In this case,
94 * the implicit open, explicit open and closed zone
95 * conditions are all reported with the
96 * BLK_ZONE_COND_ACTIVE condition.
97 */
98enum blk_zone_report_flags {
99 /* Output flags */
100 BLK_ZONE_REP_CAPACITY = (1U << 0),
101
102 /* Input flags */
103 BLK_ZONE_REP_CACHED = (1U << 31),
104};
105
106/**
107 * struct blk_zone - Zone descriptor for BLKREPORTZONE ioctl.
108 *
109 * @start: Zone start in 512 B sector units
110 * @len: Zone length in 512 B sector units
111 * @wp: Zone write pointer location in 512 B sector units
112 * @type: see enum blk_zone_type for possible values
113 * @cond: see enum blk_zone_cond for possible values
114 * @non_seq: Flag indicating that the zone is using non-sequential resources
115 * (for host-aware zoned block devices only).
116 * @reset: Flag indicating that a zone reset is recommended.
117 * @resv: Padding for 8B alignment.
118 * @capacity: Zone usable capacity in 512 B sector units
119 * @reserved: Padding to 64 B to match the ZBC, ZAC and ZNS defined zone
120 * descriptor size.
121 *
122 * start, len, capacity and wp use the regular 512 B sector unit, regardless
123 * of the device logical block size. The overall structure size is 64 B to
124 * match the ZBC, ZAC and ZNS defined zone descriptor and allow support for
125 * future additional zone information.
126 */
127struct blk_zone {
128 __u64 start; /* Zone start sector */
129 __u64 len; /* Zone length in number of sectors */
130 __u64 wp; /* Zone write pointer position */
131 __u8 type; /* Zone type */
132 __u8 cond; /* Zone condition */
133 __u8 non_seq; /* Non-sequential write resources active */
134 __u8 reset; /* Reset write pointer recommended */
135 __u8 resv[4];
136 __u64 capacity; /* Zone capacity in number of sectors */
137 __u8 reserved[24];
138};
139
140/**
141 * struct blk_zone_report - BLKREPORTZONE ioctl request/reply
142 *
143 * @sector: starting sector of report
144 * @nr_zones: IN maximum / OUT actual
145 * @flags: one or more flags as defined by enum blk_zone_report_flags.
146 * @flags: one or more flags as defined by enum blk_zone_report_flags.
147 * With BLKREPORTZONE, this field is ignored as an input and is valid
148 * only as an output. Using BLKREPORTZONEV2, this field is used as both
149 * input and output.
150 * @zones: Space to hold @nr_zones @zones entries on reply.
151 *
152 * The array of at most @nr_zones must follow this structure in memory.
153 */
154struct blk_zone_report {
155 __u64 sector;
156 __u32 nr_zones;
157 __u32 flags;
158 struct blk_zone zones[];
159};
160
161/**
162 * struct blk_zone_range - BLKRESETZONE/BLKOPENZONE/
163 * BLKCLOSEZONE/BLKFINISHZONE ioctl
164 * requests
165 * @sector: Starting sector of the first zone to operate on.
166 * @nr_sectors: Total number of sectors of all zones to operate on.
167 */
168struct blk_zone_range {
169 __u64 sector;
170 __u64 nr_sectors;
171};
172
173/**
174 * Zoned block device ioctl's:
175 *
176 * @BLKREPORTZONE: Get zone information from a zoned device. Takes a zone report
177 * as argument. The zone report will start from the zone
178 * containing the sector specified in struct blk_zone_report.
179 * The flags field of struct blk_zone_report is used as an
180 * output only and ignored as an input.
181 * DEPRECATED, use BLKREPORTZONEV2 instead.
182 * @BLKREPORTZONEV2: Same as @BLKREPORTZONE but uses the flags field of
183 * struct blk_zone_report as an input, allowing to get a zone
184 * report using cached zone information if the flag
185 * BLK_ZONE_REP_CACHED is set. In such case, the zone report
186 * may include zones with the condition @BLK_ZONE_COND_ACTIVE
187 * (c.f. the description of this condition above for more
188 * details).
189 * @BLKRESETZONE: Reset the write pointer of the zones in the specified
190 * sector range. The sector range must be zone aligned.
191 * @BLKGETZONESZ: Get the device zone size in number of 512 B sectors.
192 * @BLKGETNRZONES: Get the total number of zones of the device.
193 * @BLKOPENZONE: Open the zones in the specified sector range.
194 * The 512 B sector range must be zone aligned.
195 * @BLKCLOSEZONE: Close the zones in the specified sector range.
196 * The 512 B sector range must be zone aligned.
197 * @BLKFINISHZONE: Mark the zones as full in the specified sector range.
198 * The 512 B sector range must be zone aligned.
199 */
200#define BLKREPORTZONE _IOWR(0x12, 130, struct blk_zone_report)
201#define BLKRESETZONE _IOW(0x12, 131, struct blk_zone_range)
202#define BLKGETZONESZ _IOR(0x12, 132, __u32)
203#define BLKGETNRZONES _IOR(0x12, 133, __u32)
204#define BLKOPENZONE _IOW(0x12, 134, struct blk_zone_range)
205#define BLKCLOSEZONE _IOW(0x12, 135, struct blk_zone_range)
206#define BLKFINISHZONE _IOW(0x12, 136, struct blk_zone_range)
207#define BLKREPORTZONEV2 _IOWR(0x12, 142, struct blk_zone_report)
208
209#endif /* _UAPI_BLKZONED_H */