syscallcompat: refactor MkdiratUser to take fuse.Context

Let's have MkdiratUser take fuse.Context like everybody
else.
This commit is contained in:
Jakob Unterwurzacher 2021-05-22 21:44:19 +02:00
parent cb4f9f9e29
commit e1853e1011
2 changed files with 8 additions and 15 deletions

View File

@ -35,14 +35,14 @@ func haveDsstore(entries []fuse.DirEntry) bool {
// mkdirWithIv - create a new directory and corresponding diriv file. dirfd // mkdirWithIv - create a new directory and corresponding diriv file. dirfd
// should be a handle to the parent directory, cName is the name of the new // should be a handle to the parent directory, cName is the name of the new
// directory and mode specifies the access permissions to use. // directory and mode specifies the access permissions to use.
func (n *Node) mkdirWithIv(dirfd int, cName string, mode uint32, caller *fuse.Caller) error { func (n *Node) mkdirWithIv(dirfd int, cName string, mode uint32, context *fuse.Context) error {
rn := n.rootNode() rn := n.rootNode()
// Between the creation of the directory and the creation of gocryptfs.diriv // Between the creation of the directory and the creation of gocryptfs.diriv
// the directory is inconsistent. Take the lock to prevent other readers // the directory is inconsistent. Take the lock to prevent other readers
// from seeing it. // from seeing it.
rn.dirIVLock.Lock() rn.dirIVLock.Lock()
defer rn.dirIVLock.Unlock() defer rn.dirIVLock.Unlock()
err := syscallcompat.MkdiratUser(dirfd, cName, mode, caller) err := syscallcompat.MkdiratUser(dirfd, cName, mode, context)
if err != nil { if err != nil {
return err return err
} }
@ -73,14 +73,14 @@ func (n *Node) Mkdir(ctx context.Context, name string, mode uint32, out *fuse.En
defer syscall.Close(dirfd) defer syscall.Close(dirfd)
rn := n.rootNode() rn := n.rootNode()
var caller *fuse.Caller var context *fuse.Context
if rn.args.PreserveOwner { if rn.args.PreserveOwner {
caller, _ = fuse.FromContext(ctx) context = toFuseCtx(ctx)
} }
var st syscall.Stat_t var st syscall.Stat_t
if rn.args.PlaintextNames { if rn.args.PlaintextNames {
err := syscallcompat.MkdiratUser(dirfd, cName, mode, caller) err := syscallcompat.MkdiratUser(dirfd, cName, mode, context)
if err != nil { if err != nil {
return nil, fs.ToErrno(err) return nil, fs.ToErrno(err)
} }
@ -106,13 +106,13 @@ func (n *Node) Mkdir(ctx context.Context, name string, mode uint32, out *fuse.En
} }
// Create directory // Create directory
err = rn.mkdirWithIv(dirfd, cName, mode, caller) err = rn.mkdirWithIv(dirfd, cName, mode, context)
if err != nil { if err != nil {
nametransform.DeleteLongNameAt(dirfd, cName) nametransform.DeleteLongNameAt(dirfd, cName)
return nil, fs.ToErrno(err) return nil, fs.ToErrno(err)
} }
} else { } else {
err := rn.mkdirWithIv(dirfd, cName, mode, caller) err := rn.mkdirWithIv(dirfd, cName, mode, context)
if err != nil { if err != nil {
return nil, fs.ToErrno(err) return nil, fs.ToErrno(err)
} }

View File

@ -209,18 +209,11 @@ func SymlinkatUser(oldpath string, newdirfd int, newpath string, context *fuse.C
// MkdiratUser runs the Mkdirat syscall in the context of a different user. // MkdiratUser runs the Mkdirat syscall in the context of a different user.
// //
// See OpenatUser() for how this works. // See OpenatUser() for how this works.
func MkdiratUser(dirfd int, path string, mode uint32, caller *fuse.Caller) (err error) { func MkdiratUser(dirfd int, path string, mode uint32, context *fuse.Context) (err error) {
f := func() (int, error) { f := func() (int, error) {
err := Mkdirat(dirfd, path, mode) err := Mkdirat(dirfd, path, mode)
return -1, err return -1, err
} }
// TODO: refactor MkdiratUser to take context instead of caller
var context *fuse.Context
if caller != nil {
context = &fuse.Context{
Caller: *caller,
}
}
_, err = asUser(f, context) _, err = asUser(f, context)
return err return err
} }