zfs set sync=xxx tank/xxx でファイルシステムごとにsyncのポリシーを変更できるようになったのでどういう仕様なのかソースコードをながめてみた。
基本的にalwaysを指定すると何かするたびにzil_commit()が走る。readでもcommitしているのは先行するwriteをちゃんと書き込んでからという意図があるっぽい。fsyncはdisable指定するとfsyncの効き目がなくなる。NFSとかでcommitを無視したいときに使うのかな。
operation | disable | standard | always |
read | - | - | commit |
write | - | - | commit |
mkdirとか | - | - | commit |
fsync | - | commit | commit |
zvol関係 | - | - | commit |
zvolはioctlでwrite cacheをoffにするとzvol_write()でzil_commit()しなくなるようだ。