| # Data verification with atomic writes |
| # |
| # Some background on atomic writes: |
| # |
| # The main selling point of atomic writes is that it is guaranteed writes |
| # to storage will not be torn for a power failure or kernel crash. |
| |
| # Another aspect of atomic writes is that they handle racing writes and |
| # reads, such that a read racing with a write will see all the data from |
| # the write or none. Well, SCSI and NVMe guarantee this if using |
| # RWF_ATOMIC, but it is not formally stated as a feature of RWF_ATOMIC. |
| # |
| # Fio verify mode can be used to prove that atomic writes can make "safe" |
| # racing reads and writes. This done by having many jobs in a xsum verify |
| # mode. In this way, xsums should be correct, although a job may be |
| # reading a data block written by another job; however |
| # verify_write_sequence must be disabled, as it cannot be helped that data |
| # blocks will be out of sequence between with many jobs. |
| # |
| # Atomic write limits: |
| # For a block device, the max block size for atomic=1 is in |
| # /sys/block/sdXXX/queue/atomic_write_unit_max_bytes |
| # or this value can also be read with a statx syscall on the bdev file. |
| |
| [write-and-verify] |
| rw=randwrite |
| bs=4k |
| direct=1 |
| ioengine=libaio |
| iodepth=16 |
| verify=crc64 |
| atomic=1 |
| verify_write_sequence=0 |
| numjobs=10 |
| # Use /dev/XXX or filename |
| filename=/dev/XXX |