From e8088f1bba70e3840d431043a23106297bf35cf5 Mon Sep 17 00:00:00 2001 From: Mauri de Souza Meneguzzo Date: Sat, 18 Nov 2023 13:20:02 -0300 Subject: [PATCH] internal/poll: change Fsync to fallback to syscall.FSync on darwin In certain scenarios, such as an SMB mount, calling Fsync results in ENOTSUP in OSX. This issue was introduced in CL 130676 since syscall.FSync was not properly flushing contents to disk, and it was changed to fcntl(fd, F_FULLSYNC). To avoid such issues fallback to syscall.Fsync if fcntl returns ENOTSUP. For [reserved] --- src/internal/poll/fd_fsync_darwin.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/internal/poll/fd_fsync_darwin.go b/src/internal/poll/fd_fsync_darwin.go index 731b7fd5bd..e55b490d41 100644 --- a/src/internal/poll/fd_fsync_darwin.go +++ b/src/internal/poll/fd_fsync_darwin.go @@ -5,6 +5,7 @@ package poll import ( + "errors" "internal/syscall/unix" "syscall" ) @@ -19,6 +20,13 @@ func (fd *FD) Fsync() error { defer fd.decref() return ignoringEINTR(func() error { _, err := unix.Fcntl(fd.Sysfd, syscall.F_FULLFSYNC, 0) + + // There are scenarios such as SMB mounts where fcntl will fail + // with ENOTSUP. In those cases fallback to fsync. + // See #64215 + if err != nil && errors.Is(err, syscall.ENOTSUP) { + err = syscall.Fsync(fd.Sysfd) + } return err }) }