Lines Matching +full:write +full:- +full:to +full:- +full:read

1 .. SPDX-License-Identifier: GPL-2.0
4 ZoneFS - Zone filesystem for Zoned block devices
11 as a file. Unlike a regular POSIX-compliant file system with native zoned block
12 device support (e.g. f2fs), zonefs does not hide the sequential write
13 constraint of zoned block devices to the user. Files representing sequential
14 write zones of the device must be written sequentially starting from the end
17 As such, zonefs is in essence closer to a raw block device access interface
18 than to a full-featured POSIX file system. The goal of zonefs is to simplify
21 direct block device file ioctls which may be more obscure to developers. One
22 example of this approach is the implementation of LSM (log-structured merge)
24 by allowing SSTables to be stored in a zone file similarly to a regular file
31 -------------------
33 Zoned storage devices belong to a class of storage devices with an address
37 * Conventional zones: there are no access constraints to LBAs belonging to
38 conventional zones. Any read or write access can be executed, similarly to a
41 sequentially. Each sequential zone has a write pointer maintained by the
42 device that keeps track of the mandatory start LBA position of the next write
43 to the device. As a result of this write constraint, LBAs in a sequential zone
53 to, for instance, reduce internal write amplification due to garbage collection.
55 committee aiming at adding a zoned storage interface to the NVMe protocol.
62 by sub-directories. This file structure is built entirely using zone information
63 provided by the device and so does not require any complex on-disk metadata
66 On-disk metadata
67 ----------------
69 zonefs on-disk metadata is reduced to an immutable super block which
71 mount, zonefs uses blkdev_report_zones() to obtain the device zone configuration
73 information. File sizes come from the device zone type and write pointer
79 tool always "finishes" the zone, that is, it transitions the zone to a full
80 state to make it read-only, preventing any data write.
82 Zone type sub-directories
83 -------------------------
86 sub-directory automatically created on mount.
88 For conventional zones, the sub-directory "cnv" is used. This directory is
91 be exposed as a file as it will be used to store the zonefs super block. For
92 such devices, the "cnv" sub-directory will not be created.
94 For sequential write zones, the sub-directory "seq" is used.
98 "seq" sub-directories.
105 ----------
112 All read and write operations to zone files are not allowed beyond the file
114 capacity is failed with the -EFBIG error.
117 sub-directories is not allowed.
123 -----------------------
125 The size of conventional zone files is fixed to the size of the zone they
128 These files can be randomly read and written using any type of I/O operation:
133 ---------------------
135 The size of sequential zone files grouped in the "seq" sub-directory represents
136 the file's zone write pointer position relative to the zone start sector.
139 end, that is, write operations can only be append writes. Zonefs makes no
140 attempt at accepting random writes and will fail any write request that has a
141 start offset not corresponding to the end of the file, or to the end of the last
142 write issued and still in-flight (for asynchronous I/O operations).
145 write pattern, zonefs prevents buffered writes and writeable shared mappings
147 zonefs relies on the sequential delivery of write I/O requests to the device
149 write feature for zoned block device (ELEVATOR_F_ZBD_SEQ_WRITE elevator feature)
150 must be used. This type of elevator (e.g. mq-deadline) is set by default
153 There are no restrictions on the type of I/O used for read operations in
154 sequential zone files. Buffered I/Os, direct I/Os and shared read mappings are
157 Truncating sequential zone files is allowed only down to 0, in which case, the
158 zone is reset to rewind the file zone write pointer position to the start of
159 the zone, or up to the zone capacity, in which case the file's zone is
160 transitioned to the FULL state (finish zone operation).
163 --------------
170 but can be changed to any valid UID/GID.
174 -----------------
176 Zoned block devices may fail I/O requests for reasons similar to regular block
177 devices, e.g. due to bad sectors. However, in addition to such known I/O
181 * A zone may transition to the read-only condition (BLK_ZONE_COND_READONLY):
184 read/write access) can change the zone condition back to a normal read/write
185 state. While the reasons for the device to transition a zone to read-only
187 would be a defective write head on an HDD (all zones under this head are
188 changed to read-only).
190 * A zone may transition to the offline condition (BLK_ZONE_COND_OFFLINE):
191 An offline zone cannot be read nor written. No user action can transition an
192 offline zone back to an operational good state. Similarly to zone read-only
193 transitions, the reasons for a drive to transition a zone to the offline
194 condition are undefined. A typical cause would be a defective read-write head
195 on an HDD causing all zones on the platter under the broken head to be
198 * Unaligned write errors: These errors result from the host issuing write
199 requests with a start sector that does not correspond to a zone write pointer
200 position when the write request is executed by the device. Even though zonefs
201 enforces sequential file write for sequential zones, unaligned write errors
204 If one of the write request within the set of sequential write requests
205 issued to the device fails, all write requests queued after it will
208 * Delayed write errors: similarly to regular block devices, if the device side
209 write cache is enabled, write errors may occur in ranges of previously
210 completed writes when the device write cache is flushed, e.g. on fsync().
211 Similarly to the previous immediate unaligned write error case, delayed write
213 causing all data to be dropped after the sector that caused the error.
215 All I/O errors detected by zonefs are notified to the user with an error code
217 actions taken by zonefs in response to I/O errors depend on the I/O type (read
218 vs write) and on the reason for the error (bad sector, unaligned writes or zone
221 * For read I/O errors, zonefs does not execute any particular recovery action,
223 inconsistency between the file inode size and its zone write pointer position.
226 * For write I/O errors, zonefs I/O error recovery is always executed.
228 * A zone condition change to read-only or offline also always triggers zonefs
235 Immediate or delayed write errors in a sequential zone file may cause the file
236 inode size to be inconsistent with the amount of data successfully written in
237 the file zone. For instance, the partial failure of a multi-BIO large write
238 operation will cause the zone write pointer to advance partially, even though
239 the entire write operation will be reported as failed to the user. In such
240 case, the file inode size must be advanced to reflect the zone write pointer
241 change and eventually allow the user to restart writing at the end of the
243 A file size may also be reduced to reflect a delayed write error detected on
246 error, zonefs always fixes the file inode size to reflect the amount of data
250 A zone condition change to read-only is indicated with a change in the file
251 access permissions to render the file read-only. This disables changes to the
253 (read and write) to the file are disabled.
260 +--------------+-----------+-----------------------------------------+
264 | option | condition | size read write read write |
265 +--------------+-----------+-----------------------------------------+
267 | remount-ro | read-only | as is yes no yes no |
269 +--------------+-----------+-----------------------------------------+
271 | zone-ro | read-only | as is yes no yes no |
273 +--------------+-----------+-----------------------------------------+
275 | zone-offline | read-only | 0 no no yes no |
277 +--------------+-----------+-----------------------------------------+
279 | repair | read-only | as is yes no yes no |
281 +--------------+-----------+-----------------------------------------+
285 * The "errors=remount-ro" mount option is the default behavior of zonefs I/O
287 * With the "errors=remount-ro" mount option, the change of the file access
288 permissions to read-only applies to all files. The file system is remounted
289 read-only.
290 * Access permission and file size changes due to the device transitioning zones
291 to the offline condition are permanent. Remounting or reformatting the device
292 with mkfs.zonefs (mkzonefs) will not change back offline zone files to a good
294 * File access permission changes to read-only due to the device transitioning
295 zones to the read-only condition are permanent. Remounting or reformatting
296 the device will not re-enable file write access.
297 * File access permission changes implied by the remount-ro, zone-ro and
298 zone-offline mount options are temporary for zones in a good condition.
300 (format time values) access rights to the files affected.
303 indicated as being read-only or offline by the device still imply changes to
307 -------------
311 * explicit-open
316 The "errors=<behavior>" option mount option allows the user to specify zonefs
317 behavior in response to I/O errors, inode size inconsistencies or zone
320 * remount-ro (default)
321 * zone-ro
322 * zone-offline
325 The run-time I/O error actions defined for each behavior are detailed in the
326 previous section. Mount time I/O errors will cause the mount operation to fail.
327 The handling of read-only zones also differs between mount-time and run-time.
328 If a read-only zone is found at mount time, the zone is always treated in the
330 file size set to 0. This is necessary as the write pointer of read-only zones
331 is defined as invalib by the ZBC and ZAC standards, making it impossible to
332 discover the amount of data that has been written to the zone. In the case of a
333 read-only zone discovered at run-time, as indicated in the previous section.
336 "explicit-open" option
342 translates into a risk for applications to see write IO errors due to this
343 limit being exceeded if the zone of a file is not already active when a write
346 To avoid these potential errors, the "explicit-open" mount option forces zones
347 to be made active using an open zone command when a file is opened for writing
349 guaranteed that write requests can be processed. Conversely, the
350 "explicit-open" mount option will result in a zone close command being issued
351 to the device on the last close() of a zone file if the zone is not full nor
355 ------------------------
365 to the maximum number of explicitly or implicitly open zones that the device
368 state of other zones. When the *explicit-open* mount option is used, zonefs
369 will fail any open() system call requesting to open a sequential zone file for
373 zone files open for writing. When the "explicit-open" mount option is used,
374 this number can never exceed *max_wro_seq_files*. If the *explicit-open*
377 application to not write simultaneously more than *max_wro_seq_files*
378 sequential zone files. Failure to do so can result in write errors.
382 is explicitly open (which happens only if the *explicit-open* mount option is
383 used). This number is always equal to the maximum number of active zones that
389 *nr_active_seq_files*, regardless of the use of the *explicit-open* mount
395 The mkzonefs tool is used to format zoned block devices for use with zonefs.
398 https://github.com/damien-lemoal/zonefs-tools
400 zonefs-tools also includes a test suite which can be run against any zoned
404 --------
406 The following formats a 15TB host-managed SMR HDD with 256 MB zones
409 # mkzonefs -o aggr_cnv /dev/sdX
410 # mount -t zonefs /dev/sdX /mnt
411 # ls -l /mnt/
413 dr-xr-xr-x 2 root root 1 Nov 25 13:23 cnv
414 dr-xr-xr-x 2 root root 55356 Nov 25 13:23 seq
416 The size of the zone files sub-directories indicate the number of files
421 # ls -l /mnt/cnv
423 -rw-r----- 1 root root 140391743488 Nov 25 13:23 0
428 # mount -o loop /mnt/cnv/0 /data
430 The "seq" sub-directory grouping files for sequential write zones has in this
433 # ls -lv /mnt/seq
435 -rw-r----- 1 root root 0 Nov 25 13:23 0
436 -rw-r----- 1 root root 0 Nov 25 13:23 1
437 -rw-r----- 1 root root 0 Nov 25 13:23 2
439 -rw-r----- 1 root root 0 Nov 25 13:23 55354
440 -rw-r----- 1 root root 0 Nov 25 13:23 55355
442 For sequential write zone files, the file size changes as data is appended at
443 the end of the file, similarly to any regular file system::
450 # ls -l /mnt/seq/0
451 -rw-r----- 1 root root 4096 Nov 25 13:23 /mnt/seq/0
453 The written file can be truncated to the zone size, preventing any further
454 write operation::
456 # truncate -s 268435456 /mnt/seq/0
457 # ls -l /mnt/seq/0
458 -rw-r----- 1 root root 268435456 Nov 25 13:49 /mnt/seq/0
460 Truncation to 0 size allows freeing the file zone storage space and restart
461 append-writes to the file::
463 # truncate -s 0 /mnt/seq/0
464 # ls -l /mnt/seq/0
465 -rw-r----- 1 root root 0 Nov 25 13:49 /mnt/seq/0
467 Since files are statically mapped to zones on the disk, the number of blocks
475 Access: (0640/-rw-r-----) Uid: ( 0/ root) Gid: ( 0/ root)
476 Access: 2019-11-25 13:23:57.048971997 +0900
477 Modify: 2019-11-25 13:52:25.553805765 +0900
478 Change: 2019-11-25 13:52:25.553805765 +0900
479 Birth: -
482 maximum file size of 524288 * 512 B = 256 MB, corresponding to the device zone
484 indicates the minimum I/O size for writes and corresponds to the device