diff --git a/weed/command/mount_std.go b/weed/command/mount_std.go index 0ab794bbd..365a65c6d 100644 --- a/weed/command/mount_std.go +++ b/weed/command/mount_std.go @@ -248,6 +248,7 @@ func RunMount(option *MountOptions, umask os.FileMode) bool { Cipher: cipher, UidGidMapper: uidGidMapper, DisableXAttr: *option.disableXAttr, + IsMacOs: runtime.GOOS == "darwin", }) // create mount root diff --git a/weed/mount/weedfs.go b/weed/mount/weedfs.go index ac665ce5e..728777e32 100644 --- a/weed/mount/weedfs.go +++ b/weed/mount/weedfs.go @@ -46,6 +46,7 @@ type Option struct { Umask os.FileMode Quota int64 DisableXAttr bool + IsMacOs bool MountUid uint32 MountGid uint32 diff --git a/weed/mount/weedfs_file_io.go b/weed/mount/weedfs_file_io.go index 50a5c7c85..04fe7f21c 100644 --- a/weed/mount/weedfs_file_io.go +++ b/weed/mount/weedfs_file_io.go @@ -2,6 +2,7 @@ package mount import ( "github.com/hanwen/go-fuse/v2/fuse" + "github.com/seaweedfs/seaweedfs/weed/glog" ) /** @@ -66,6 +67,14 @@ func (wfs *WFS) Open(cancel <-chan struct{}, in *fuse.OpenIn, out *fuse.OpenOut) if status == fuse.OK { out.Fh = uint64(fileHandle.fh) out.OpenFlags = in.Flags + if wfs.option.IsMacOs { + // remove the direct_io flag, as it is not well-supported on macOS + // https://code.google.com/archive/p/macfuse/wikis/OPTIONS.wiki recommended to avoid the direct_io flag + if in.Flags&fuse.FOPEN_DIRECT_IO != 0 { + glog.V(4).Infof("macfuse direct_io mode %v => false\n", in.Flags&fuse.FOPEN_DIRECT_IO != 0) + out.OpenFlags &^= fuse.FOPEN_DIRECT_IO + } + } // TODO https://github.com/libfuse/libfuse/blob/master/include/fuse_common.h#L64 } return status