commit | 266a0472a82e890def1174c5c190ce6a5673981f | [log] [tgz] |
---|---|---|
author | Seokhwan Kim <sukka.kim@samsung.com> | Fri Jun 04 00:18:05 2021 +0900 |
committer | Brett Wilson <brettw@google.com> | Fri Jun 04 22:27:49 2021 +0000 |
tree | eba35a7f7628d5a1ba37644f63ac9fcd096243a8 | |
parent | 7d55a094c39f5df0bc7cdbf2dd67da40f015367d [diff] |
[f2fs] Support file-level fsync This change enables file-level logging for fsync(), based on which roll-forward recovery recovers fsyncd files. It handles fsync(x) in two ways: 1) it conducts checkpointing when the parent of x has not been checkpointed, or 2) it writes out x's dirty data blocks and all dirty node blocks in order. Since roll-forward recovery highly depends on cache, we'll support it after implementing any internal cache. When we enabled it in a sync manner, there are so many workarounds.. look like ugly code. For testing, it introduces a new gn variable 'f2fs_roll_fwd' that enables fsync() to perform file-level logging. By default, it is disabled, and every fsync triggers checkpoint. Prerequisite: set f2fs_roll_fwd to true Test: fx test fs-tests Failed tests: RwFullDiskTest.PartialWriteSucceedsForFullDisk/F2fs Test: new file, fsync - linux host $ fx emu -N --headless -hda third_party/f2fs/test_files/blk1g.bin - fuchsia vm $ mkdir /tmp/mnt;mount /dev/class/block/000 /tmp/mnt $ cp /tmp/mnt/10mb.bin /tmp/mnt/10mb.bin.2 $ f2fs fsync /tmp/mnt/10mb.bin.2 kill the fuchsia vm process.. - linux host $ mount -t f2fs -o noinline_dentry,noinline_data blk1g.bin ~/mnt/ $ diff ~/mnt/10mb.bin ~/mnt/10mb.bin.2 $ umount ../mnt Test: new dir/new file, fsync - linux host $ fx emu -N --headless -hda third_party/f2fs/test_files/blk1g.bin - fuchsia vm $ mkdir /tmp/mnt;mount /dev/class/block/000 /tmp/mnt $ mkdir /tmp/mnt/d;cp /tmp/mnt/10mb.bin /tmp/mnt/d/10mb.bin $ f2fs fsync /tmp/mnt/d/10mb.bin kill the fuchsia vm process.. - linux host $ mount -t f2fs -o noinline_dentry,noinline_data blk1g.bin ~/mnt/ $ diff ~/mnt/10mb.bin ~/mnt/d/10mb.bin $ umount ../mnt Test: modified file, fsync - linux host $ fx emu -N --headless -hda third_party/f2fs/test_files/blk1g.bin - fuchsia vm $ mkdir /tmp/mnt;mount /dev/class/block/000 /tmp/mnt $ mkdir /tmp/mnt/d;cp /tmp/mnt/10mb.bin /tmp/mnt/d/10mb.bin $ f2fs fsync /tmp/mnt/d/10mb.bin $ cat /tmp/mnt/1mb.bin >> /tmp/mnt/d/10mb.bin $ f2fs fsync /tmp/mnt/d/10mb.bin kill the fuchsia vm process.. - linux host $ mount -t f2fs -o noinline_dentry,noinline_data blk1g.bin ~/mnt/ $ cat ~/mnt/1mb.bin >> ~/mnt/10mb.bin $ diff ~/mnt/10mb.bin ~/mnt/d/10mb.bin $ umount ../mnt Prerequisite: set f2fs_roll_fwd to true Change-Id: I602a4ebc2669f94636f6014b51048fff8cc5d979 Reviewed-on: https://fuchsia-review.googlesource.com/c/third_party/f2fs/+/538201 Reviewed-by: Brett Wilson <brettw@google.com>
F2FS is the most commonly used log-structured file system in Linux. It supports flash-friendly features such as adaptive logging, multi-head logging, fsync acceleration, and node address translation. For more information see: https://www.usenix.org/conference/fast15/technical-sessions/presentation/lee
$ fx set core.x64 --with-base //bundles:tools --with-base //bundles:tests --with-base third_party/f2fs $ fx emu -N --headless (see third_party/f2fs/test_files/README.md for test)