OSDN Git Service

Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
[tomoyo/tomoyo-test1.git] / Documentation / filesystems / zonefs.txt
1 ZoneFS - Zone filesystem for Zoned block devices
2
3 Introduction
4 ============
5
6 zonefs is a very simple file system exposing each zone of a zoned block device
7 as a file. Unlike a regular POSIX-compliant file system with native zoned block
8 device support (e.g. f2fs), zonefs does not hide the sequential write
9 constraint of zoned block devices to the user. Files representing sequential
10 write zones of the device must be written sequentially starting from the end
11 of the file (append only writes).
12
13 As such, zonefs is in essence closer to a raw block device access interface
14 than to a full-featured POSIX file system. The goal of zonefs is to simplify
15 the implementation of zoned block device support in applications by replacing
16 raw block device file accesses with a richer file API, avoiding relying on
17 direct block device file ioctls which may be more obscure to developers. One
18 example of this approach is the implementation of LSM (log-structured merge)
19 tree structures (such as used in RocksDB and LevelDB) on zoned block devices
20 by allowing SSTables to be stored in a zone file similarly to a regular file
21 system rather than as a range of sectors of the entire disk. The introduction
22 of the higher level construct "one file is one zone" can help reducing the
23 amount of changes needed in the application as well as introducing support for
24 different application programming languages.
25
26 Zoned block devices
27 -------------------
28
29 Zoned storage devices belong to a class of storage devices with an address
30 space that is divided into zones. A zone is a group of consecutive LBAs and all
31 zones are contiguous (there are no LBA gaps). Zones may have different types.
32 * Conventional zones: there are no access constraints to LBAs belonging to
33   conventional zones. Any read or write access can be executed, similarly to a
34   regular block device.
35 * Sequential zones: these zones accept random reads but must be written
36   sequentially. Each sequential zone has a write pointer maintained by the
37   device that keeps track of the mandatory start LBA position of the next write
38   to the device. As a result of this write constraint, LBAs in a sequential zone
39   cannot be overwritten. Sequential zones must first be erased using a special
40   command (zone reset) before rewriting.
41
42 Zoned storage devices can be implemented using various recording and media
43 technologies. The most common form of zoned storage today uses the SCSI Zoned
44 Block Commands (ZBC) and Zoned ATA Commands (ZAC) interfaces on Shingled
45 Magnetic Recording (SMR) HDDs.
46
47 Solid State Disks (SSD) storage devices can also implement a zoned interface
48 to, for instance, reduce internal write amplification due to garbage collection.
49 The NVMe Zoned NameSpace (ZNS) is a technical proposal of the NVMe standard
50 committee aiming at adding a zoned storage interface to the NVMe protocol.
51
52 Zonefs Overview
53 ===============
54
55 Zonefs exposes the zones of a zoned block device as files. The files
56 representing zones are grouped by zone type, which are themselves represented
57 by sub-directories. This file structure is built entirely using zone information
58 provided by the device and so does not require any complex on-disk metadata
59 structure.
60
61 On-disk metadata
62 ----------------
63
64 zonefs on-disk metadata is reduced to an immutable super block which
65 persistently stores a magic number and optional feature flags and values. On
66 mount, zonefs uses blkdev_report_zones() to obtain the device zone configuration
67 and populates the mount point with a static file tree solely based on this
68 information. File sizes come from the device zone type and write pointer
69 position managed by the device itself.
70
71 The super block is always written on disk at sector 0. The first zone of the
72 device storing the super block is never exposed as a zone file by zonefs. If
73 the zone containing the super block is a sequential zone, the mkzonefs format
74 tool always "finishes" the zone, that is, it transitions the zone to a full
75 state to make it read-only, preventing any data write.
76
77 Zone type sub-directories
78 -------------------------
79
80 Files representing zones of the same type are grouped together under the same
81 sub-directory automatically created on mount.
82
83 For conventional zones, the sub-directory "cnv" is used. This directory is
84 however created if and only if the device has usable conventional zones. If
85 the device only has a single conventional zone at sector 0, the zone will not
86 be exposed as a file as it will be used to store the zonefs super block. For
87 such devices, the "cnv" sub-directory will not be created.
88
89 For sequential write zones, the sub-directory "seq" is used.
90
91 These two directories are the only directories that exist in zonefs. Users
92 cannot create other directories and cannot rename nor delete the "cnv" and
93 "seq" sub-directories.
94
95 The size of the directories indicated by the st_size field of struct stat,
96 obtained with the stat() or fstat() system calls, indicates the number of files
97 existing under the directory.
98
99 Zone files
100 ----------
101
102 Zone files are named using the number of the zone they represent within the set
103 of zones of a particular type. That is, both the "cnv" and "seq" directories
104 contain files named "0", "1", "2", ... The file numbers also represent
105 increasing zone start sector on the device.
106
107 All read and write operations to zone files are not allowed beyond the file
108 maximum size, that is, beyond the zone size. Any access exceeding the zone
109 size is failed with the -EFBIG error.
110
111 Creating, deleting, renaming or modifying any attribute of files and
112 sub-directories is not allowed.
113
114 The number of blocks of a file as reported by stat() and fstat() indicates the
115 size of the file zone, or in other words, the maximum file size.
116
117 Conventional zone files
118 -----------------------
119
120 The size of conventional zone files is fixed to the size of the zone they
121 represent. Conventional zone files cannot be truncated.
122
123 These files can be randomly read and written using any type of I/O operation:
124 buffered I/Os, direct I/Os, memory mapped I/Os (mmap), etc. There are no I/O
125 constraint for these files beyond the file size limit mentioned above.
126
127 Sequential zone files
128 ---------------------
129
130 The size of sequential zone files grouped in the "seq" sub-directory represents
131 the file's zone write pointer position relative to the zone start sector.
132
133 Sequential zone files can only be written sequentially, starting from the file
134 end, that is, write operations can only be append writes. Zonefs makes no
135 attempt at accepting random writes and will fail any write request that has a
136 start offset not corresponding to the end of the file, or to the end of the last
137 write issued and still in-flight (for asynchronous I/O operations).
138
139 Since dirty page writeback by the page cache does not guarantee a sequential
140 write pattern, zonefs prevents buffered writes and writeable shared mappings
141 on sequential files. Only direct I/O writes are accepted for these files.
142 zonefs relies on the sequential delivery of write I/O requests to the device
143 implemented by the block layer elevator. An elevator implementing the sequential
144 write feature for zoned block device (ELEVATOR_F_ZBD_SEQ_WRITE elevator feature)
145 must be used. This type of elevator (e.g. mq-deadline) is set by default
146 for zoned block devices on device initialization.
147
148 There are no restrictions on the type of I/O used for read operations in
149 sequential zone files. Buffered I/Os, direct I/Os and shared read mappings are
150 all accepted.
151
152 Truncating sequential zone files is allowed only down to 0, in which case, the
153 zone is reset to rewind the file zone write pointer position to the start of
154 the zone, or up to the zone size, in which case the file's zone is transitioned
155 to the FULL state (finish zone operation).
156
157 Format options
158 --------------
159
160 Several optional features of zonefs can be enabled at format time.
161 * Conventional zone aggregation: ranges of contiguous conventional zones can be
162   aggregated into a single larger file instead of the default one file per zone.
163 * File ownership: The owner UID and GID of zone files is by default 0 (root)
164   but can be changed to any valid UID/GID.
165 * File access permissions: the default 640 access permissions can be changed.
166
167 IO error handling
168 -----------------
169
170 Zoned block devices may fail I/O requests for reasons similar to regular block
171 devices, e.g. due to bad sectors. However, in addition to such known I/O
172 failure pattern, the standards governing zoned block devices behavior define
173 additional conditions that result in I/O errors.
174
175 * A zone may transition to the read-only condition (BLK_ZONE_COND_READONLY):
176   While the data already written in the zone is still readable, the zone can
177   no longer be written. No user action on the zone (zone management command or
178   read/write access) can change the zone condition back to a normal read/write
179   state. While the reasons for the device to transition a zone to read-only
180   state are not defined by the standards, a typical cause for such transition
181   would be a defective write head on an HDD (all zones under this head are
182   changed to read-only).
183
184 * A zone may transition to the offline condition (BLK_ZONE_COND_OFFLINE):
185   An offline zone cannot be read nor written. No user action can transition an
186   offline zone back to an operational good state. Similarly to zone read-only
187   transitions, the reasons for a drive to transition a zone to the offline
188   condition are undefined. A typical cause would be a defective read-write head
189   on an HDD causing all zones on the platter under the broken head to be
190   inaccessible.
191
192 * Unaligned write errors: These errors result from the host issuing write
193   requests with a start sector that does not correspond to a zone write pointer
194   position when the write request is executed by the device. Even though zonefs
195   enforces sequential file write for sequential zones, unaligned write errors
196   may still happen in the case of a partial failure of a very large direct I/O
197   operation split into multiple BIOs/requests or asynchronous I/O operations.
198   If one of the write request within the set of sequential write requests
199   issued to the device fails, all write requests queued after it will
200   become unaligned and fail.
201
202 * Delayed write errors: similarly to regular block devices, if the device side
203   write cache is enabled, write errors may occur in ranges of previously
204   completed writes when the device write cache is flushed, e.g. on fsync().
205   Similarly to the previous immediate unaligned write error case, delayed write
206   errors can propagate through a stream of cached sequential data for a zone
207   causing all data to be dropped after the sector that caused the error.
208
209 All I/O errors detected by zonefs are notified to the user with an error code
210 return for the system call that triggered or detected the error. The recovery
211 actions taken by zonefs in response to I/O errors depend on the I/O type (read
212 vs write) and on the reason for the error (bad sector, unaligned writes or zone
213 condition change).
214
215 * For read I/O errors, zonefs does not execute any particular recovery action,
216   but only if the file zone is still in a good condition and there is no
217   inconsistency between the file inode size and its zone write pointer position.
218   If a problem is detected, I/O error recovery is executed (see below table).
219
220 * For write I/O errors, zonefs I/O error recovery is always executed.
221
222 * A zone condition change to read-only or offline also always triggers zonefs
223   I/O error recovery.
224
225 Zonefs minimal I/O error recovery may change a file size and file access
226 permissions.
227
228 * File size changes:
229   Immediate or delayed write errors in a sequential zone file may cause the file
230   inode size to be inconsistent with the amount of data successfully written in
231   the file zone. For instance, the partial failure of a multi-BIO large write
232   operation will cause the zone write pointer to advance partially, even though
233   the entire write operation will be reported as failed to the user. In such
234   case, the file inode size must be advanced to reflect the zone write pointer
235   change and eventually allow the user to restart writing at the end of the
236   file.
237   A file size may also be reduced to reflect a delayed write error detected on
238   fsync(): in this case, the amount of data effectively written in the zone may
239   be less than originally indicated by the file inode size. After such I/O
240   error, zonefs always fixes the file inode size to reflect the amount of data
241   persistently stored in the file zone.
242
243 * Access permission changes:
244   A zone condition change to read-only is indicated with a change in the file
245   access permissions to render the file read-only. This disables changes to the
246   file attributes and data modification. For offline zones, all permissions
247   (read and write) to the file are disabled.
248
249 Further action taken by zonefs I/O error recovery can be controlled by the user
250 with the "errors=xxx" mount option. The table below summarizes the result of
251 zonefs I/O error processing depending on the mount option and on the zone
252 conditions.
253
254     +--------------+-----------+-----------------------------------------+
255     |              |           |            Post error state             |
256     | "errors=xxx" |  device   |                 access permissions      |
257     |    mount     |   zone    | file         file          device zone  |
258     |    option    | condition | size     read    write    read    write |
259     +--------------+-----------+-----------------------------------------+
260     |              | good      | fixed    yes     no       yes     yes   |
261     | remount-ro   | read-only | fixed    yes     no       yes     no    |
262     | (default)    | offline   |   0      no      no       no      no    |
263     +--------------+-----------+-----------------------------------------+
264     |              | good      | fixed    yes     no       yes     yes   |
265     | zone-ro      | read-only | fixed    yes     no       yes     no    |
266     |              | offline   |   0      no      no       no      no    |
267     +--------------+-----------+-----------------------------------------+
268     |              | good      |   0      no      no       yes     yes   |
269     | zone-offline | read-only |   0      no      no       yes     no    |
270     |              | offline   |   0      no      no       no      no    |
271     +--------------+-----------+-----------------------------------------+
272     |              | good      | fixed    yes     yes      yes     yes   |
273     | repair       | read-only | fixed    yes     no       yes     no    |
274     |              | offline   |   0      no      no       no      no    |
275     +--------------+-----------+-----------------------------------------+
276
277 Further notes:
278 * The "errors=remount-ro" mount option is the default behavior of zonefs I/O
279   error processing if no errors mount option is specified.
280 * With the "errors=remount-ro" mount option, the change of the file access
281   permissions to read-only applies to all files. The file system is remounted
282   read-only.
283 * Access permission and file size changes due to the device transitioning zones
284   to the offline condition are permanent. Remounting or reformatting the device
285   with mkfs.zonefs (mkzonefs) will not change back offline zone files to a good
286   state.
287 * File access permission changes to read-only due to the device transitioning
288   zones to the read-only condition are permanent. Remounting or reformatting
289   the device will not re-enable file write access.
290 * File access permission changes implied by the remount-ro, zone-ro and
291   zone-offline mount options are temporary for zones in a good condition.
292   Unmounting and remounting the file system will restore the previous default
293   (format time values) access rights to the files affected.
294 * The repair mount option triggers only the minimal set of I/O error recovery
295   actions, that is, file size fixes for zones in a good condition. Zones
296   indicated as being read-only or offline by the device still imply changes to
297   the zone file access permissions as noted in the table above.
298
299 Mount options
300 -------------
301
302 zonefs define the "errors=<behavior>" mount option to allow the user to specify
303 zonefs behavior in response to I/O errors, inode size inconsistencies or zone
304 condition changes. The defined behaviors are as follow:
305 * remount-ro (default)
306 * zone-ro
307 * zone-offline
308 * repair
309
310 The I/O error actions defined for each behavior are detailed in the previous
311 section.
312
313 Zonefs User Space Tools
314 =======================
315
316 The mkzonefs tool is used to format zoned block devices for use with zonefs.
317 This tool is available on Github at:
318
319 https://github.com/damien-lemoal/zonefs-tools
320
321 zonefs-tools also includes a test suite which can be run against any zoned
322 block device, including null_blk block device created with zoned mode.
323
324 Examples
325 --------
326
327 The following formats a 15TB host-managed SMR HDD with 256 MB zones
328 with the conventional zones aggregation feature enabled.
329
330 # mkzonefs -o aggr_cnv /dev/sdX
331 # mount -t zonefs /dev/sdX /mnt
332 # ls -l /mnt/
333 total 0
334 dr-xr-xr-x 2 root root     1 Nov 25 13:23 cnv
335 dr-xr-xr-x 2 root root 55356 Nov 25 13:23 seq
336
337 The size of the zone files sub-directories indicate the number of files
338 existing for each type of zones. In this example, there is only one
339 conventional zone file (all conventional zones are aggregated under a single
340 file).
341
342 # ls -l /mnt/cnv
343 total 137101312
344 -rw-r----- 1 root root 140391743488 Nov 25 13:23 0
345
346 This aggregated conventional zone file can be used as a regular file.
347
348 # mkfs.ext4 /mnt/cnv/0
349 # mount -o loop /mnt/cnv/0 /data
350
351 The "seq" sub-directory grouping files for sequential write zones has in this
352 example 55356 zones.
353
354 # ls -lv /mnt/seq
355 total 14511243264
356 -rw-r----- 1 root root 0 Nov 25 13:23 0
357 -rw-r----- 1 root root 0 Nov 25 13:23 1
358 -rw-r----- 1 root root 0 Nov 25 13:23 2
359 ...
360 -rw-r----- 1 root root 0 Nov 25 13:23 55354
361 -rw-r----- 1 root root 0 Nov 25 13:23 55355
362
363 For sequential write zone files, the file size changes as data is appended at
364 the end of the file, similarly to any regular file system.
365
366 # dd if=/dev/zero of=/mnt/seq/0 bs=4096 count=1 conv=notrunc oflag=direct
367 1+0 records in
368 1+0 records out
369 4096 bytes (4.1 kB, 4.0 KiB) copied, 0.00044121 s, 9.3 MB/s
370
371 # ls -l /mnt/seq/0
372 -rw-r----- 1 root root 4096 Nov 25 13:23 /mnt/seq/0
373
374 The written file can be truncated to the zone size, preventing any further
375 write operation.
376
377 # truncate -s 268435456 /mnt/seq/0
378 # ls -l /mnt/seq/0
379 -rw-r----- 1 root root 268435456 Nov 25 13:49 /mnt/seq/0
380
381 Truncation to 0 size allows freeing the file zone storage space and restart
382 append-writes to the file.
383
384 # truncate -s 0 /mnt/seq/0
385 # ls -l /mnt/seq/0
386 -rw-r----- 1 root root 0 Nov 25 13:49 /mnt/seq/0
387
388 Since files are statically mapped to zones on the disk, the number of blocks of
389 a file as reported by stat() and fstat() indicates the size of the file zone.
390
391 # stat /mnt/seq/0
392   File: /mnt/seq/0
393   Size: 0               Blocks: 524288     IO Block: 4096   regular empty file
394 Device: 870h/2160d      Inode: 50431       Links: 1
395 Access: (0640/-rw-r-----)  Uid: (    0/    root)   Gid: (    0/    root)
396 Access: 2019-11-25 13:23:57.048971997 +0900
397 Modify: 2019-11-25 13:52:25.553805765 +0900
398 Change: 2019-11-25 13:52:25.553805765 +0900
399  Birth: -
400
401 The number of blocks of the file ("Blocks") in units of 512B blocks gives the
402 maximum file size of 524288 * 512 B = 256 MB, corresponding to the device zone
403 size in this example. Of note is that the "IO block" field always indicates the
404 minimum I/O size for writes and corresponds to the device physical sector size.