In certain scenarios, such as network mounts, 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
replaced with fcntl(fd, F_FULLSYNC). Most SMB servers, like Windows
Server and Samba don't support F_FULLSYNC.
To avoid such issues fallback to syscall.Fsync if fcntl returns ENOTSUP.
Fixes #64215
Change-Id: I567191e1179b7e70ddffb6b881469de1872746ef
GitHub-Last-Rev:
62e6931cf79735a192ed57be05005e84720ed232
GitHub-Pull-Request: golang/go#64258
Reviewed-on: https://go-review.googlesource.com/c/go/+/543535
Commit-Queue: Ian Lance Taylor <iant@google.com>
Reviewed-by: Ian Lance Taylor <iant@google.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Auto-Submit: Ian Lance Taylor <iant@google.com>
package poll
import (
+ "errors"
"internal/syscall/unix"
"syscall"
)
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
})
}