Lines Matching +full:write +full:- +full:0

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
14 write zones of the device must be written sequentially starting from the end
18 than to a full-featured POSIX file system. The goal of zonefs is to simplify
22 example of this approach is the implementation of LSM (log-structured merge)
31 -------------------
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.
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
73 information. File sizes come from the device zone type and write pointer
76 The super block is always written on disk at sector 0. The first zone of the
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
90 the device only has a single conventional zone at sector 0, the zone will not
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 ----------
109 contain files named "0", "1", "2", ... The file numbers also represent
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 -----------------------
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
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
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
163 --------------
169 * File ownership: The owner UID and GID of zone files is by default 0 (root)
174 -----------------
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).
192 offline zone back to an operational good state. Similarly to zone read-only
194 condition are undefined. A typical cause would be a defective read-write head
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
218 vs write) and on the reason for the error (bad sector, unaligned writes or zone
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
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
243 A file size may also be reduced to reflect a delayed write error detected on
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 |
268 | (default) | offline | 0 no no no no |
269 +--------------+-----------+-----------------------------------------+
271 | zone-ro | read-only | as is yes no yes no |
272 | | offline | 0 no no no no |
273 +--------------+-----------+-----------------------------------------+
274 | | good | 0 no no yes yes |
275 | zone-offline | read-only | 0 no no yes no |
276 | | offline | 0 no no no no |
277 +--------------+-----------+-----------------------------------------+
279 | repair | read-only | as is yes no yes no |
280 | | offline | 0 no no no 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.
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.
303 indicated as being read-only or offline by the device still imply changes to
307 -------------
311 * explicit-open
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
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
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
349 guaranteed that write requests can be processed. Conversely, the
350 "explicit-open" mount option will result in a zone close command being issued
355 ------------------------
366 supports. A value of 0 means that the device has no limit and that any zone
368 state of other zones. When the *explicit-open* mount option is used, zonefs
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
384 the device supports. A value of 0 means that the mounted device has no limit
387 sequential zone files that are active. If *max_active_seq_files* is not 0,
389 *nr_active_seq_files*, regardless of the use of the *explicit-open* mount
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/
412 total 0
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
427 # mkfs.ext4 /mnt/cnv/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
445 # dd if=/dev/zero of=/mnt/seq/0 bs=4096 count=1 conv=notrunc oflag=direct
446 1+0 records in
447 1+0 records out
450 # ls -l /mnt/seq/0
451 -rw-r----- 1 root root 4096 Nov 25 13:23 /mnt/seq/0
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
471 # stat /mnt/seq/0
472 File: /mnt/seq/0
473 Size: 0 Blocks: 524288 IO Block: 4096 regular empty file
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: -