From a6f804073de1f1e626464a9dd0a169fd3f69fdff Mon Sep 17 00:00:00 2001 From: David Robillard Date: Fri, 17 Nov 2023 10:19:03 -0500 Subject: Avoid fdatasync() on Darwin This isn't present at all on (older?) literal Darwin, and additionally fsync() there doesn't actually flush writes to storage like it does on Linux. So, use F_FULLFSYNC which was invented as an alternative API to do this. --- src/posix/filesystem_posix.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/posix/filesystem_posix.c b/src/posix/filesystem_posix.c index beaf823..c752e4a 100644 --- a/src/posix/filesystem_posix.c +++ b/src/posix/filesystem_posix.c @@ -58,7 +58,13 @@ zix_get_block_size(const struct stat* const s1, const struct stat* const s2) static ZixStatus finish_copy(const int dst_fd, const int src_fd, const ZixStatus status) { - const ZixStatus st0 = zix_posix_status(dst_fd >= 0 ? fdatasync(dst_fd) : 0); +#ifdef __APPLE__ + const int rc = dst_fd >= 0 ? fcntl(dst_fd, F_FULLFSYNC) : 0; +#else + const int rc = dst_fd >= 0 ? fdatasync(dst_fd) : 0; +#endif + + const ZixStatus st0 = zix_posix_status(rc); const ZixStatus st1 = zix_system_close_fds(dst_fd, src_fd); return status ? status : st0 ? st0 : st1; -- cgit v1.2.1