mirror of
https://github.com/rclone/rclone.git
synced 2024-11-26 10:13:52 +08:00
35 lines
900 B
Go
35 lines
900 B
Go
|
package fuse
|
||
|
|
||
|
// Go 1.9 introduces polling for file I/O. The implementation causes
|
||
|
// the runtime's epoll to take up the last GOMAXPROCS slot, and if
|
||
|
// that happens, we won't have any threads left to service FUSE's
|
||
|
// _OP_POLL request. Prevent this by forcing _OP_POLL to happen, so we
|
||
|
// can say ENOSYS and prevent further _OP_POLL requests.
|
||
|
const pollHackName = ".go-fuse-epoll-hack"
|
||
|
const pollHackInode = ^uint64(0)
|
||
|
|
||
|
func doPollHackLookup(ms *Server, req *request) {
|
||
|
switch req.inHeader.Opcode {
|
||
|
case _OP_CREATE:
|
||
|
out := (*CreateOut)(req.outData())
|
||
|
out.EntryOut = EntryOut{
|
||
|
NodeId: pollHackInode,
|
||
|
Attr: Attr{
|
||
|
Ino: pollHackInode,
|
||
|
Mode: S_IFREG | 0644,
|
||
|
Nlink: 1,
|
||
|
},
|
||
|
}
|
||
|
out.OpenOut = OpenOut{
|
||
|
Fh: pollHackInode,
|
||
|
}
|
||
|
req.status = OK
|
||
|
case _OP_LOOKUP:
|
||
|
out := (*EntryOut)(req.outData())
|
||
|
*out = EntryOut{}
|
||
|
req.status = ENOENT
|
||
|
default:
|
||
|
req.status = EIO
|
||
|
}
|
||
|
}
|