Fix FUSE_RELEASE protocol reply processing

This commit fixes the potential unexpected errors
of original handling of FUSE_RELEASE responses while
keep the same behavior (ignoring any reply).
This commit is contained in:
Jinmou Li
2020-09-16 12:19:30 -07:00
committed by Andrei Vagin
parent 826a685a95
commit 4edc56d3e9
2 changed files with 14 additions and 2 deletions
+8 -1
View File
@@ -204,8 +204,11 @@ func (fd *DeviceFD) readLocked(ctx context.Context, dst usermem.IOSequence, opts
// Fully done with this req, remove it from the queue.
fd.queue.Remove(req)
if req.hdr.Opcode == linux.FUSE_RELEASE {
// Remove noReply ones from map of requests expecting a reply.
if req.noReply {
fd.numActiveRequests -= 1
delete(fd.completions, req.hdr.Unique)
}
return int64(n), nil
@@ -296,6 +299,10 @@ func (fd *DeviceFD) writeLocked(ctx context.Context, src usermem.IOSequence, opt
fut, ok := fd.completions[hdr.Unique]
if !ok {
if fut.hdr.Unique == linux.FUSE_RELEASE {
// Currently we simply discard the reply for FUSE_RELEASE.
return n + src.NumBytes(), nil
}
// Server sent us a response for a request we never sent?
return 0, syserror.EINVAL
}
+6 -1
View File
@@ -84,7 +84,12 @@ func (fd *fileDescription) Release(ctx context.Context) {
}
kernelTask := kernel.TaskFromContext(ctx)
// ignoring errors and FUSE server reply is analogous to Linux's behavior.
req, _ := conn.NewRequest(auth.CredentialsFromContext(ctx), uint32(kernelTask.ThreadID()), fd.inode().NodeID, opcode, &in)
req, err := conn.NewRequest(auth.CredentialsFromContext(ctx), uint32(kernelTask.ThreadID()), fd.inode().NodeID, opcode, &in)
if err != nil {
// No way to invoke Call() with an errored request.
return
}
req.noReply = true
conn.CallAsync(kernelTask, req)
}