diff --git a/fuseops/common_op.go b/fuseops/common_op.go index b49c110..316ba24 100644 --- a/fuseops/common_op.go +++ b/fuseops/common_op.go @@ -34,6 +34,9 @@ type internalOp interface { // Create a response message for the kernel, with leading pading for a // fusekernel.OutHeader struct. + // + // Special case: a return value of nil means that the kernel is not expecting + // a response. kernelResponse() []byte } @@ -147,17 +150,19 @@ func (o *commonOp) Respond(err error) { msg = fuseshim.NewBuffer(0) } - // Fill in the header. - h := (*fusekernel.OutHeader)(unsafe.Pointer(&msg[0])) - h.Unique = o.fuseID - h.Len = uint32(len(msg)) - if err != nil { - errno := fuseshim.EIO - if ferr, ok := err.(fuseshim.ErrorNumber); ok { - errno = ferr.Errno() - } + // Fill in the header if a reply is needed. + if msg != nil { + h := (*fusekernel.OutHeader)(unsafe.Pointer(&msg[0])) + h.Unique = o.fuseID + h.Len = uint32(len(msg)) + if err != nil { + errno := fuseshim.EIO + if ferr, ok := err.(fuseshim.ErrorNumber); ok { + errno = ferr.Errno() + } - h.Error = -int32(errno) + h.Error = -int32(errno) + } } // Reply. diff --git a/fuseops/ops.go b/fuseops/ops.go index 3583bb7..c3f7c68 100644 --- a/fuseops/ops.go +++ b/fuseops/ops.go @@ -217,7 +217,8 @@ type ForgetInodeOp struct { } func (o *ForgetInodeOp) kernelResponse() (msg []byte) { - panic("TODO: Signal that no response should happen here.") + // No response. + return } //////////////////////////////////////////////////////////////////////// diff --git a/internal/fuseshim/fuse.go b/internal/fuseshim/fuse.go index 299415f..03f3a65 100644 --- a/internal/fuseshim/fuse.go +++ b/internal/fuseshim/fuse.go @@ -1061,10 +1061,13 @@ func errorString(err error) string { return err.Error() } -func (c *Conn) WriteToKernel(msg []byte) error { +func (c *Conn) writeToKernel(msg []byte) error { out := (*fusekernel.OutHeader)(unsafe.Pointer(&msg[0])) out.Len = uint32(len(msg)) + return c.WriteToKernel(msg) +} +func (c *Conn) WriteToKernel(msg []byte) error { c.wio.RLock() defer c.wio.RUnlock() _, err := syscall.Write(c.fd(), msg)