diff options
Diffstat (limited to 'internal/fusefrontend')
-rw-r--r-- | internal/fusefrontend/node.go | 10 | ||||
-rw-r--r-- | internal/fusefrontend/node_helpers.go | 20 |
2 files changed, 26 insertions, 4 deletions
diff --git a/internal/fusefrontend/node.go b/internal/fusefrontend/node.go index aa9bd51..5b42ddc 100644 --- a/internal/fusefrontend/node.go +++ b/internal/fusefrontend/node.go @@ -138,6 +138,7 @@ func (n *Node) Create(ctx context.Context, name string, flags uint32, mode uint3 } newFlags := rn.mangleOpenFlags(flags) // Handle long file name + ctx2 := toFuseCtx(ctx) if !rn.args.PlaintextNames && nametransform.IsLongContent(cName) { // Create ".name" err = rn.nameTransform.WriteLongNameAt(dirfd, cName, name) @@ -145,13 +146,13 @@ func (n *Node) Create(ctx context.Context, name string, flags uint32, mode uint3 return nil, nil, 0, fs.ToErrno(err) } // Create content - fd, err = syscallcompat.OpenatUserCtx(dirfd, cName, newFlags|syscall.O_CREAT|syscall.O_EXCL, mode, ctx) + fd, err = syscallcompat.OpenatUser(dirfd, cName, newFlags|syscall.O_CREAT|syscall.O_EXCL, mode, ctx2) if err != nil { nametransform.DeleteLongNameAt(dirfd, cName) } } else { // Create content, normal (short) file name - fd, err = syscallcompat.OpenatUserCtx(dirfd, cName, newFlags|syscall.O_CREAT|syscall.O_EXCL, mode, ctx) + fd, err = syscallcompat.OpenatUser(dirfd, cName, newFlags|syscall.O_CREAT|syscall.O_EXCL, mode, ctx2) } if err != nil { // xfstests generic/488 triggers this @@ -322,6 +323,7 @@ func (n *Node) Mknod(ctx context.Context, name string, mode, rdev uint32, out *f // Create ".name" file to store long file name (except in PlaintextNames mode) var err error + ctx2 := toFuseCtx(ctx) if !rn.args.PlaintextNames && nametransform.IsLongContent(cName) { err := rn.nameTransform.WriteLongNameAt(dirfd, cName, name) if err != nil { @@ -329,13 +331,13 @@ func (n *Node) Mknod(ctx context.Context, name string, mode, rdev uint32, out *f return } // Create "gocryptfs.longfile." device node - err = syscallcompat.MknodatUserCtx(dirfd, cName, mode, int(rdev), ctx) + err = syscallcompat.MknodatUser(dirfd, cName, mode, int(rdev), ctx2) if err != nil { nametransform.DeleteLongNameAt(dirfd, cName) } } else { // Create regular device node - err = syscallcompat.MknodatUserCtx(dirfd, cName, mode, int(rdev), ctx) + err = syscallcompat.MknodatUser(dirfd, cName, mode, int(rdev), ctx2) } if err != nil { errno = fs.ToErrno(err) diff --git a/internal/fusefrontend/node_helpers.go b/internal/fusefrontend/node_helpers.go new file mode 100644 index 0000000..1eb6d4a --- /dev/null +++ b/internal/fusefrontend/node_helpers.go @@ -0,0 +1,20 @@ +package fusefrontend + +import ( + "context" + + "github.com/hanwen/go-fuse/v2/fuse" +) + +// toFuseCtx tries to extract a fuse.Context from a generic context.Context. +func toFuseCtx(ctx context.Context) (ctx2 *fuse.Context) { + if ctx == nil { + return nil + } + if caller, ok := fuse.FromContext(ctx); ok { + ctx2 = &fuse.Context{ + Caller: *caller, + } + } + return ctx2 +} |