diff --git a/conversions.go b/conversions.go index 915e0878..a7c5a4fd 100644 --- a/conversions.go +++ b/conversions.go @@ -245,6 +245,7 @@ func convertInMessage( Pid: inMsg.Header().Pid, Uid: inMsg.Header().Uid, }, + OpenFlags: fusekernel.OpenFlags(in.Flags), } case fusekernel.OpSymlink: diff --git a/fuseops/ops.go b/fuseops/ops.go index 607889c7..83e1e775 100644 --- a/fuseops/ops.go +++ b/fuseops/ops.go @@ -356,6 +356,10 @@ type CreateFileOp struct { // later call to ReleaseFileHandle. Handle HandleID OpContext OpContext + + // The flags from the open(2) call, passed through the kernel's fuse driver + // to the FUSE daemon. + OpenFlags fusekernel.OpenFlags } // Create a symlink inode. If the name already exists, the file system should @@ -681,6 +685,8 @@ type OpenFileOp struct { // advance, for example, because contents are generated on the fly. UseDirectIO bool + // The flags from the open(2) call, passed through the kernel's fuse driver + // to the FUSE daemon. OpenFlags fusekernel.OpenFlags OpContext OpContext diff --git a/internal/fusekernel/fuse_kernel_darwin.go b/internal/fusekernel/fuse_kernel_darwin.go index fc022674..80efc276 100644 --- a/internal/fusekernel/fuse_kernel_darwin.go +++ b/internal/fusekernel/fuse_kernel_darwin.go @@ -59,10 +59,6 @@ func (in *SetattrIn) Flags() uint32 { return in.Flags_ } -func openFlags(flags uint32) OpenFlags { - return OpenFlags(flags) -} - type GetxattrIn struct { getxattrInCommon diff --git a/internal/fusekernel/fuse_kernel_linux.go b/internal/fusekernel/fuse_kernel_linux.go index 0472e1d2..85f44c1e 100644 --- a/internal/fusekernel/fuse_kernel_linux.go +++ b/internal/fusekernel/fuse_kernel_linux.go @@ -1,6 +1,9 @@ package fusekernel -import "time" +import ( + "syscall" + "time" +) type Attr struct { Ino uint64 @@ -49,16 +52,18 @@ func (in *SetattrIn) Flags() uint32 { return 0 } -func openFlags(flags uint32) OpenFlags { - // on amd64, the 32-bit O_LARGEFILE flag is always seen; - // on i386, the flag probably depends on the app - // requesting, but in any case should be utterly - // uninteresting to us here; our kernel protocol messages - // are not directly related to the client app's kernel - // API/ABI - flags &^= 0x8000 +const OpenDirect OpenFlags = syscall.O_DIRECT - return OpenFlags(flags) +// Return true if OpenDirect is set. +func (fl OpenFlags) IsDirect() bool { + return fl&OpenDirect != 0 +} + +func init() { + openFlagNames = append(openFlagNames, flagName{ + bit: uint32(OpenDirect), + name: "OpenDirect", + }) } type GetxattrIn struct {