On 03.06.24 17:28, Nathan Bossart wrote:
I agree, two states should be enough. It could basically just bepg_fsync(int fd) { #if macos fcntl(fd, F_FULLFSYNC); #else fsync(fd); #endif }IIUC with this approach, anyone who is using a file system that fails fcntl(F_FULLSYNC) with ENOSUPP would have to turn fsync off. That might be the right thing to do since having a third option that sends the data to the disk cache but doesn't provide any real guarantees if you lose power may not be worth much. However, if such a file system_did_ provide such guarantees with just fsync(), then it would be unfortunate to force people to turn fsync off. But this could very well all be hypothetical, for all I know... In any case, I agree that we should probably use F_FULLFSYNC by default on macOS.
Yeah, my example code above says "#if macos", not "#ifdef F_FULLSYNC". The latter might be a problem along the lines you describe if other systems use that symbol in a slightly different manner.
