add a bunch of methods to the client end
This commit is contained in:
parent
a5d237df2a
commit
5ab2cbd265
8 changed files with 236 additions and 17 deletions
34
vendor/github.com/hanwen/go-fuse/fuse/poll.go
generated
vendored
Normal file
34
vendor/github.com/hanwen/go-fuse/fuse/poll.go
generated
vendored
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
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
|
||||
}
|
||||
}
|
||||
49
vendor/github.com/hanwen/go-fuse/fuse/poll_darwin.go
generated
vendored
Normal file
49
vendor/github.com/hanwen/go-fuse/fuse/poll_darwin.go
generated
vendored
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
package fuse
|
||||
|
||||
import (
|
||||
"path/filepath"
|
||||
"syscall"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
type pollFd struct {
|
||||
Fd int32
|
||||
Events int16
|
||||
Revents int16
|
||||
}
|
||||
|
||||
func sysPoll(fds []pollFd, timeout int) (n int, err error) {
|
||||
r0, _, e1 := syscall.Syscall(syscall.SYS_POLL, uintptr(unsafe.Pointer(&fds[0])),
|
||||
uintptr(len(fds)), uintptr(timeout))
|
||||
n = int(r0)
|
||||
if e1 != 0 {
|
||||
err = syscall.Errno(e1)
|
||||
}
|
||||
return n, err
|
||||
}
|
||||
|
||||
func pollHack(mountPoint string) error {
|
||||
const (
|
||||
POLLIN = 0x1
|
||||
POLLPRI = 0x2
|
||||
POLLOUT = 0x4
|
||||
POLLRDHUP = 0x2000
|
||||
POLLERR = 0x8
|
||||
POLLHUP = 0x10
|
||||
)
|
||||
|
||||
fd, err := syscall.Open(filepath.Join(mountPoint, pollHackName), syscall.O_CREAT|syscall.O_TRUNC|syscall.O_RDWR, 0644)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
pollData := []pollFd{{
|
||||
Fd: int32(fd),
|
||||
Events: POLLIN | POLLPRI | POLLOUT,
|
||||
}}
|
||||
|
||||
// Trigger _OP_POLL, so we can say ENOSYS. We don't care about
|
||||
// the return value.
|
||||
sysPoll(pollData, 0)
|
||||
syscall.Close(fd)
|
||||
return nil
|
||||
}
|
||||
25
vendor/github.com/hanwen/go-fuse/fuse/poll_linux.go
generated
vendored
Normal file
25
vendor/github.com/hanwen/go-fuse/fuse/poll_linux.go
generated
vendored
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
package fuse
|
||||
|
||||
import (
|
||||
"path/filepath"
|
||||
"syscall"
|
||||
|
||||
"golang.org/x/sys/unix"
|
||||
)
|
||||
|
||||
func pollHack(mountPoint string) error {
|
||||
fd, err := syscall.Creat(filepath.Join(mountPoint, pollHackName), syscall.O_CREAT)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
pollData := []unix.PollFd{{
|
||||
Fd: int32(fd),
|
||||
Events: unix.POLLIN | unix.POLLPRI | unix.POLLOUT,
|
||||
}}
|
||||
|
||||
// Trigger _OP_POLL, so we can say ENOSYS. We don't care about
|
||||
// the return value.
|
||||
unix.Poll(pollData, 0)
|
||||
syscall.Close(fd)
|
||||
return nil
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue