Compare commits
8 Commits
master
...
notificati
Author | SHA1 | Date |
---|---|---|
Vitaliy Filippov | a091e49319 | |
Vitaliy Filippov | 54ad710d24 | |
Vitaliy Filippov | ac7ca2c754 | |
dependabot[bot] | 86031ac261 | |
Doug Schaapveld | 702f658418 | |
Doug Schaapveld | bb43c71d6f | |
Ayush Sethi | 5e0f2e6b43 | |
Lars Gohr | c2e09611e9 |
|
@ -151,7 +151,6 @@ func (c *Connection) Init() error {
|
|||
cacheSymlinks := initOp.Flags&fusekernel.InitCacheSymlinks > 0
|
||||
noOpenSupport := initOp.Flags&fusekernel.InitNoOpenSupport > 0
|
||||
noOpendirSupport := initOp.Flags&fusekernel.InitNoOpendirSupport > 0
|
||||
readdirplusSupport := initOp.Flags&fusekernel.InitDoReaddirplus > 0
|
||||
|
||||
// Respond to the init op.
|
||||
initOp.Library = c.protocol
|
||||
|
@ -194,11 +193,6 @@ func (c *Connection) Init() error {
|
|||
initOp.Flags |= fusekernel.InitNoOpendirSupport
|
||||
}
|
||||
|
||||
// Tell the kernel to do readdirplus (readdir+lookup in one call)
|
||||
if c.cfg.UseReadDirPlus && readdirplusSupport {
|
||||
initOp.Flags |= fusekernel.InitDoReaddirplus
|
||||
}
|
||||
|
||||
c.Reply(ctx, nil)
|
||||
return nil
|
||||
}
|
||||
|
@ -497,15 +491,8 @@ func (c *Connection) Reply(ctx context.Context, opErr error) {
|
|||
outMsg := state.outMsg
|
||||
fuseID := inMsg.Header().Unique
|
||||
|
||||
suppressReuse := false
|
||||
if wr, ok := op.(*fuseops.WriteFileOp); ok {
|
||||
suppressReuse = wr.SuppressReuse
|
||||
}
|
||||
|
||||
// Make sure we destroy the messages when we're done.
|
||||
if !suppressReuse {
|
||||
defer c.putInMessage(inMsg)
|
||||
}
|
||||
defer c.putInMessage(inMsg)
|
||||
defer c.putOutMessage(outMsg)
|
||||
|
||||
// Clean up state for this op.
|
||||
|
|
392
conversions.go
392
conversions.go
|
@ -51,15 +51,21 @@ func convertInMessage(
|
|||
}
|
||||
|
||||
o = &fuseops.LookUpInodeOp{
|
||||
Parent: fuseops.InodeID(inMsg.Header().Nodeid),
|
||||
Name: string(buf[:n-1]),
|
||||
OpContext: fuseops.OpContext{Pid: inMsg.Header().Pid},
|
||||
Parent: fuseops.InodeID(inMsg.Header().Nodeid),
|
||||
Name: string(buf[:n-1]),
|
||||
OpContext: fuseops.OpContext{
|
||||
FuseID: inMsg.Header().Unique,
|
||||
Pid: inMsg.Header().Pid,
|
||||
},
|
||||
}
|
||||
|
||||
case fusekernel.OpGetattr:
|
||||
o = &fuseops.GetInodeAttributesOp{
|
||||
Inode: fuseops.InodeID(inMsg.Header().Nodeid),
|
||||
OpContext: fuseops.OpContext{Pid: inMsg.Header().Pid},
|
||||
Inode: fuseops.InodeID(inMsg.Header().Nodeid),
|
||||
OpContext: fuseops.OpContext{
|
||||
FuseID: inMsg.Header().Unique,
|
||||
Pid: inMsg.Header().Pid,
|
||||
},
|
||||
}
|
||||
|
||||
case fusekernel.OpSetattr:
|
||||
|
@ -70,8 +76,11 @@ func convertInMessage(
|
|||
}
|
||||
|
||||
to := &fuseops.SetInodeAttributesOp{
|
||||
Inode: fuseops.InodeID(inMsg.Header().Nodeid),
|
||||
OpContext: fuseops.OpContext{Pid: inMsg.Header().Pid},
|
||||
Inode: fuseops.InodeID(inMsg.Header().Nodeid),
|
||||
OpContext: fuseops.OpContext{
|
||||
FuseID: inMsg.Header().Unique,
|
||||
Pid: inMsg.Header().Pid,
|
||||
},
|
||||
}
|
||||
o = to
|
||||
|
||||
|
@ -89,7 +98,7 @@ func convertInMessage(
|
|||
}
|
||||
|
||||
if valid&fusekernel.SetattrMode != 0 {
|
||||
mode := fuseops.ConvertFileMode(in.Mode)
|
||||
mode := convertFileMode(in.Mode)
|
||||
to.Mode = &mode
|
||||
}
|
||||
|
||||
|
@ -116,9 +125,12 @@ func convertInMessage(
|
|||
}
|
||||
|
||||
o = &fuseops.ForgetInodeOp{
|
||||
Inode: fuseops.InodeID(inMsg.Header().Nodeid),
|
||||
N: in.Nlookup,
|
||||
OpContext: fuseops.OpContext{Pid: inMsg.Header().Pid},
|
||||
Inode: fuseops.InodeID(inMsg.Header().Nodeid),
|
||||
N: in.Nlookup,
|
||||
OpContext: fuseops.OpContext{
|
||||
FuseID: inMsg.Header().Unique,
|
||||
Pid: inMsg.Header().Pid,
|
||||
},
|
||||
}
|
||||
|
||||
case fusekernel.OpBatchForget:
|
||||
|
@ -143,8 +155,11 @@ func convertInMessage(
|
|||
}
|
||||
|
||||
o = &fuseops.BatchForgetOp{
|
||||
Entries: entries,
|
||||
OpContext: fuseops.OpContext{Pid: inMsg.Header().Pid},
|
||||
Entries: entries,
|
||||
OpContext: fuseops.OpContext{
|
||||
FuseID: inMsg.Header().Unique,
|
||||
Pid: inMsg.Header().Pid,
|
||||
},
|
||||
}
|
||||
|
||||
case fusekernel.OpMkdir:
|
||||
|
@ -170,8 +185,11 @@ func convertInMessage(
|
|||
// the fact that this is a directory is implicit in the fact that the
|
||||
// opcode is mkdir. But we want the correct mode to go through, so ensure
|
||||
// that os.ModeDir is set.
|
||||
Mode: fuseops.ConvertFileMode(in.Mode) | os.ModeDir,
|
||||
OpContext: fuseops.OpContext{Pid: inMsg.Header().Pid},
|
||||
Mode: convertFileMode(in.Mode) | os.ModeDir,
|
||||
OpContext: fuseops.OpContext{
|
||||
FuseID: inMsg.Header().Unique,
|
||||
Pid: inMsg.Header().Pid,
|
||||
},
|
||||
}
|
||||
|
||||
case fusekernel.OpMknod:
|
||||
|
@ -188,11 +206,13 @@ func convertInMessage(
|
|||
name = name[:i]
|
||||
|
||||
o = &fuseops.MkNodeOp{
|
||||
Parent: fuseops.InodeID(inMsg.Header().Nodeid),
|
||||
Name: string(name),
|
||||
Mode: fuseops.ConvertFileMode(in.Mode),
|
||||
Rdev: in.Rdev,
|
||||
OpContext: fuseops.OpContext{Pid: inMsg.Header().Pid},
|
||||
Parent: fuseops.InodeID(inMsg.Header().Nodeid),
|
||||
Name: string(name),
|
||||
Mode: convertFileMode(in.Mode),
|
||||
OpContext: fuseops.OpContext{
|
||||
FuseID: inMsg.Header().Unique,
|
||||
Pid: inMsg.Header().Pid,
|
||||
},
|
||||
}
|
||||
|
||||
case fusekernel.OpCreate:
|
||||
|
@ -209,10 +229,13 @@ func convertInMessage(
|
|||
name = name[:i]
|
||||
|
||||
o = &fuseops.CreateFileOp{
|
||||
Parent: fuseops.InodeID(inMsg.Header().Nodeid),
|
||||
Name: string(name),
|
||||
Mode: fuseops.ConvertFileMode(in.Mode),
|
||||
OpContext: fuseops.OpContext{Pid: inMsg.Header().Pid},
|
||||
Parent: fuseops.InodeID(inMsg.Header().Nodeid),
|
||||
Name: string(name),
|
||||
Mode: convertFileMode(in.Mode),
|
||||
OpContext: fuseops.OpContext{
|
||||
FuseID: inMsg.Header().Unique,
|
||||
Pid: inMsg.Header().Pid,
|
||||
},
|
||||
}
|
||||
|
||||
case fusekernel.OpSymlink:
|
||||
|
@ -228,10 +251,13 @@ func convertInMessage(
|
|||
newName, target := names[0:i], names[i+1:len(names)-1]
|
||||
|
||||
o = &fuseops.CreateSymlinkOp{
|
||||
Parent: fuseops.InodeID(inMsg.Header().Nodeid),
|
||||
Name: string(newName),
|
||||
Target: string(target),
|
||||
OpContext: fuseops.OpContext{Pid: inMsg.Header().Pid},
|
||||
Parent: fuseops.InodeID(inMsg.Header().Nodeid),
|
||||
Name: string(newName),
|
||||
Target: string(target),
|
||||
OpContext: fuseops.OpContext{
|
||||
FuseID: inMsg.Header().Unique,
|
||||
Pid: inMsg.Header().Pid,
|
||||
},
|
||||
}
|
||||
|
||||
case fusekernel.OpRename:
|
||||
|
@ -273,7 +299,10 @@ func convertInMessage(
|
|||
OldName: string(oldName),
|
||||
NewParent: fuseops.InodeID(in.Newdir),
|
||||
NewName: string(newName),
|
||||
OpContext: fuseops.OpContext{Pid: inMsg.Header().Pid},
|
||||
OpContext: fuseops.OpContext{
|
||||
FuseID: inMsg.Header().Unique,
|
||||
Pid: inMsg.Header().Pid,
|
||||
},
|
||||
}
|
||||
|
||||
case fusekernel.OpUnlink:
|
||||
|
@ -284,9 +313,12 @@ func convertInMessage(
|
|||
}
|
||||
|
||||
o = &fuseops.UnlinkOp{
|
||||
Parent: fuseops.InodeID(inMsg.Header().Nodeid),
|
||||
Name: string(buf[:n-1]),
|
||||
OpContext: fuseops.OpContext{Pid: inMsg.Header().Pid},
|
||||
Parent: fuseops.InodeID(inMsg.Header().Nodeid),
|
||||
Name: string(buf[:n-1]),
|
||||
OpContext: fuseops.OpContext{
|
||||
FuseID: inMsg.Header().Unique,
|
||||
Pid: inMsg.Header().Pid,
|
||||
},
|
||||
}
|
||||
|
||||
case fusekernel.OpRmdir:
|
||||
|
@ -297,9 +329,12 @@ func convertInMessage(
|
|||
}
|
||||
|
||||
o = &fuseops.RmDirOp{
|
||||
Parent: fuseops.InodeID(inMsg.Header().Nodeid),
|
||||
Name: string(buf[:n-1]),
|
||||
OpContext: fuseops.OpContext{Pid: inMsg.Header().Pid},
|
||||
Parent: fuseops.InodeID(inMsg.Header().Nodeid),
|
||||
Name: string(buf[:n-1]),
|
||||
OpContext: fuseops.OpContext{
|
||||
FuseID: inMsg.Header().Unique,
|
||||
Pid: inMsg.Header().Pid,
|
||||
},
|
||||
}
|
||||
|
||||
case fusekernel.OpOpen:
|
||||
|
@ -312,13 +347,19 @@ func convertInMessage(
|
|||
o = &fuseops.OpenFileOp{
|
||||
Inode: fuseops.InodeID(inMsg.Header().Nodeid),
|
||||
OpenFlags: fusekernel.OpenFlags(in.Flags),
|
||||
OpContext: fuseops.OpContext{Pid: inMsg.Header().Pid},
|
||||
OpContext: fuseops.OpContext{
|
||||
FuseID: inMsg.Header().Unique,
|
||||
Pid: inMsg.Header().Pid,
|
||||
},
|
||||
}
|
||||
|
||||
case fusekernel.OpOpendir:
|
||||
o = &fuseops.OpenDirOp{
|
||||
Inode: fuseops.InodeID(inMsg.Header().Nodeid),
|
||||
OpContext: fuseops.OpContext{Pid: inMsg.Header().Pid},
|
||||
Inode: fuseops.InodeID(inMsg.Header().Nodeid),
|
||||
OpContext: fuseops.OpContext{
|
||||
FuseID: inMsg.Header().Unique,
|
||||
Pid: inMsg.Header().Pid,
|
||||
},
|
||||
}
|
||||
|
||||
case fusekernel.OpRead:
|
||||
|
@ -328,11 +369,14 @@ func convertInMessage(
|
|||
}
|
||||
|
||||
to := &fuseops.ReadFileOp{
|
||||
Inode: fuseops.InodeID(inMsg.Header().Nodeid),
|
||||
Handle: fuseops.HandleID(in.Fh),
|
||||
Offset: int64(in.Offset),
|
||||
Size: int64(in.Size),
|
||||
OpContext: fuseops.OpContext{Pid: inMsg.Header().Pid},
|
||||
Inode: fuseops.InodeID(inMsg.Header().Nodeid),
|
||||
Handle: fuseops.HandleID(in.Fh),
|
||||
Offset: int64(in.Offset),
|
||||
Size: int64(in.Size),
|
||||
OpContext: fuseops.OpContext{
|
||||
FuseID: inMsg.Header().Unique,
|
||||
Pid: inMsg.Header().Pid,
|
||||
},
|
||||
}
|
||||
if !config.UseVectoredRead {
|
||||
// Use part of the incoming message storage as the read buffer
|
||||
|
@ -341,8 +385,6 @@ func convertInMessage(
|
|||
}
|
||||
o = to
|
||||
|
||||
case fusekernel.OpReaddirplus:
|
||||
fallthrough
|
||||
case fusekernel.OpReaddir:
|
||||
in := (*fusekernel.ReadIn)(inMsg.Consume(fusekernel.ReadInSize(protocol)))
|
||||
if in == nil {
|
||||
|
@ -350,11 +392,13 @@ func convertInMessage(
|
|||
}
|
||||
|
||||
to := &fuseops.ReadDirOp{
|
||||
Inode: fuseops.InodeID(inMsg.Header().Nodeid),
|
||||
Handle: fuseops.HandleID(in.Fh),
|
||||
Offset: fuseops.DirOffset(in.Offset),
|
||||
Plus: inMsg.Header().Opcode == fusekernel.OpReaddirplus,
|
||||
OpContext: fuseops.OpContext{Pid: inMsg.Header().Pid},
|
||||
Inode: fuseops.InodeID(inMsg.Header().Nodeid),
|
||||
Handle: fuseops.HandleID(in.Fh),
|
||||
Offset: fuseops.DirOffset(in.Offset),
|
||||
OpContext: fuseops.OpContext{
|
||||
FuseID: inMsg.Header().Unique,
|
||||
Pid: inMsg.Header().Pid,
|
||||
},
|
||||
}
|
||||
o = to
|
||||
|
||||
|
@ -377,8 +421,11 @@ func convertInMessage(
|
|||
}
|
||||
|
||||
o = &fuseops.ReleaseFileHandleOp{
|
||||
Handle: fuseops.HandleID(in.Fh),
|
||||
OpContext: fuseops.OpContext{Pid: inMsg.Header().Pid},
|
||||
Handle: fuseops.HandleID(in.Fh),
|
||||
OpContext: fuseops.OpContext{
|
||||
FuseID: inMsg.Header().Unique,
|
||||
Pid: inMsg.Header().Pid,
|
||||
},
|
||||
}
|
||||
|
||||
case fusekernel.OpReleasedir:
|
||||
|
@ -389,8 +436,11 @@ func convertInMessage(
|
|||
}
|
||||
|
||||
o = &fuseops.ReleaseDirHandleOp{
|
||||
Handle: fuseops.HandleID(in.Fh),
|
||||
OpContext: fuseops.OpContext{Pid: inMsg.Header().Pid},
|
||||
Handle: fuseops.HandleID(in.Fh),
|
||||
OpContext: fuseops.OpContext{
|
||||
FuseID: inMsg.Header().Unique,
|
||||
Pid: inMsg.Header().Pid,
|
||||
},
|
||||
}
|
||||
|
||||
case fusekernel.OpWrite:
|
||||
|
@ -405,11 +455,14 @@ func convertInMessage(
|
|||
}
|
||||
|
||||
o = &fuseops.WriteFileOp{
|
||||
Inode: fuseops.InodeID(inMsg.Header().Nodeid),
|
||||
Handle: fuseops.HandleID(in.Fh),
|
||||
Data: buf,
|
||||
Offset: int64(in.Offset),
|
||||
OpContext: fuseops.OpContext{Pid: inMsg.Header().Pid},
|
||||
Inode: fuseops.InodeID(inMsg.Header().Nodeid),
|
||||
Handle: fuseops.HandleID(in.Fh),
|
||||
Data: buf,
|
||||
Offset: int64(in.Offset),
|
||||
OpContext: fuseops.OpContext{
|
||||
FuseID: inMsg.Header().Unique,
|
||||
Pid: inMsg.Header().Pid,
|
||||
},
|
||||
}
|
||||
|
||||
case fusekernel.OpFsync, fusekernel.OpFsyncdir:
|
||||
|
@ -420,9 +473,12 @@ func convertInMessage(
|
|||
}
|
||||
|
||||
o = &fuseops.SyncFileOp{
|
||||
Inode: fuseops.InodeID(inMsg.Header().Nodeid),
|
||||
Handle: fuseops.HandleID(in.Fh),
|
||||
OpContext: fuseops.OpContext{Pid: inMsg.Header().Pid},
|
||||
Inode: fuseops.InodeID(inMsg.Header().Nodeid),
|
||||
Handle: fuseops.HandleID(in.Fh),
|
||||
OpContext: fuseops.OpContext{
|
||||
FuseID: inMsg.Header().Unique,
|
||||
Pid: inMsg.Header().Pid,
|
||||
},
|
||||
}
|
||||
|
||||
case fusekernel.OpFlush:
|
||||
|
@ -433,15 +489,21 @@ func convertInMessage(
|
|||
}
|
||||
|
||||
o = &fuseops.FlushFileOp{
|
||||
Inode: fuseops.InodeID(inMsg.Header().Nodeid),
|
||||
Handle: fuseops.HandleID(in.Fh),
|
||||
OpContext: fuseops.OpContext{Pid: inMsg.Header().Pid},
|
||||
Inode: fuseops.InodeID(inMsg.Header().Nodeid),
|
||||
Handle: fuseops.HandleID(in.Fh),
|
||||
OpContext: fuseops.OpContext{
|
||||
FuseID: inMsg.Header().Unique,
|
||||
Pid: inMsg.Header().Pid,
|
||||
},
|
||||
}
|
||||
|
||||
case fusekernel.OpReadlink:
|
||||
o = &fuseops.ReadSymlinkOp{
|
||||
Inode: fuseops.InodeID(inMsg.Header().Nodeid),
|
||||
OpContext: fuseops.OpContext{Pid: inMsg.Header().Pid},
|
||||
Inode: fuseops.InodeID(inMsg.Header().Nodeid),
|
||||
OpContext: fuseops.OpContext{
|
||||
FuseID: inMsg.Header().Unique,
|
||||
Pid: inMsg.Header().Pid,
|
||||
},
|
||||
}
|
||||
|
||||
case fusekernel.OpStatfs:
|
||||
|
@ -489,10 +551,13 @@ func convertInMessage(
|
|||
}
|
||||
|
||||
o = &fuseops.CreateLinkOp{
|
||||
Parent: fuseops.InodeID(inMsg.Header().Nodeid),
|
||||
Name: string(name),
|
||||
Target: fuseops.InodeID(in.Oldnodeid),
|
||||
OpContext: fuseops.OpContext{Pid: inMsg.Header().Pid},
|
||||
Parent: fuseops.InodeID(inMsg.Header().Nodeid),
|
||||
Name: string(name),
|
||||
Target: fuseops.InodeID(in.Oldnodeid),
|
||||
OpContext: fuseops.OpContext{
|
||||
FuseID: inMsg.Header().Unique,
|
||||
Pid: inMsg.Header().Pid,
|
||||
},
|
||||
}
|
||||
|
||||
case fusekernel.OpRemovexattr:
|
||||
|
@ -503,9 +568,12 @@ func convertInMessage(
|
|||
}
|
||||
|
||||
o = &fuseops.RemoveXattrOp{
|
||||
Inode: fuseops.InodeID(inMsg.Header().Nodeid),
|
||||
Name: string(buf[:n-1]),
|
||||
OpContext: fuseops.OpContext{Pid: inMsg.Header().Pid},
|
||||
Inode: fuseops.InodeID(inMsg.Header().Nodeid),
|
||||
Name: string(buf[:n-1]),
|
||||
OpContext: fuseops.OpContext{
|
||||
FuseID: inMsg.Header().Unique,
|
||||
Pid: inMsg.Header().Pid,
|
||||
},
|
||||
}
|
||||
|
||||
case fusekernel.OpGetxattr:
|
||||
|
@ -523,9 +591,12 @@ func convertInMessage(
|
|||
name = name[:i]
|
||||
|
||||
to := &fuseops.GetXattrOp{
|
||||
Inode: fuseops.InodeID(inMsg.Header().Nodeid),
|
||||
Name: string(name),
|
||||
OpContext: fuseops.OpContext{Pid: inMsg.Header().Pid},
|
||||
Inode: fuseops.InodeID(inMsg.Header().Nodeid),
|
||||
Name: string(name),
|
||||
OpContext: fuseops.OpContext{
|
||||
FuseID: inMsg.Header().Unique,
|
||||
Pid: inMsg.Header().Pid,
|
||||
},
|
||||
}
|
||||
o = to
|
||||
|
||||
|
@ -552,8 +623,11 @@ func convertInMessage(
|
|||
}
|
||||
|
||||
to := &fuseops.ListXattrOp{
|
||||
Inode: fuseops.InodeID(inMsg.Header().Nodeid),
|
||||
OpContext: fuseops.OpContext{Pid: inMsg.Header().Pid},
|
||||
Inode: fuseops.InodeID(inMsg.Header().Nodeid),
|
||||
OpContext: fuseops.OpContext{
|
||||
FuseID: inMsg.Header().Unique,
|
||||
Pid: inMsg.Header().Pid,
|
||||
},
|
||||
}
|
||||
o = to
|
||||
|
||||
|
@ -588,11 +662,13 @@ func convertInMessage(
|
|||
name, value := payload[:i], payload[i+1:len(payload)]
|
||||
|
||||
o = &fuseops.SetXattrOp{
|
||||
Inode: fuseops.InodeID(inMsg.Header().Nodeid),
|
||||
Name: string(name),
|
||||
Value: value,
|
||||
Flags: in.Flags,
|
||||
OpContext: fuseops.OpContext{Pid: inMsg.Header().Pid},
|
||||
Inode: fuseops.InodeID(inMsg.Header().Nodeid),
|
||||
Name: string(name),
|
||||
Value: value,
|
||||
Flags: in.Flags,
|
||||
OpContext: fuseops.OpContext{
|
||||
FuseID: inMsg.Header().Unique,
|
||||
Pid: inMsg.Header().Pid},
|
||||
}
|
||||
case fusekernel.OpFallocate:
|
||||
type input fusekernel.FallocateIn
|
||||
|
@ -602,12 +678,14 @@ func convertInMessage(
|
|||
}
|
||||
|
||||
o = &fuseops.FallocateOp{
|
||||
Inode: fuseops.InodeID(inMsg.Header().Nodeid),
|
||||
Handle: fuseops.HandleID(in.Fh),
|
||||
Offset: in.Offset,
|
||||
Length: in.Length,
|
||||
Mode: in.Mode,
|
||||
OpContext: fuseops.OpContext{Pid: inMsg.Header().Pid},
|
||||
Inode: fuseops.InodeID(inMsg.Header().Nodeid),
|
||||
Handle: fuseops.HandleID(in.Fh),
|
||||
Offset: in.Offset,
|
||||
Length: in.Length,
|
||||
Mode: in.Mode,
|
||||
OpContext: fuseops.OpContext{
|
||||
FuseID: inMsg.Header().Unique,
|
||||
Pid: inMsg.Header().Pid},
|
||||
}
|
||||
|
||||
case fusekernel.OpPoll:
|
||||
|
@ -725,37 +803,37 @@ func (c *Connection) kernelResponseForOp(
|
|||
case *fuseops.LookUpInodeOp:
|
||||
size := int(fusekernel.EntryOutSize(c.protocol))
|
||||
out := (*fusekernel.EntryOut)(m.Grow(size))
|
||||
fuseops.ConvertChildInodeEntry(&o.Entry, out)
|
||||
convertChildInodeEntry(&o.Entry, out)
|
||||
|
||||
case *fuseops.GetInodeAttributesOp:
|
||||
size := int(fusekernel.AttrOutSize(c.protocol))
|
||||
out := (*fusekernel.AttrOut)(m.Grow(size))
|
||||
out.AttrValid, out.AttrValidNsec = fuseops.ConvertExpirationTime(
|
||||
out.AttrValid, out.AttrValidNsec = convertExpirationTime(
|
||||
o.AttributesExpiration)
|
||||
fuseops.ConvertAttributes(o.Inode, &o.Attributes, &out.Attr)
|
||||
convertAttributes(o.Inode, &o.Attributes, &out.Attr)
|
||||
|
||||
case *fuseops.SetInodeAttributesOp:
|
||||
size := int(fusekernel.AttrOutSize(c.protocol))
|
||||
out := (*fusekernel.AttrOut)(m.Grow(size))
|
||||
out.AttrValid, out.AttrValidNsec = fuseops.ConvertExpirationTime(
|
||||
out.AttrValid, out.AttrValidNsec = convertExpirationTime(
|
||||
o.AttributesExpiration)
|
||||
fuseops.ConvertAttributes(o.Inode, &o.Attributes, &out.Attr)
|
||||
convertAttributes(o.Inode, &o.Attributes, &out.Attr)
|
||||
|
||||
case *fuseops.MkDirOp:
|
||||
size := int(fusekernel.EntryOutSize(c.protocol))
|
||||
out := (*fusekernel.EntryOut)(m.Grow(size))
|
||||
fuseops.ConvertChildInodeEntry(&o.Entry, out)
|
||||
convertChildInodeEntry(&o.Entry, out)
|
||||
|
||||
case *fuseops.MkNodeOp:
|
||||
size := int(fusekernel.EntryOutSize(c.protocol))
|
||||
out := (*fusekernel.EntryOut)(m.Grow(size))
|
||||
fuseops.ConvertChildInodeEntry(&o.Entry, out)
|
||||
convertChildInodeEntry(&o.Entry, out)
|
||||
|
||||
case *fuseops.CreateFileOp:
|
||||
eSize := int(fusekernel.EntryOutSize(c.protocol))
|
||||
|
||||
e := (*fusekernel.EntryOut)(m.Grow(eSize))
|
||||
fuseops.ConvertChildInodeEntry(&o.Entry, e)
|
||||
convertChildInodeEntry(&o.Entry, e)
|
||||
|
||||
oo := (*fusekernel.OpenOut)(m.Grow(int(unsafe.Sizeof(fusekernel.OpenOut{}))))
|
||||
oo.Fh = uint64(o.Handle)
|
||||
|
@ -763,12 +841,12 @@ func (c *Connection) kernelResponseForOp(
|
|||
case *fuseops.CreateSymlinkOp:
|
||||
size := int(fusekernel.EntryOutSize(c.protocol))
|
||||
out := (*fusekernel.EntryOut)(m.Grow(size))
|
||||
fuseops.ConvertChildInodeEntry(&o.Entry, out)
|
||||
convertChildInodeEntry(&o.Entry, out)
|
||||
|
||||
case *fuseops.CreateLinkOp:
|
||||
size := int(fusekernel.EntryOutSize(c.protocol))
|
||||
out := (*fusekernel.EntryOut)(m.Grow(size))
|
||||
fuseops.ConvertChildInodeEntry(&o.Entry, out)
|
||||
convertChildInodeEntry(&o.Entry, out)
|
||||
|
||||
case *fuseops.RenameOp:
|
||||
// Empty response
|
||||
|
@ -986,6 +1064,120 @@ func (c *Connection) kernelNotification(
|
|||
// General conversions
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
func convertTime(t time.Time) (secs uint64, nsec uint32) {
|
||||
totalNano := t.UnixNano()
|
||||
secs = uint64(totalNano / 1e9)
|
||||
nsec = uint32(totalNano % 1e9)
|
||||
return secs, nsec
|
||||
}
|
||||
|
||||
func convertAttributes(
|
||||
inodeID fuseops.InodeID,
|
||||
in *fuseops.InodeAttributes,
|
||||
out *fusekernel.Attr) {
|
||||
out.Ino = uint64(inodeID)
|
||||
out.Size = in.Size
|
||||
out.Atime, out.AtimeNsec = convertTime(in.Atime)
|
||||
out.Mtime, out.MtimeNsec = convertTime(in.Mtime)
|
||||
out.Ctime, out.CtimeNsec = convertTime(in.Ctime)
|
||||
out.SetCrtime(convertTime(in.Crtime))
|
||||
out.Nlink = in.Nlink
|
||||
out.Uid = in.Uid
|
||||
out.Gid = in.Gid
|
||||
// round up to the nearest 512 boundary
|
||||
out.Blocks = (in.Size + 512 - 1) / 512
|
||||
|
||||
// Set the mode.
|
||||
out.Mode = uint32(in.Mode) & 0777
|
||||
switch {
|
||||
default:
|
||||
out.Mode |= syscall.S_IFREG
|
||||
case in.Mode&os.ModeDir != 0:
|
||||
out.Mode |= syscall.S_IFDIR
|
||||
case in.Mode&os.ModeDevice != 0:
|
||||
if in.Mode&os.ModeCharDevice != 0 {
|
||||
out.Mode |= syscall.S_IFCHR
|
||||
} else {
|
||||
out.Mode |= syscall.S_IFBLK
|
||||
}
|
||||
case in.Mode&os.ModeNamedPipe != 0:
|
||||
out.Mode |= syscall.S_IFIFO
|
||||
case in.Mode&os.ModeSymlink != 0:
|
||||
out.Mode |= syscall.S_IFLNK
|
||||
case in.Mode&os.ModeSocket != 0:
|
||||
out.Mode |= syscall.S_IFSOCK
|
||||
}
|
||||
if in.Mode&os.ModeSetuid != 0 {
|
||||
out.Mode |= syscall.S_ISUID
|
||||
}
|
||||
if in.Mode&os.ModeSetgid != 0 {
|
||||
out.Mode |= syscall.S_ISGID
|
||||
}
|
||||
if in.Mode&os.ModeSticky != 0 {
|
||||
out.Mode |= syscall.S_ISVTX
|
||||
}
|
||||
}
|
||||
|
||||
// Convert an absolute cache expiration time to a relative time from now for
|
||||
// consumption by the fuse kernel module.
|
||||
func convertExpirationTime(t time.Time) (secs uint64, nsecs uint32) {
|
||||
// Fuse represents durations as unsigned 64-bit counts of seconds and 32-bit
|
||||
// counts of nanoseconds (cf. http://goo.gl/EJupJV). So negative durations
|
||||
// are right out. There is no need to cap the positive magnitude, because
|
||||
// 2^64 seconds is well longer than the 2^63 ns range of time.Duration.
|
||||
d := t.Sub(time.Now())
|
||||
if d > 0 {
|
||||
secs = uint64(d / time.Second)
|
||||
nsecs = uint32((d % time.Second) / time.Nanosecond)
|
||||
}
|
||||
|
||||
return secs, nsecs
|
||||
}
|
||||
|
||||
func convertChildInodeEntry(
|
||||
in *fuseops.ChildInodeEntry,
|
||||
out *fusekernel.EntryOut) {
|
||||
out.Nodeid = uint64(in.Child)
|
||||
out.Generation = uint64(in.Generation)
|
||||
out.EntryValid, out.EntryValidNsec = convertExpirationTime(in.EntryExpiration)
|
||||
out.AttrValid, out.AttrValidNsec = convertExpirationTime(in.AttributesExpiration)
|
||||
|
||||
convertAttributes(in.Child, &in.Attributes, &out.Attr)
|
||||
}
|
||||
|
||||
func convertFileMode(unixMode uint32) os.FileMode {
|
||||
mode := os.FileMode(unixMode & 0777)
|
||||
switch unixMode & syscall.S_IFMT {
|
||||
case syscall.S_IFREG:
|
||||
// nothing
|
||||
case syscall.S_IFDIR:
|
||||
mode |= os.ModeDir
|
||||
case syscall.S_IFCHR:
|
||||
mode |= os.ModeCharDevice | os.ModeDevice
|
||||
case syscall.S_IFBLK:
|
||||
mode |= os.ModeDevice
|
||||
case syscall.S_IFIFO:
|
||||
mode |= os.ModeNamedPipe
|
||||
case syscall.S_IFLNK:
|
||||
mode |= os.ModeSymlink
|
||||
case syscall.S_IFSOCK:
|
||||
mode |= os.ModeSocket
|
||||
default:
|
||||
// no idea
|
||||
mode |= os.ModeDevice
|
||||
}
|
||||
if unixMode&syscall.S_ISUID != 0 {
|
||||
mode |= os.ModeSetuid
|
||||
}
|
||||
if unixMode&syscall.S_ISGID != 0 {
|
||||
mode |= os.ModeSetgid
|
||||
}
|
||||
if unixMode&syscall.S_ISVTX != 0 {
|
||||
mode |= os.ModeSticky
|
||||
}
|
||||
return mode
|
||||
}
|
||||
|
||||
func writeXattrSize(m *buffer.OutMessage, size uint32) {
|
||||
out := (*fusekernel.GetxattrOut)(m.Grow(int(unsafe.Sizeof(fusekernel.GetxattrOut{}))))
|
||||
out.Size = size
|
||||
|
|
|
@ -1,84 +0,0 @@
|
|||
// Copyright 2023 Vitaliy Filippov
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package fuseops
|
||||
|
||||
import (
|
||||
"time"
|
||||
"syscall"
|
||||
|
||||
"github.com/jacobsa/fuse/internal/fusekernel"
|
||||
)
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
// General conversions
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
func ConvertTime(t time.Time) (secs uint64, nsec uint32) {
|
||||
totalNano := t.UnixNano()
|
||||
secs = uint64(totalNano / 1e9)
|
||||
nsec = uint32(totalNano % 1e9)
|
||||
return secs, nsec
|
||||
}
|
||||
|
||||
func ConvertAttributes(
|
||||
inodeID InodeID,
|
||||
in *InodeAttributes,
|
||||
out *fusekernel.Attr) {
|
||||
out.Ino = uint64(inodeID)
|
||||
out.Size = in.Size
|
||||
out.Atime, out.AtimeNsec = ConvertTime(in.Atime)
|
||||
out.Mtime, out.MtimeNsec = ConvertTime(in.Mtime)
|
||||
out.Ctime, out.CtimeNsec = ConvertTime(in.Ctime)
|
||||
out.SetCrtime(ConvertTime(in.Crtime))
|
||||
out.Nlink = in.Nlink
|
||||
out.Uid = in.Uid
|
||||
out.Gid = in.Gid
|
||||
// round up to the nearest 512 boundary
|
||||
out.Blocks = (in.Size + 512 - 1) / 512
|
||||
|
||||
// Set the mode.
|
||||
out.Mode = ConvertGolangMode(in.Mode)
|
||||
|
||||
if out.Mode & (syscall.S_IFCHR | syscall.S_IFBLK) != 0 {
|
||||
out.Rdev = in.Rdev
|
||||
}
|
||||
}
|
||||
|
||||
// Convert an absolute cache expiration time to a relative time from now for
|
||||
// consumption by the fuse kernel module.
|
||||
func ConvertExpirationTime(t time.Time) (secs uint64, nsecs uint32) {
|
||||
// Fuse represents durations as unsigned 64-bit counts of seconds and 32-bit
|
||||
// counts of nanoseconds (cf. http://goo.gl/EJupJV). So negative durations
|
||||
// are right out. There is no need to cap the positive magnitude, because
|
||||
// 2^64 seconds is well longer than the 2^63 ns range of time.Duration.
|
||||
d := t.Sub(time.Now())
|
||||
if d > 0 {
|
||||
secs = uint64(d / time.Second)
|
||||
nsecs = uint32((d % time.Second) / time.Nanosecond)
|
||||
}
|
||||
|
||||
return secs, nsecs
|
||||
}
|
||||
|
||||
func ConvertChildInodeEntry(
|
||||
in *ChildInodeEntry,
|
||||
out *fusekernel.EntryOut) {
|
||||
out.Nodeid = uint64(in.Child)
|
||||
out.Generation = uint64(in.Generation)
|
||||
out.EntryValid, out.EntryValidNsec = ConvertExpirationTime(in.EntryExpiration)
|
||||
out.AttrValid, out.AttrValidNsec = ConvertExpirationTime(in.AttributesExpiration)
|
||||
|
||||
ConvertAttributes(in.Child, &in.Attributes, &out.Attr)
|
||||
}
|
|
@ -1,70 +0,0 @@
|
|||
package fuseops
|
||||
|
||||
import (
|
||||
"os"
|
||||
"syscall"
|
||||
)
|
||||
|
||||
func ConvertFileMode(unixMode uint32) os.FileMode {
|
||||
mode := os.FileMode(unixMode & 0777)
|
||||
switch unixMode & syscall.S_IFMT {
|
||||
case syscall.S_IFREG:
|
||||
// nothing
|
||||
case syscall.S_IFDIR:
|
||||
mode |= os.ModeDir
|
||||
case syscall.S_IFCHR:
|
||||
mode |= os.ModeCharDevice | os.ModeDevice
|
||||
case syscall.S_IFBLK:
|
||||
mode |= os.ModeDevice
|
||||
case syscall.S_IFIFO:
|
||||
mode |= os.ModeNamedPipe
|
||||
case syscall.S_IFLNK:
|
||||
mode |= os.ModeSymlink
|
||||
case syscall.S_IFSOCK:
|
||||
mode |= os.ModeSocket
|
||||
default:
|
||||
// no idea
|
||||
}
|
||||
if unixMode&syscall.S_ISUID != 0 {
|
||||
mode |= os.ModeSetuid
|
||||
}
|
||||
if unixMode&syscall.S_ISGID != 0 {
|
||||
mode |= os.ModeSetgid
|
||||
}
|
||||
if unixMode&syscall.S_ISVTX != 0 {
|
||||
mode |= os.ModeSticky
|
||||
}
|
||||
return mode
|
||||
}
|
||||
|
||||
func ConvertGolangMode(inMode os.FileMode) uint32 {
|
||||
outMode := uint32(inMode) & 0777
|
||||
switch {
|
||||
default:
|
||||
outMode |= syscall.S_IFREG
|
||||
case inMode&os.ModeDir != 0:
|
||||
outMode |= syscall.S_IFDIR
|
||||
case inMode&os.ModeDevice != 0:
|
||||
if inMode&os.ModeCharDevice != 0 {
|
||||
outMode |= syscall.S_IFCHR
|
||||
} else {
|
||||
outMode |= syscall.S_IFBLK
|
||||
}
|
||||
case inMode&os.ModeNamedPipe != 0:
|
||||
outMode |= syscall.S_IFIFO
|
||||
case inMode&os.ModeSymlink != 0:
|
||||
outMode |= syscall.S_IFLNK
|
||||
case inMode&os.ModeSocket != 0:
|
||||
outMode |= syscall.S_IFSOCK
|
||||
}
|
||||
if inMode&os.ModeSetuid != 0 {
|
||||
outMode |= syscall.S_ISUID
|
||||
}
|
||||
if inMode&os.ModeSetgid != 0 {
|
||||
outMode |= syscall.S_ISGID
|
||||
}
|
||||
if inMode&os.ModeSticky != 0 {
|
||||
outMode |= syscall.S_ISVTX
|
||||
}
|
||||
return outMode
|
||||
}
|
|
@ -28,6 +28,9 @@ import (
|
|||
// OpContext contains extra context that may be needed by some file systems.
|
||||
// See https://libfuse.github.io/doxygen/structfuse__context.html as a reference.
|
||||
type OpContext struct {
|
||||
// FuseID is the Unique identifier for each operation from the kernel.
|
||||
FuseID uint64
|
||||
|
||||
// PID of the process that is invoking the operation.
|
||||
// Not filled in case of a writepage operation.
|
||||
Pid uint32
|
||||
|
@ -301,9 +304,6 @@ type MkNodeOp struct {
|
|||
Name string
|
||||
Mode os.FileMode
|
||||
|
||||
// The device number (only valid if created file is a device)
|
||||
Rdev uint32
|
||||
|
||||
// Set by the file system: information about the inode that was created.
|
||||
//
|
||||
// The lookup count for the inode is implicitly incremented. See notes on
|
||||
|
@ -562,18 +562,12 @@ type ReadDirOp struct {
|
|||
// offset, and return array offsets into that cached listing.
|
||||
Offset DirOffset
|
||||
|
||||
// Whether this operation is a READDIRPLUS
|
||||
//
|
||||
// If true, then the FS must return inode attributes and expiration time
|
||||
// along with each directory entry and increment its reference count.
|
||||
Plus bool
|
||||
|
||||
// The destination buffer, whose length gives the size of the read.
|
||||
//
|
||||
// The output data should consist of a sequence of FUSE directory entries in
|
||||
// the format generated by fuse_add_direntry (http://goo.gl/qCcHCV), which is
|
||||
// consumed by parse_dirfile (http://goo.gl/2WUmD2). Use fuseutil.WriteDirent
|
||||
// or fuseutil.WriteDirentPlus to generate this data.
|
||||
// to generate this data.
|
||||
//
|
||||
// Each entry returned exposes a directory offset to the user that may later
|
||||
// show up in ReadDirRequest.Offset. See notes on that field for more
|
||||
|
@ -758,18 +752,7 @@ type WriteFileOp struct {
|
|||
// be written, except on error (http://goo.gl/KUpwwn). This appears to be
|
||||
// because it uses file mmapping machinery (http://goo.gl/SGxnaN) to write a
|
||||
// page at a time.
|
||||
Data []byte
|
||||
|
||||
// Set by the file system: "no reuse" flag.
|
||||
//
|
||||
// By default, the Data buffer is reused by the library, so the file system
|
||||
// must copy the data if it wants to use it later.
|
||||
//
|
||||
// However, if the file system sets this flag to true, the library doesn't
|
||||
// reuse this buffer, so the file system can safely store and use Data slice
|
||||
// without copying memory.
|
||||
SuppressReuse bool
|
||||
|
||||
Data []byte
|
||||
OpContext OpContext
|
||||
}
|
||||
|
||||
|
@ -1004,7 +987,7 @@ type PollOp struct {
|
|||
|
||||
// Set by the file system: the actual events that have happened
|
||||
// since the last poll
|
||||
Revents fusekernel.PollEvents
|
||||
Revents fusekernel.PollEvents
|
||||
OpContext OpContext
|
||||
}
|
||||
|
||||
|
|
|
@ -87,9 +87,6 @@ type InodeAttributes struct {
|
|||
//
|
||||
Mode os.FileMode
|
||||
|
||||
// The device number. Only valid if the file is a device
|
||||
Rdev uint32
|
||||
|
||||
// Time information. See `man 2 stat` for full details.
|
||||
Atime time.Time // Time of last access
|
||||
Mtime time.Time // Time of last modification
|
||||
|
|
|
@ -19,7 +19,6 @@ import (
|
|||
"unsafe"
|
||||
|
||||
"github.com/jacobsa/fuse/fuseops"
|
||||
"github.com/jacobsa/fuse/internal/fusekernel"
|
||||
)
|
||||
|
||||
type DirentType uint32
|
||||
|
@ -52,17 +51,9 @@ type Dirent struct {
|
|||
}
|
||||
|
||||
// Write the supplied directory entry into the given buffer in the format
|
||||
// expected in fuseops.ReadDirOp.Data, returning the number of bytes written.
|
||||
// expected in fuseops.ReadFileOp.Data, returning the number of bytes written.
|
||||
// Return zero if the entry would not fit.
|
||||
func WriteDirent(buf []byte, d Dirent) (n int) {
|
||||
return WriteDirentPlus(buf, nil, d)
|
||||
}
|
||||
|
||||
// Write the supplied directory entry and, optionally, inode entry into the
|
||||
// given buffer in the format expected in fuseops.ReadDirOp.Data with enabled
|
||||
// READDIRPLUS capability, returning the number of bytes written.
|
||||
// Returns zero if the entry would not fit.
|
||||
func WriteDirentPlus(buf []byte, e *fuseops.ChildInodeEntry, d Dirent) (n int) {
|
||||
// We want to write bytes with the layout of fuse_dirent
|
||||
// (http://goo.gl/BmFxob) in host order. The struct must be aligned according
|
||||
// to FUSE_DIRENT_ALIGN (http://goo.gl/UziWvH), which dictates 8-byte
|
||||
|
@ -87,21 +78,10 @@ func WriteDirentPlus(buf []byte, e *fuseops.ChildInodeEntry, d Dirent) (n int) {
|
|||
|
||||
// Do we have enough room?
|
||||
totalLen := direntSize + len(d.Name) + padLen
|
||||
if e != nil {
|
||||
// READDIRPLUS was added in protocol 7.21, entry attributes were added in 7.9
|
||||
// So here EntryOut is always full-length
|
||||
totalLen += int(unsafe.Sizeof(fusekernel.EntryOut{}))
|
||||
}
|
||||
if totalLen > len(buf) {
|
||||
return n
|
||||
}
|
||||
|
||||
if e != nil {
|
||||
out := (*fusekernel.EntryOut)(unsafe.Pointer(&buf[n]))
|
||||
fuseops.ConvertChildInodeEntry(e, out)
|
||||
n += int(unsafe.Sizeof(fusekernel.EntryOut{}))
|
||||
}
|
||||
|
||||
// Write the header.
|
||||
de := fuse_dirent{
|
||||
ino: uint64(d.Inode),
|
||||
|
|
14
go.mod
14
go.mod
|
@ -1,17 +1,19 @@
|
|||
module github.com/jacobsa/fuse
|
||||
|
||||
go 1.18
|
||||
go 1.19
|
||||
|
||||
require (
|
||||
github.com/detailyang/go-fallocate v0.0.0-20180908115635-432fa640bd2e
|
||||
github.com/jacobsa/oglematchers v0.0.0-20150720000706-141901ea67cd
|
||||
github.com/jacobsa/oglemock v0.0.0-20150831005832-e94d794d06ff // indirect
|
||||
github.com/jacobsa/ogletest v0.0.0-20170503003838-80d50a735a11
|
||||
github.com/jacobsa/reqtrace v0.0.0-20150505043853-245c9e0234cb // indirect
|
||||
github.com/jacobsa/syncutil v0.0.0-20180201203307-228ac8e5a6c3
|
||||
github.com/jacobsa/timeutil v0.0.0-20170205232429-577e5acbbcf6
|
||||
github.com/kylelemons/godebug v1.1.0
|
||||
golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e // indirect
|
||||
golang.org/x/net v0.0.0-20220526153639-5463443f8c37
|
||||
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a
|
||||
golang.org/x/net v0.7.0
|
||||
golang.org/x/sys v0.5.0
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/jacobsa/oglemock v0.0.0-20150831005832-e94d794d06ff // indirect
|
||||
github.com/jacobsa/reqtrace v0.0.0-20150505043853-245c9e0234cb // indirect
|
||||
)
|
||||
|
|
26
go.sum
26
go.sum
|
@ -14,25 +14,7 @@ github.com/jacobsa/timeutil v0.0.0-20170205232429-577e5acbbcf6 h1:XKHJmHcgU9glxk
|
|||
github.com/jacobsa/timeutil v0.0.0-20170205232429-577e5acbbcf6/go.mod h1:JEWKD6V8xETMW+DEv+IQVz++f8Cn8O/X0HPeDY3qNis=
|
||||
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
|
||||
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e h1:T8NU3HyQ8ClP4SEE+KbFlg6n0NhuTsN4MyznaarGsZM=
|
||||
golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||
golang.org/x/net v0.0.0-20200301022130-244492dfa37a h1:GuSPYbZzB5/dcLNCwLQLsg3obCJtX9IJhpXkvY7kzk0=
|
||||
golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||
golang.org/x/net v0.0.0-20220526153639-5463443f8c37 h1:lUkvobShwKsOesNfWWlCS5q7fnbG1MEliIzwu886fn8=
|
||||
golang.org/x/net v0.0.0-20220526153639-5463443f8c37/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527 h1:uYVVQ9WP/Ds2ROhcaGPeIdVq0RIXVLwsHlnvJ+cT1So=
|
||||
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k=
|
||||
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g=
|
||||
golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
||||
golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU=
|
||||
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
|
|
|
@ -17,4 +17,4 @@ package buffer
|
|||
// The maximum fuse write request size that InMessage can acommodate.
|
||||
//
|
||||
// As of kernel 4.20 Linux accepts writes up to 256 pages or 1MiB
|
||||
const MaxWriteSize = 1 << 17
|
||||
const MaxWriteSize = 1 << 20
|
||||
|
|
|
@ -168,7 +168,7 @@ const (
|
|||
|
||||
// OpenAccessModeMask is a bitmask that separates the access mode
|
||||
// from the other flags in OpenFlags.
|
||||
const OpenAccessModeMask OpenFlags = OpenReadOnly | OpenWriteOnly | OpenReadWrite
|
||||
const OpenAccessModeMask OpenFlags = syscall.O_ACCMODE
|
||||
|
||||
// OpenFlags are the O_FOO flags passed to open/create/etc calls. For
|
||||
// example, os.O_WRONLY | os.O_APPEND.
|
||||
|
@ -417,7 +417,6 @@ const (
|
|||
OpNotifyReply = 41
|
||||
OpBatchForget = 42
|
||||
OpFallocate = 43
|
||||
OpReaddirplus = 44
|
||||
|
||||
// OS X
|
||||
OpSetvolname = 61
|
||||
|
@ -874,10 +873,10 @@ type NotifyRetrieveOut struct {
|
|||
|
||||
// Matches the size of WriteIn
|
||||
type NotifyRetrieveIn struct {
|
||||
dummy1 uint64
|
||||
Offset uint64
|
||||
Size uint32
|
||||
dummy2 uint32
|
||||
dummy3 uint64
|
||||
dummy4 uint64
|
||||
dummy1 uint64
|
||||
Offset uint64
|
||||
Size uint32
|
||||
dummy2 uint32
|
||||
dummy3 uint64
|
||||
dummy4 uint64
|
||||
}
|
||||
|
|
|
@ -1,5 +1,3 @@
|
|||
// +build linux windows
|
||||
|
||||
package fusekernel
|
||||
|
||||
import "time"
|
|
@ -0,0 +1 @@
|
|||
package fusekernel
|
|
@ -151,11 +151,6 @@ type MountConfig struct {
|
|||
// OpenDir calls at all (Linux >= 5.1):
|
||||
EnableNoOpendirSupport bool
|
||||
|
||||
// Tell the kernel to use READDIRPLUS.
|
||||
// Note that the implementation may still fall back to READDIR if the running
|
||||
// kernel doesn't have support for READDIRPLUS.
|
||||
UseReadDirPlus bool
|
||||
|
||||
// Disable FUSE default permissions.
|
||||
// This is useful for situations where the backing data store (e.g., S3) doesn't
|
||||
// actually utilise any form of qualifiable UNIX permissions.
|
||||
|
|
|
@ -16,6 +16,7 @@ package statfs_test
|
|||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/jacobsa/oglematchers"
|
||||
"math"
|
||||
"regexp"
|
||||
"syscall"
|
||||
|
@ -68,7 +69,7 @@ func (t *StatFSTest) Syscall_ZeroValues() {
|
|||
ExpectEq(0, stat.Bavail)
|
||||
ExpectEq(0, stat.Files)
|
||||
ExpectEq(0, stat.Ffree)
|
||||
ExpectEq("osxfuse", convertName(stat.Fstypename[:]))
|
||||
ExpectThat(convertName(stat.Fstypename[:]), oglematchers.AnyOf(oglematchers.Equals("osxfuse"), oglematchers.Equals("macfuse")))
|
||||
ExpectEq(t.canonicalDir, convertName(stat.Mntonname[:]))
|
||||
ExpectEq(fsName, convertName(stat.Mntfromname[:]))
|
||||
}
|
||||
|
@ -103,7 +104,7 @@ func (t *StatFSTest) Syscall_NonZeroValues() {
|
|||
ExpectEq(canned.BlocksAvailable, stat.Bavail)
|
||||
ExpectEq(canned.Inodes, stat.Files)
|
||||
ExpectEq(canned.InodesFree, stat.Ffree)
|
||||
ExpectEq("osxfuse", convertName(stat.Fstypename[:]))
|
||||
ExpectThat(convertName(stat.Fstypename[:]), oglematchers.AnyOf(oglematchers.Equals("osxfuse"), oglematchers.Equals("macfuse")))
|
||||
ExpectEq(t.canonicalDir, convertName(stat.Mntonname[:]))
|
||||
ExpectEq(fsName, convertName(stat.Mntfromname[:]))
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue