From 09f5bd4e4a959106f69cb0660970467e598f7f39 Mon Sep 17 00:00:00 2001 From: anushkadhn Date: Wed, 19 Nov 2025 10:17:59 +0000 Subject: [PATCH 1/6] propagate o direct flag via openFile and CreateFile ops --- conversions.go | 1 + fuseops/ops.go | 1 + internal/fusekernel/fuse_kernel.go | 7 +++++++ 3 files changed, 9 insertions(+) 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..7316085c 100644 --- a/fuseops/ops.go +++ b/fuseops/ops.go @@ -356,6 +356,7 @@ type CreateFileOp struct { // later call to ReleaseFileHandle. Handle HandleID OpContext OpContext + OpenFlags fusekernel.OpenFlags } // Create a symlink inode. If the name already exists, the file system should diff --git a/internal/fusekernel/fuse_kernel.go b/internal/fusekernel/fuse_kernel.go index 8c47b524..e96bb165 100644 --- a/internal/fusekernel/fuse_kernel.go +++ b/internal/fusekernel/fuse_kernel.go @@ -161,6 +161,7 @@ const ( OpenAppend OpenFlags = syscall.O_APPEND OpenCreate OpenFlags = syscall.O_CREAT + OpenDirect OpenFlags = syscall.O_DIRECT OpenExclusive OpenFlags = syscall.O_EXCL OpenSync OpenFlags = syscall.O_SYNC OpenTruncate OpenFlags = syscall.O_TRUNC @@ -204,6 +205,11 @@ func (fl OpenFlags) IsAppend() bool { return fl&OpenAppend != 0 } +// Return true if OpenDirect is set. +func (fl OpenFlags) IsDirect() bool { + return fl&OpenDirect != 0 +} + func accModeName(flags OpenFlags) string { switch flags { case OpenReadOnly: @@ -222,6 +228,7 @@ var openFlagNames = []flagName{ {uint32(OpenExclusive), "OpenExclusive"}, {uint32(OpenTruncate), "OpenTruncate"}, {uint32(OpenAppend), "OpenAppend"}, + {uint32(OpenDirect), "OpenDirect"}, {uint32(OpenSync), "OpenSync"}, } From 5c9bf07a317135f59faa7c7d20d051beb1639cd9 Mon Sep 17 00:00:00 2001 From: anushkadhn Date: Wed, 19 Nov 2025 11:19:46 +0000 Subject: [PATCH 2/6] handle darwin seperately --- internal/fusekernel/fuse_kernel.go | 7 ------- internal/fusekernel/fuse_kernel_darwin.go | 10 ++++++++++ internal/fusekernel/fuse_kernel_linux.go | 21 ++++++++++++++++++++- 3 files changed, 30 insertions(+), 8 deletions(-) diff --git a/internal/fusekernel/fuse_kernel.go b/internal/fusekernel/fuse_kernel.go index e96bb165..8c47b524 100644 --- a/internal/fusekernel/fuse_kernel.go +++ b/internal/fusekernel/fuse_kernel.go @@ -161,7 +161,6 @@ const ( OpenAppend OpenFlags = syscall.O_APPEND OpenCreate OpenFlags = syscall.O_CREAT - OpenDirect OpenFlags = syscall.O_DIRECT OpenExclusive OpenFlags = syscall.O_EXCL OpenSync OpenFlags = syscall.O_SYNC OpenTruncate OpenFlags = syscall.O_TRUNC @@ -205,11 +204,6 @@ func (fl OpenFlags) IsAppend() bool { return fl&OpenAppend != 0 } -// Return true if OpenDirect is set. -func (fl OpenFlags) IsDirect() bool { - return fl&OpenDirect != 0 -} - func accModeName(flags OpenFlags) string { switch flags { case OpenReadOnly: @@ -228,7 +222,6 @@ var openFlagNames = []flagName{ {uint32(OpenExclusive), "OpenExclusive"}, {uint32(OpenTruncate), "OpenTruncate"}, {uint32(OpenAppend), "OpenAppend"}, - {uint32(OpenDirect), "OpenDirect"}, {uint32(OpenSync), "OpenSync"}, } diff --git a/internal/fusekernel/fuse_kernel_darwin.go b/internal/fusekernel/fuse_kernel_darwin.go index fc022674..8564a005 100644 --- a/internal/fusekernel/fuse_kernel_darwin.go +++ b/internal/fusekernel/fuse_kernel_darwin.go @@ -59,6 +59,16 @@ func (in *SetattrIn) Flags() uint32 { return in.Flags_ } +// O_DIRECT is not supported on Darwin. +const ( + OpenDirect OpenFlags = 0 +) + +// O_DIRECT is not directly supported on Darwin, so it always returns false. +func (fl OpenFlags) IsDirect() bool { + return false +} + func openFlags(flags uint32) OpenFlags { return OpenFlags(flags) } diff --git a/internal/fusekernel/fuse_kernel_linux.go b/internal/fusekernel/fuse_kernel_linux.go index 0472e1d2..69bf23c7 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,6 +52,22 @@ func (in *SetattrIn) Flags() uint32 { return 0 } +const ( + OpenDirect OpenFlags = syscall.O_DIRECT +) + +// 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", + }) +} + 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 From 1018631771c3e53d12800ef489dbfdacf3378a81 Mon Sep 17 00:00:00 2001 From: anushkadhn Date: Thu, 20 Nov 2025 05:42:42 +0000 Subject: [PATCH 3/6] add documentation about the OpenFlags field --- fuseops/ops.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/fuseops/ops.go b/fuseops/ops.go index 7316085c..d1761edc 100644 --- a/fuseops/ops.go +++ b/fuseops/ops.go @@ -356,6 +356,8 @@ type CreateFileOp struct { // later call to ReleaseFileHandle. Handle HandleID OpContext OpContext + + // The flags from the open(2) call, passed through the kernel. OpenFlags fusekernel.OpenFlags } @@ -682,6 +684,7 @@ 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. OpenFlags fusekernel.OpenFlags OpContext OpContext From 98fa36726e1b73699b4fd1cbff0280169684bf15 Mon Sep 17 00:00:00 2001 From: anushkadhn Date: Thu, 20 Nov 2025 05:43:10 +0000 Subject: [PATCH 4/6] deprecate unused method --- internal/fusekernel/fuse_kernel_linux.go | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/internal/fusekernel/fuse_kernel_linux.go b/internal/fusekernel/fuse_kernel_linux.go index 69bf23c7..71672191 100644 --- a/internal/fusekernel/fuse_kernel_linux.go +++ b/internal/fusekernel/fuse_kernel_linux.go @@ -68,18 +68,6 @@ func init() { }) } -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 - - return OpenFlags(flags) -} - type GetxattrIn struct { getxattrInCommon } From c16bb3ef88148187ad2d54f11b5e02b7841a0cca Mon Sep 17 00:00:00 2001 From: anushkadhn Date: Thu, 20 Nov 2025 05:43:46 +0000 Subject: [PATCH 5/6] do not expose OpenDirect field on Darwin --- internal/fusekernel/fuse_kernel_darwin.go | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/internal/fusekernel/fuse_kernel_darwin.go b/internal/fusekernel/fuse_kernel_darwin.go index 8564a005..80efc276 100644 --- a/internal/fusekernel/fuse_kernel_darwin.go +++ b/internal/fusekernel/fuse_kernel_darwin.go @@ -59,20 +59,6 @@ func (in *SetattrIn) Flags() uint32 { return in.Flags_ } -// O_DIRECT is not supported on Darwin. -const ( - OpenDirect OpenFlags = 0 -) - -// O_DIRECT is not directly supported on Darwin, so it always returns false. -func (fl OpenFlags) IsDirect() bool { - return false -} - -func openFlags(flags uint32) OpenFlags { - return OpenFlags(flags) -} - type GetxattrIn struct { getxattrInCommon From f7b9967fcbac51c6d66a2d20418918e69eabdc65 Mon Sep 17 00:00:00 2001 From: anushkadhn Date: Fri, 21 Nov 2025 05:54:04 +0000 Subject: [PATCH 6/6] nits and improve description --- fuseops/ops.go | 6 ++++-- internal/fusekernel/fuse_kernel_linux.go | 4 +--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/fuseops/ops.go b/fuseops/ops.go index d1761edc..83e1e775 100644 --- a/fuseops/ops.go +++ b/fuseops/ops.go @@ -357,7 +357,8 @@ type CreateFileOp struct { Handle HandleID OpContext OpContext - // The flags from the open(2) call, passed through the kernel. + // The flags from the open(2) call, passed through the kernel's fuse driver + // to the FUSE daemon. OpenFlags fusekernel.OpenFlags } @@ -684,7 +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. + // 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_linux.go b/internal/fusekernel/fuse_kernel_linux.go index 71672191..85f44c1e 100644 --- a/internal/fusekernel/fuse_kernel_linux.go +++ b/internal/fusekernel/fuse_kernel_linux.go @@ -52,9 +52,7 @@ func (in *SetattrIn) Flags() uint32 { return 0 } -const ( - OpenDirect OpenFlags = syscall.O_DIRECT -) +const OpenDirect OpenFlags = syscall.O_DIRECT // Return true if OpenDirect is set. func (fl OpenFlags) IsDirect() bool {