● O_TMPFILE と renameat2
open(2)に使えるO_TMPFILEがLinux-3.11より追加されている。(60545d0d46 あたり)。O_TMPFILEはマニュアルに書いてあるとおり一時ファイルを作れる。anonymouseとは違って、inodeの実態はあるんだけど参照ができない(lookupできない(pathで辿れない))ようなファイルを作れる。それだけだとあまり意味がない(スワップできるメモリが欲しいだけならtmpfsのほうが遥かによい)、O_TMPFILEはlinkat(2)を使ってあとからpathを作れる。これによって、作成途中を見せずにファイルを作れる。ただrename系と違って、既存のファイルを上書きすることは(現時点では)できない。
一方、renameat2(2)というシステムコールがLinux-3.15より追加されている。通常のrenameと比べて引数flagが増えていて、下記が使えるようになっている。
・ RENAME_NOREPLACE, 上書きする場合はエラーになる
・ RENAME_EXCHANGE, oldをnewに上書きするのではなく、oldとnewを入れ替える
・ RENAME_WHITEOUT(Linux-3.18から), whiteoutなinodeにする、OverlayFSなどで下位のFilesystemに存在する名前を上からカバーして「見えない状態」にしてファイルがないことにしてしまう仕組み。
で、O_TMPFILEとrenameat2を使えば「途中状態を見せずにアトミックにファイルを上書き」できるような気がしつつ現時点ではできない。議論はあるみたいなので、そのうち拡張されてできるようになるのかもしれない。
● sync系システムコール
sync, fsync, fdatasync, syncfs, sync_file_range, sync_file_range2がある。msyncは名前が似てるけどちょっと役割が違う、とはいえ結局kernel内部ではvfs_fsync_range()を呼んんでいるので似たようなことをするということでよいようだ。