ext4 ドキュメントから:
When mounting an ext4 filesystem, the following option are accepted:
(*) == default
auto_da_alloc(*) Many broken applications don't use fsync() when
noauto_da_alloc replacing existing files via patterns such as
fd = open("foo.new")/write(fd,..)/close(fd)/
rename("foo.new", "foo"), or worse yet,
fd = open("foo", O_TRUNC)/write(fd,..)/close(fd).
If auto_da_alloc is enabled, ext4 will detect
the replace-via-rename and replace-via-truncate
patterns and force that any delayed allocation
blocks are allocated such that at the next
journal commit, in the default data=ordered
mode, the data blocks of the new file are forced
to disk before the rename() operation is
committed. This provides roughly the same level
of guarantees as ext3, and avoids the
"zero-length" problem that can happen when a
system crashes before the delayed allocation
blocks are forced to disk.
「壊れたアプリケーション」という表現から判断すると、ext4 開発者は間違いなく悪い習慣だと考えていますが、実際には非常に広く使用されているアプローチであるため、ext4 自体にパッチが適用されました。
したがって、使用法がパターンに適合する場合は安全です。
そうでない場合は、安全のためにあちこち挿入するのではなく、さらに調査することをお勧めしますfsync
。ext3 ( readfsync
)でパフォーマンスに大きな影響を与える可能性があるため、これはあまり良い考えではないかもしれません。
一方、名前を変更する前にフラッシュすることは、非ジャーナリング ファイル システムで置換を行う正しい方法です。おそらくそれが、ext4 が最初にプログラムからこの動作を予期していた理由であり、auto_da_alloc
オプションは後で修正として追加されました。また、ライトバック (非ジャーナリング) モード用のこのext3 パッチは、データ損失の可能性を下げるために名前変更時に非同期にフラッシュすることで、不注意なプログラムを助けようとします。
ext4 の問題について詳しくは、こちらをご覧ください。