In Linux's mount(2) man page, I noticed the following excerpt:
Many broken applications don't use fsync() when 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.
In what sense is this code "broken"? Are they saying that this code is illegal or not standard-conformant (POSIX, etc)?
Obviously fsync() might be a good idea for people who are worried about what would happen if the system crashed. But assuming a system that doesn't crash, don't both versions of the sample code, without fsync(), do exactly the right thing?