1 .. SPDX-License-Identifier: GPL-2.0 2 3 ============================================== 4 ZoneFS - Zone filesystem for Zoned block devic 5 ============================================== 6 7 Introduction 8 ============ 9 10 zonefs is a very simple file system exposing e 11 as a file. Unlike a regular POSIX-compliant fi 12 device support (e.g. f2fs), zonefs does not hi 13 constraint of zoned block devices to the user. 14 write zones of the device must be written sequ 15 of the file (append only writes). 16 17 As such, zonefs is in essence closer to a raw 18 than to a full-featured POSIX file system. The 19 the implementation of zoned block device suppo 20 raw block device file accesses with a richer f 21 direct block device file ioctls which may be m 22 example of this approach is the implementation 23 tree structures (such as used in RocksDB and L 24 by allowing SSTables to be stored in a zone fi 25 system rather than as a range of sectors of th 26 of the higher level construct "one file is one 27 amount of changes needed in the application as 28 different application programming languages. 29 30 Zoned block devices 31 ------------------- 32 33 Zoned storage devices belong to a class of sto 34 space that is divided into zones. A zone is a 35 zones are contiguous (there are no LBA gaps). 36 37 * Conventional zones: there are no access cons 38 conventional zones. Any read or write access 39 regular block device. 40 * Sequential zones: these zones accept random 41 sequentially. Each sequential zone has a wri 42 device that keeps track of the mandatory sta 43 to the device. As a result of this write con 44 cannot be overwritten. Sequential zones must 45 command (zone reset) before rewriting. 46 47 Zoned storage devices can be implemented using 48 technologies. The most common form of zoned st 49 Block Commands (ZBC) and Zoned ATA Commands (Z 50 Magnetic Recording (SMR) HDDs. 51 52 Solid State Disks (SSD) storage devices can al 53 to, for instance, reduce internal write amplif 54 The NVMe Zoned NameSpace (ZNS) is a technical 55 committee aiming at adding a zoned storage int 56 57 Zonefs Overview 58 =============== 59 60 Zonefs exposes the zones of a zoned block devi 61 representing zones are grouped by zone type, w 62 by sub-directories. This file structure is bui 63 provided by the device and so does not require 64 structure. 65 66 On-disk metadata 67 ---------------- 68 69 zonefs on-disk metadata is reduced to an immut 70 persistently stores a magic number and optiona 71 mount, zonefs uses blkdev_report_zones() to ob 72 and populates the mount point with a static fi 73 information. File sizes come from the device z 74 position managed by the device itself. 75 76 The super block is always written on disk at s 77 device storing the super block is never expose 78 the zone containing the super block is a seque 79 tool always "finishes" the zone, that is, it t 80 state to make it read-only, preventing any dat 81 82 Zone type sub-directories 83 ------------------------- 84 85 Files representing zones of the same type are 86 sub-directory automatically created on mount. 87 88 For conventional zones, the sub-directory "cnv 89 however created if and only if the device has 90 the device only has a single conventional zone 91 be exposed as a file as it will be used to sto 92 such devices, the "cnv" sub-directory will not 93 94 For sequential write zones, the sub-directory 95 96 These two directories are the only directories 97 cannot create other directories and cannot ren 98 "seq" sub-directories. 99 100 The size of the directories indicated by the s 101 obtained with the stat() or fstat() system cal 102 existing under the directory. 103 104 Zone files 105 ---------- 106 107 Zone files are named using the number of the z 108 of zones of a particular type. That is, both t 109 contain files named "0", "1", "2", ... The fil 110 increasing zone start sector on the device. 111 112 All read and write operations to zone files ar 113 maximum size, that is, beyond the zone capacit 114 capacity is failed with the -EFBIG error. 115 116 Creating, deleting, renaming or modifying any 117 sub-directories is not allowed. 118 119 The number of blocks of a file as reported by 120 capacity of the zone file, or in other words, 121 122 Conventional zone files 123 ----------------------- 124 125 The size of conventional zone files is fixed t 126 represent. Conventional zone files cannot be t 127 128 These files can be randomly read and written u 129 buffered I/Os, direct I/Os, memory mapped I/Os 130 constraint for these files beyond the file siz 131 132 Sequential zone files 133 --------------------- 134 135 The size of sequential zone files grouped in t 136 the file's zone write pointer position relativ 137 138 Sequential zone files can only be written sequ 139 end, that is, write operations can only be app 140 attempt at accepting random writes and will fa 141 start offset not corresponding to the end of t 142 write issued and still in-flight (for asynchro 143 144 Since dirty page writeback by the page cache d 145 write pattern, zonefs prevents buffered writes 146 on sequential files. Only direct I/O writes ar 147 zonefs relies on the sequential delivery of wr 148 implemented by the block layer elevator. An el 149 write feature for zoned block device (ELEVATOR 150 must be used. This type of elevator (e.g. mq-d 151 for zoned block devices on device initializati 152 153 There are no restrictions on the type of I/O u 154 sequential zone files. Buffered I/Os, direct I 155 all accepted. 156 157 Truncating sequential zone files is allowed on 158 zone is reset to rewind the file zone write po 159 the zone, or up to the zone capacity, in which 160 transitioned to the FULL state (finish zone op 161 162 Format options 163 -------------- 164 165 Several optional features of zonefs can be ena 166 167 * Conventional zone aggregation: ranges of con 168 aggregated into a single larger file instead 169 * File ownership: The owner UID and GID of zon 170 but can be changed to any valid UID/GID. 171 * File access permissions: the default 640 acc 172 173 IO error handling 174 ----------------- 175 176 Zoned block devices may fail I/O requests for 177 devices, e.g. due to bad sectors. However, in 178 failure pattern, the standards governing zoned 179 additional conditions that result in I/O error 180 181 * A zone may transition to the read-only condi 182 While the data already written in the zone i 183 no longer be written. No user action on the 184 read/write access) can change the zone condi 185 state. While the reasons for the device to t 186 state are not defined by the standards, a ty 187 would be a defective write head on an HDD (a 188 changed to read-only). 189 190 * A zone may transition to the offline conditi 191 An offline zone cannot be read nor written. 192 offline zone back to an operational good sta 193 transitions, the reasons for a drive to tran 194 condition are undefined. A typical cause wou 195 on an HDD causing all zones on the platter u 196 inaccessible. 197 198 * Unaligned write errors: These errors result 199 requests with a start sector that does not c 200 position when the write request is executed 201 enforces sequential file write for sequentia 202 may still happen in the case of a partial fa 203 operation split into multiple BIOs/requests 204 If one of the write request within the set o 205 issued to the device fails, all write reques 206 become unaligned and fail. 207 208 * Delayed write errors: similarly to regular b 209 write cache is enabled, write errors may occ 210 completed writes when the device write cache 211 Similarly to the previous immediate unaligne 212 errors can propagate through a stream of cac 213 causing all data to be dropped after the sec 214 215 All I/O errors detected by zonefs are notified 216 return for the system call that triggered or d 217 actions taken by zonefs in response to I/O err 218 vs write) and on the reason for the error (bad 219 condition change). 220 221 * For read I/O errors, zonefs does not execute 222 but only if the file zone is still in a good 223 inconsistency between the file inode size an 224 If a problem is detected, I/O error recovery 225 226 * For write I/O errors, zonefs I/O error recov 227 228 * A zone condition change to read-only or offl 229 I/O error recovery. 230 231 Zonefs minimal I/O error recovery may change a 232 permissions. 233 234 * File size changes: 235 Immediate or delayed write errors in a seque 236 inode size to be inconsistent with the amoun 237 the file zone. For instance, the partial fai 238 operation will cause the zone write pointer 239 the entire write operation will be reported 240 case, the file inode size must be advanced t 241 change and eventually allow the user to rest 242 file. 243 A file size may also be reduced to reflect a 244 fsync(): in this case, the amount of data ef 245 be less than originally indicated by the fil 246 error, zonefs always fixes the file inode si 247 persistently stored in the file zone. 248 249 * Access permission changes: 250 A zone condition change to read-only is indi 251 access permissions to render the file read-o 252 file attributes and data modification. For o 253 (read and write) to the file are disabled. 254 255 Further action taken by zonefs I/O error recov 256 with the "errors=xxx" mount option. The table 257 zonefs I/O error processing depending on the m 258 conditions:: 259 260 +--------------+-----------+-------------- 261 | | | Po 262 | "errors=xxx" | device | 263 | mount | zone | file 264 | option | condition | size read 265 +--------------+-----------+-------------- 266 | | good | fixed yes 267 | remount-ro | read-only | as is yes 268 | (default) | offline | 0 no 269 +--------------+-----------+-------------- 270 | | good | fixed yes 271 | zone-ro | read-only | as is yes 272 | | offline | 0 no 273 +--------------+-----------+-------------- 274 | | good | 0 no 275 | zone-offline | read-only | 0 no 276 | | offline | 0 no 277 +--------------+-----------+-------------- 278 | | good | fixed yes 279 | repair | read-only | as is yes 280 | | offline | 0 no 281 +--------------+-----------+-------------- 282 283 Further notes: 284 285 * The "errors=remount-ro" mount option is the 286 error processing if no errors mount option i 287 * With the "errors=remount-ro" mount option, t 288 permissions to read-only applies to all file 289 read-only. 290 * Access permission and file size changes due 291 to the offline condition are permanent. Remo 292 with mkfs.zonefs (mkzonefs) will not change 293 state. 294 * File access permission changes to read-only 295 zones to the read-only condition are permane 296 the device will not re-enable file write acc 297 * File access permission changes implied by th 298 zone-offline mount options are temporary for 299 Unmounting and remounting the file system wi 300 (format time values) access rights to the fi 301 * The repair mount option triggers only the mi 302 actions, that is, file size fixes for zones 303 indicated as being read-only or offline by t 304 the zone file access permissions as noted in 305 306 Mount options 307 ------------- 308 309 zonefs defines several mount options: 310 * errors=<behavior> 311 * explicit-open 312 313 "errors=<behavior>" option 314 ~~~~~~~~~~~~~~~~~~~~~~~~~~ 315 316 The "errors=<behavior>" option mount option al 317 behavior in response to I/O errors, inode size 318 condition changes. The defined behaviors are a 319 320 * remount-ro (default) 321 * zone-ro 322 * zone-offline 323 * repair 324 325 The run-time I/O error actions defined for eac 326 previous section. Mount time I/O errors will c 327 The handling of read-only zones also differs b 328 If a read-only zone is found at mount time, th 329 same manner as offline zones, that is, all acc 330 file size set to 0. This is necessary as the w 331 is defined as invalib by the ZBC and ZAC stand 332 discover the amount of data that has been writ 333 read-only zone discovered at run-time, as indi 334 The size of the zone file is left unchanged fr 335 336 "explicit-open" option 337 ~~~~~~~~~~~~~~~~~~~~~~ 338 339 A zoned block device (e.g. an NVMe Zoned Names 340 the number of zones that can be active, that i 341 implicit open, explicit open or closed conditi 342 translates into a risk for applications to see 343 limit being exceeded if the zone of a file is 344 request is issued by the user. 345 346 To avoid these potential errors, the "explicit 347 to be made active using an open zone command w 348 for the first time. If the zone open command s 349 guaranteed that write requests can be processe 350 "explicit-open" mount option will result in a 351 to the device on the last close() of a zone fi 352 empty. 353 354 Runtime sysfs attributes 355 ------------------------ 356 357 zonefs defines several sysfs attributes for mo 358 are user readable and can be found in the dire 359 where <dev> is the name of the mounted zoned b 360 361 The attributes defined are as follows. 362 363 * **max_wro_seq_files**: This attribute repor 364 sequential zone files that can be open for w 365 to the maximum number of explicitly or impli 366 supports. A value of 0 means that the devic 367 (any file) can be open for writing and writt 368 state of other zones. When the *explicit-op 369 will fail any open() system call requesting 370 writing when the number of sequential zone f 371 reached the *max_wro_seq_files* limit. 372 * **nr_wro_seq_files**: This attribute report 373 zone files open for writing. When the "expl 374 this number can never exceed *max_wro_seq_fi 375 mount option is not used, the reported numbe 376 *max_wro_seq_files*. In such case, it is th 377 application to not write simultaneously more 378 sequential zone files. Failure to do so can 379 * **max_active_seq_files**: This attribute re 380 sequential zone files that are in an active 381 files that are partially written (not empty 382 is explicitly open (which happens only if th 383 used). This number is always equal to the m 384 the device supports. A value of 0 means tha 385 on the number of sequential zone files that 386 * **nr_active_seq_files**: This attributes re 387 sequential zone files that are active. If *m 388 then the value of *nr_active_seq_files* can 389 *nr_active_seq_files*, regardless of the use 390 option. 391 392 Zonefs User Space Tools 393 ======================= 394 395 The mkzonefs tool is used to format zoned bloc 396 This tool is available on Github at: 397 398 https://github.com/damien-lemoal/zonefs-tools 399 400 zonefs-tools also includes a test suite which 401 block device, including null_blk block device 402 403 Examples 404 -------- 405 406 The following formats a 15TB host-managed SMR 407 with the conventional zones aggregation featur 408 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 414 dr-xr-xr-x 2 root root 55356 Nov 25 13:23 415 416 The size of the zone files sub-directories ind 417 existing for each type of zones. In this examp 418 conventional zone file (all conventional zones 419 file):: 420 421 # ls -l /mnt/cnv 422 total 137101312 423 -rw-r----- 1 root root 140391743488 Nov 25 424 425 This aggregated conventional zone file can be 426 427 # mkfs.ext4 /mnt/cnv/0 428 # mount -o loop /mnt/cnv/0 /data 429 430 The "seq" sub-directory grouping files for seq 431 example 55356 zones:: 432 433 # ls -lv /mnt/seq 434 total 14511243264 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 438 ... 439 -rw-r----- 1 root root 0 Nov 25 13:23 5535 440 -rw-r----- 1 root root 0 Nov 25 13:23 5535 441 442 For sequential write zone files, the file size 443 the end of the file, similarly to any regular 444 445 # dd if=/dev/zero of=/mnt/seq/0 bs=4096 co 446 1+0 records in 447 1+0 records out 448 4096 bytes (4.1 kB, 4.0 KiB) copied, 0.000 449 450 # ls -l /mnt/seq/0 451 -rw-r----- 1 root root 4096 Nov 25 13:23 / 452 453 The written file can be truncated to the zone 454 write operation:: 455 456 # truncate -s 268435456 /mnt/seq/0 457 # ls -l /mnt/seq/0 458 -rw-r----- 1 root root 268435456 Nov 25 13 459 460 Truncation to 0 size allows freeing the file z 461 append-writes to the file:: 462 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 466 467 Since files are statically mapped to zones on 468 of a file as reported by stat() and fstat() in 469 zone:: 470 471 # stat /mnt/seq/0 472 File: /mnt/seq/0 473 Size: 0 Blocks: 524288 IO 474 Device: 870h/2160d Inode: 50431 Lin 475 Access: (0640/-rw-r-----) Uid: ( 0/ 476 Access: 2019-11-25 13:23:57.048971997 +090 477 Modify: 2019-11-25 13:52:25.553805765 +090 478 Change: 2019-11-25 13:52:25.553805765 +090 479 Birth: - 480 481 The number of blocks of the file ("Blocks") in 482 maximum file size of 524288 * 512 B = 256 MB, 483 capacity in this example. Of note is that the 484 indicates the minimum I/O size for writes and 485 physical sector size.
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.