Add FuseID/Unique Op ID to OpContext

notifications
Doug Schaapveld 2023-02-17 18:15:49 -06:00 committed by Michael Stapelberg
parent bb43c71d6f
commit 702f658418
2 changed files with 170 additions and 85 deletions

View File

@ -51,15 +51,21 @@ func convertInMessage(
} }
o = &fuseops.LookUpInodeOp{ o = &fuseops.LookUpInodeOp{
Parent: fuseops.InodeID(inMsg.Header().Nodeid), Parent: fuseops.InodeID(inMsg.Header().Nodeid),
Name: string(buf[:n-1]), Name: string(buf[:n-1]),
OpContext: fuseops.OpContext{Pid: inMsg.Header().Pid}, OpContext: fuseops.OpContext{
FuseID: inMsg.Header().Unique,
Pid: inMsg.Header().Pid,
},
} }
case fusekernel.OpGetattr: case fusekernel.OpGetattr:
o = &fuseops.GetInodeAttributesOp{ o = &fuseops.GetInodeAttributesOp{
Inode: fuseops.InodeID(inMsg.Header().Nodeid), Inode: fuseops.InodeID(inMsg.Header().Nodeid),
OpContext: fuseops.OpContext{Pid: inMsg.Header().Pid}, OpContext: fuseops.OpContext{
FuseID: inMsg.Header().Unique,
Pid: inMsg.Header().Pid,
},
} }
case fusekernel.OpSetattr: case fusekernel.OpSetattr:
@ -70,8 +76,11 @@ func convertInMessage(
} }
to := &fuseops.SetInodeAttributesOp{ to := &fuseops.SetInodeAttributesOp{
Inode: fuseops.InodeID(inMsg.Header().Nodeid), Inode: fuseops.InodeID(inMsg.Header().Nodeid),
OpContext: fuseops.OpContext{Pid: inMsg.Header().Pid}, OpContext: fuseops.OpContext{
FuseID: inMsg.Header().Unique,
Pid: inMsg.Header().Pid,
},
} }
o = to o = to
@ -116,9 +125,12 @@ func convertInMessage(
} }
o = &fuseops.ForgetInodeOp{ o = &fuseops.ForgetInodeOp{
Inode: fuseops.InodeID(inMsg.Header().Nodeid), Inode: fuseops.InodeID(inMsg.Header().Nodeid),
N: in.Nlookup, N: in.Nlookup,
OpContext: fuseops.OpContext{Pid: inMsg.Header().Pid}, OpContext: fuseops.OpContext{
FuseID: inMsg.Header().Unique,
Pid: inMsg.Header().Pid,
},
} }
case fusekernel.OpBatchForget: case fusekernel.OpBatchForget:
@ -143,8 +155,11 @@ func convertInMessage(
} }
o = &fuseops.BatchForgetOp{ o = &fuseops.BatchForgetOp{
Entries: entries, Entries: entries,
OpContext: fuseops.OpContext{Pid: inMsg.Header().Pid}, OpContext: fuseops.OpContext{
FuseID: inMsg.Header().Unique,
Pid: inMsg.Header().Pid,
},
} }
case fusekernel.OpMkdir: case fusekernel.OpMkdir:
@ -170,8 +185,11 @@ func convertInMessage(
// the fact that this is a directory is implicit in the fact that the // 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 // opcode is mkdir. But we want the correct mode to go through, so ensure
// that os.ModeDir is set. // that os.ModeDir is set.
Mode: convertFileMode(in.Mode) | os.ModeDir, Mode: convertFileMode(in.Mode) | os.ModeDir,
OpContext: fuseops.OpContext{Pid: inMsg.Header().Pid}, OpContext: fuseops.OpContext{
FuseID: inMsg.Header().Unique,
Pid: inMsg.Header().Pid,
},
} }
case fusekernel.OpMknod: case fusekernel.OpMknod:
@ -188,10 +206,13 @@ func convertInMessage(
name = name[:i] name = name[:i]
o = &fuseops.MkNodeOp{ o = &fuseops.MkNodeOp{
Parent: fuseops.InodeID(inMsg.Header().Nodeid), Parent: fuseops.InodeID(inMsg.Header().Nodeid),
Name: string(name), Name: string(name),
Mode: convertFileMode(in.Mode), Mode: convertFileMode(in.Mode),
OpContext: fuseops.OpContext{Pid: inMsg.Header().Pid}, OpContext: fuseops.OpContext{
FuseID: inMsg.Header().Unique,
Pid: inMsg.Header().Pid,
},
} }
case fusekernel.OpCreate: case fusekernel.OpCreate:
@ -208,10 +229,13 @@ func convertInMessage(
name = name[:i] name = name[:i]
o = &fuseops.CreateFileOp{ o = &fuseops.CreateFileOp{
Parent: fuseops.InodeID(inMsg.Header().Nodeid), Parent: fuseops.InodeID(inMsg.Header().Nodeid),
Name: string(name), Name: string(name),
Mode: convertFileMode(in.Mode), Mode: convertFileMode(in.Mode),
OpContext: fuseops.OpContext{Pid: inMsg.Header().Pid}, OpContext: fuseops.OpContext{
FuseID: inMsg.Header().Unique,
Pid: inMsg.Header().Pid,
},
} }
case fusekernel.OpSymlink: case fusekernel.OpSymlink:
@ -227,10 +251,13 @@ func convertInMessage(
newName, target := names[0:i], names[i+1:len(names)-1] newName, target := names[0:i], names[i+1:len(names)-1]
o = &fuseops.CreateSymlinkOp{ o = &fuseops.CreateSymlinkOp{
Parent: fuseops.InodeID(inMsg.Header().Nodeid), Parent: fuseops.InodeID(inMsg.Header().Nodeid),
Name: string(newName), Name: string(newName),
Target: string(target), Target: string(target),
OpContext: fuseops.OpContext{Pid: inMsg.Header().Pid}, OpContext: fuseops.OpContext{
FuseID: inMsg.Header().Unique,
Pid: inMsg.Header().Pid,
},
} }
case fusekernel.OpRename: case fusekernel.OpRename:
@ -272,7 +299,10 @@ func convertInMessage(
OldName: string(oldName), OldName: string(oldName),
NewParent: fuseops.InodeID(in.Newdir), NewParent: fuseops.InodeID(in.Newdir),
NewName: string(newName), NewName: string(newName),
OpContext: fuseops.OpContext{Pid: inMsg.Header().Pid}, OpContext: fuseops.OpContext{
FuseID: inMsg.Header().Unique,
Pid: inMsg.Header().Pid,
},
} }
case fusekernel.OpUnlink: case fusekernel.OpUnlink:
@ -283,9 +313,12 @@ func convertInMessage(
} }
o = &fuseops.UnlinkOp{ o = &fuseops.UnlinkOp{
Parent: fuseops.InodeID(inMsg.Header().Nodeid), Parent: fuseops.InodeID(inMsg.Header().Nodeid),
Name: string(buf[:n-1]), Name: string(buf[:n-1]),
OpContext: fuseops.OpContext{Pid: inMsg.Header().Pid}, OpContext: fuseops.OpContext{
FuseID: inMsg.Header().Unique,
Pid: inMsg.Header().Pid,
},
} }
case fusekernel.OpRmdir: case fusekernel.OpRmdir:
@ -296,9 +329,12 @@ func convertInMessage(
} }
o = &fuseops.RmDirOp{ o = &fuseops.RmDirOp{
Parent: fuseops.InodeID(inMsg.Header().Nodeid), Parent: fuseops.InodeID(inMsg.Header().Nodeid),
Name: string(buf[:n-1]), Name: string(buf[:n-1]),
OpContext: fuseops.OpContext{Pid: inMsg.Header().Pid}, OpContext: fuseops.OpContext{
FuseID: inMsg.Header().Unique,
Pid: inMsg.Header().Pid,
},
} }
case fusekernel.OpOpen: case fusekernel.OpOpen:
@ -311,13 +347,19 @@ func convertInMessage(
o = &fuseops.OpenFileOp{ o = &fuseops.OpenFileOp{
Inode: fuseops.InodeID(inMsg.Header().Nodeid), Inode: fuseops.InodeID(inMsg.Header().Nodeid),
OpenFlags: fusekernel.OpenFlags(in.Flags), 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: case fusekernel.OpOpendir:
o = &fuseops.OpenDirOp{ o = &fuseops.OpenDirOp{
Inode: fuseops.InodeID(inMsg.Header().Nodeid), Inode: fuseops.InodeID(inMsg.Header().Nodeid),
OpContext: fuseops.OpContext{Pid: inMsg.Header().Pid}, OpContext: fuseops.OpContext{
FuseID: inMsg.Header().Unique,
Pid: inMsg.Header().Pid,
},
} }
case fusekernel.OpRead: case fusekernel.OpRead:
@ -327,11 +369,14 @@ func convertInMessage(
} }
to := &fuseops.ReadFileOp{ to := &fuseops.ReadFileOp{
Inode: fuseops.InodeID(inMsg.Header().Nodeid), Inode: fuseops.InodeID(inMsg.Header().Nodeid),
Handle: fuseops.HandleID(in.Fh), Handle: fuseops.HandleID(in.Fh),
Offset: int64(in.Offset), Offset: int64(in.Offset),
Size: int64(in.Size), Size: int64(in.Size),
OpContext: fuseops.OpContext{Pid: inMsg.Header().Pid}, OpContext: fuseops.OpContext{
FuseID: inMsg.Header().Unique,
Pid: inMsg.Header().Pid,
},
} }
if !config.UseVectoredRead { if !config.UseVectoredRead {
// Use part of the incoming message storage as the read buffer // Use part of the incoming message storage as the read buffer
@ -347,10 +392,13 @@ func convertInMessage(
} }
to := &fuseops.ReadDirOp{ to := &fuseops.ReadDirOp{
Inode: fuseops.InodeID(inMsg.Header().Nodeid), Inode: fuseops.InodeID(inMsg.Header().Nodeid),
Handle: fuseops.HandleID(in.Fh), Handle: fuseops.HandleID(in.Fh),
Offset: fuseops.DirOffset(in.Offset), Offset: fuseops.DirOffset(in.Offset),
OpContext: fuseops.OpContext{Pid: inMsg.Header().Pid}, OpContext: fuseops.OpContext{
FuseID: inMsg.Header().Unique,
Pid: inMsg.Header().Pid,
},
} }
o = to o = to
@ -373,8 +421,11 @@ func convertInMessage(
} }
o = &fuseops.ReleaseFileHandleOp{ o = &fuseops.ReleaseFileHandleOp{
Handle: fuseops.HandleID(in.Fh), Handle: fuseops.HandleID(in.Fh),
OpContext: fuseops.OpContext{Pid: inMsg.Header().Pid}, OpContext: fuseops.OpContext{
FuseID: inMsg.Header().Unique,
Pid: inMsg.Header().Pid,
},
} }
case fusekernel.OpReleasedir: case fusekernel.OpReleasedir:
@ -385,8 +436,11 @@ func convertInMessage(
} }
o = &fuseops.ReleaseDirHandleOp{ o = &fuseops.ReleaseDirHandleOp{
Handle: fuseops.HandleID(in.Fh), Handle: fuseops.HandleID(in.Fh),
OpContext: fuseops.OpContext{Pid: inMsg.Header().Pid}, OpContext: fuseops.OpContext{
FuseID: inMsg.Header().Unique,
Pid: inMsg.Header().Pid,
},
} }
case fusekernel.OpWrite: case fusekernel.OpWrite:
@ -401,11 +455,14 @@ func convertInMessage(
} }
o = &fuseops.WriteFileOp{ o = &fuseops.WriteFileOp{
Inode: fuseops.InodeID(inMsg.Header().Nodeid), Inode: fuseops.InodeID(inMsg.Header().Nodeid),
Handle: fuseops.HandleID(in.Fh), Handle: fuseops.HandleID(in.Fh),
Data: buf, Data: buf,
Offset: int64(in.Offset), Offset: int64(in.Offset),
OpContext: fuseops.OpContext{Pid: inMsg.Header().Pid}, OpContext: fuseops.OpContext{
FuseID: inMsg.Header().Unique,
Pid: inMsg.Header().Pid,
},
} }
case fusekernel.OpFsync, fusekernel.OpFsyncdir: case fusekernel.OpFsync, fusekernel.OpFsyncdir:
@ -416,9 +473,12 @@ func convertInMessage(
} }
o = &fuseops.SyncFileOp{ o = &fuseops.SyncFileOp{
Inode: fuseops.InodeID(inMsg.Header().Nodeid), Inode: fuseops.InodeID(inMsg.Header().Nodeid),
Handle: fuseops.HandleID(in.Fh), Handle: fuseops.HandleID(in.Fh),
OpContext: fuseops.OpContext{Pid: inMsg.Header().Pid}, OpContext: fuseops.OpContext{
FuseID: inMsg.Header().Unique,
Pid: inMsg.Header().Pid,
},
} }
case fusekernel.OpFlush: case fusekernel.OpFlush:
@ -429,15 +489,21 @@ func convertInMessage(
} }
o = &fuseops.FlushFileOp{ o = &fuseops.FlushFileOp{
Inode: fuseops.InodeID(inMsg.Header().Nodeid), Inode: fuseops.InodeID(inMsg.Header().Nodeid),
Handle: fuseops.HandleID(in.Fh), Handle: fuseops.HandleID(in.Fh),
OpContext: fuseops.OpContext{Pid: inMsg.Header().Pid}, OpContext: fuseops.OpContext{
FuseID: inMsg.Header().Unique,
Pid: inMsg.Header().Pid,
},
} }
case fusekernel.OpReadlink: case fusekernel.OpReadlink:
o = &fuseops.ReadSymlinkOp{ o = &fuseops.ReadSymlinkOp{
Inode: fuseops.InodeID(inMsg.Header().Nodeid), Inode: fuseops.InodeID(inMsg.Header().Nodeid),
OpContext: fuseops.OpContext{Pid: inMsg.Header().Pid}, OpContext: fuseops.OpContext{
FuseID: inMsg.Header().Unique,
Pid: inMsg.Header().Pid,
},
} }
case fusekernel.OpStatfs: case fusekernel.OpStatfs:
@ -485,10 +551,13 @@ func convertInMessage(
} }
o = &fuseops.CreateLinkOp{ o = &fuseops.CreateLinkOp{
Parent: fuseops.InodeID(inMsg.Header().Nodeid), Parent: fuseops.InodeID(inMsg.Header().Nodeid),
Name: string(name), Name: string(name),
Target: fuseops.InodeID(in.Oldnodeid), Target: fuseops.InodeID(in.Oldnodeid),
OpContext: fuseops.OpContext{Pid: inMsg.Header().Pid}, OpContext: fuseops.OpContext{
FuseID: inMsg.Header().Unique,
Pid: inMsg.Header().Pid,
},
} }
case fusekernel.OpRemovexattr: case fusekernel.OpRemovexattr:
@ -499,9 +568,12 @@ func convertInMessage(
} }
o = &fuseops.RemoveXattrOp{ o = &fuseops.RemoveXattrOp{
Inode: fuseops.InodeID(inMsg.Header().Nodeid), Inode: fuseops.InodeID(inMsg.Header().Nodeid),
Name: string(buf[:n-1]), Name: string(buf[:n-1]),
OpContext: fuseops.OpContext{Pid: inMsg.Header().Pid}, OpContext: fuseops.OpContext{
FuseID: inMsg.Header().Unique,
Pid: inMsg.Header().Pid,
},
} }
case fusekernel.OpGetxattr: case fusekernel.OpGetxattr:
@ -519,9 +591,12 @@ func convertInMessage(
name = name[:i] name = name[:i]
to := &fuseops.GetXattrOp{ to := &fuseops.GetXattrOp{
Inode: fuseops.InodeID(inMsg.Header().Nodeid), Inode: fuseops.InodeID(inMsg.Header().Nodeid),
Name: string(name), Name: string(name),
OpContext: fuseops.OpContext{Pid: inMsg.Header().Pid}, OpContext: fuseops.OpContext{
FuseID: inMsg.Header().Unique,
Pid: inMsg.Header().Pid,
},
} }
o = to o = to
@ -548,8 +623,11 @@ func convertInMessage(
} }
to := &fuseops.ListXattrOp{ to := &fuseops.ListXattrOp{
Inode: fuseops.InodeID(inMsg.Header().Nodeid), Inode: fuseops.InodeID(inMsg.Header().Nodeid),
OpContext: fuseops.OpContext{Pid: inMsg.Header().Pid}, OpContext: fuseops.OpContext{
FuseID: inMsg.Header().Unique,
Pid: inMsg.Header().Pid,
},
} }
o = to o = to
@ -584,11 +662,13 @@ func convertInMessage(
name, value := payload[:i], payload[i+1:len(payload)] name, value := payload[:i], payload[i+1:len(payload)]
o = &fuseops.SetXattrOp{ o = &fuseops.SetXattrOp{
Inode: fuseops.InodeID(inMsg.Header().Nodeid), Inode: fuseops.InodeID(inMsg.Header().Nodeid),
Name: string(name), Name: string(name),
Value: value, Value: value,
Flags: in.Flags, Flags: in.Flags,
OpContext: fuseops.OpContext{Pid: inMsg.Header().Pid}, OpContext: fuseops.OpContext{
FuseID: inMsg.Header().Unique,
Pid: inMsg.Header().Pid},
} }
case fusekernel.OpFallocate: case fusekernel.OpFallocate:
type input fusekernel.FallocateIn type input fusekernel.FallocateIn
@ -598,12 +678,14 @@ func convertInMessage(
} }
o = &fuseops.FallocateOp{ o = &fuseops.FallocateOp{
Inode: fuseops.InodeID(inMsg.Header().Nodeid), Inode: fuseops.InodeID(inMsg.Header().Nodeid),
Handle: fuseops.HandleID(in.Fh), Handle: fuseops.HandleID(in.Fh),
Offset: in.Offset, Offset: in.Offset,
Length: in.Length, Length: in.Length,
Mode: in.Mode, Mode: in.Mode,
OpContext: fuseops.OpContext{Pid: inMsg.Header().Pid}, OpContext: fuseops.OpContext{
FuseID: inMsg.Header().Unique,
Pid: inMsg.Header().Pid},
} }
default: default:

View File

@ -28,6 +28,9 @@ import (
// OpContext contains extra context that may be needed by some file systems. // OpContext contains extra context that may be needed by some file systems.
// See https://libfuse.github.io/doxygen/structfuse__context.html as a reference. // See https://libfuse.github.io/doxygen/structfuse__context.html as a reference.
type OpContext struct { 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. // PID of the process that is invoking the operation.
// Not filled in case of a writepage operation. // Not filled in case of a writepage operation.
Pid uint32 Pid uint32