osxfuse cgofuse mkdir input/output 错误
osxfuse cgofuse mkdir input/output error
在使用 cgofuse 时,我无法使用 os.Mkdir 在挂载的文件系统中创建目录:
panic: mkdir mp/testDir: input/output error
代码:
import (
"fmt"
"os"
"path/filepath"
"syscall"
"github.com/billziss-gh/cgofuse/fuse"
)
type Ptfs struct {
fuse.FileSystemBase
root string
}
var (
dirName = "testDir"
)
func main() {
mountPoint = os.Args[1]
fs := Ptfs{}
host := fuse.NewFileSystemHost(&fs)
host.SetCapReaddirPlus(true)
go host.Mount(mountPoint, []string{"-d"})
defer host.Unmount()
fmt.Println("init completed...")
fmt.Scanln()
fmt.Println("make dir...")
err := os.Mkdir(filepath.Join(mountPoint, dirName), 0700)
if err != nil {
panic(err)
}
}
接下来是 cgofuse 的 Getattr 定义(几乎与 github 中的示例相同):
func (self *Ptfs) Getattr(path string, stat *fuse.Stat_t, fh uint64) (errc int) {
stgo := syscall.Stat_t{}
if ^uint64(0) == fh {
path = filepath.Join(self.root, path)
errc = errno(syscall.Lstat(path, &stgo))
} else {
errc = errno(syscall.Fstat(int(fh), &stgo))
}
return
}
func (self *Ptfs) Mkdir(path string, mode uint32) (errc int) {
path = filepath.Join(self.root, path)
return errno(syscall.Mkdir(path, mode))
}
提供“-d”挂载选项我得到了这个额外的输出:
make dir...
unique: 9, opcode: LOOKUP (1), nodeid: 1, insize: 48, pid: 27053
LOOKUP /testDir
getattr /testDir
unique: 9, error: -2 (No such file or directory), outsize: 16
unique: 7, opcode: GETATTR (3), nodeid: 1, insize: 56, pid: 27053
getattr /
unique: 7, success, outsize: 136
unique: 2, opcode: DESTROY (38), nodeid: 1, insize: 40, pid: 27053
unique: 2, success, outsize: 16
dir "testDir" inside root dir in mountpoint 还不存在,所以我想 "No such file or directory" 是可以的。但即使在 "root" 目录的 GETATTR 的 "success" 之后,我仍然无法创建目录。我相信操作码 DESTROY 是通过延迟 host.Unmount().
引起的系统卸载获得的
[编辑] 深入研究:
func syscall.Lstat() 从 Getattr():
使用
func Lstat(path string, stat *Stat_t) (err error) {
var _p0 *byte
_p0, err = BytePtrFromString(path)
if err != nil {
return
}
_, _, e1 := Syscall(SYS_LSTAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)
if e1 != 0 {
err = errnoErr(e1)
}
return
}
我的错误在于 Getattr() 函数的实现。有必要将统计信息正确地放入给定的 stat 指针结构中,而不是用 stat struct 而不是 given 重写另一个地址。通过指针正确填充给定的统计结构,它将按预期工作。
在使用 cgofuse 时,我无法使用 os.Mkdir 在挂载的文件系统中创建目录:
panic: mkdir mp/testDir: input/output error
代码:
import (
"fmt"
"os"
"path/filepath"
"syscall"
"github.com/billziss-gh/cgofuse/fuse"
)
type Ptfs struct {
fuse.FileSystemBase
root string
}
var (
dirName = "testDir"
)
func main() {
mountPoint = os.Args[1]
fs := Ptfs{}
host := fuse.NewFileSystemHost(&fs)
host.SetCapReaddirPlus(true)
go host.Mount(mountPoint, []string{"-d"})
defer host.Unmount()
fmt.Println("init completed...")
fmt.Scanln()
fmt.Println("make dir...")
err := os.Mkdir(filepath.Join(mountPoint, dirName), 0700)
if err != nil {
panic(err)
}
}
接下来是 cgofuse 的 Getattr 定义(几乎与 github 中的示例相同):
func (self *Ptfs) Getattr(path string, stat *fuse.Stat_t, fh uint64) (errc int) {
stgo := syscall.Stat_t{}
if ^uint64(0) == fh {
path = filepath.Join(self.root, path)
errc = errno(syscall.Lstat(path, &stgo))
} else {
errc = errno(syscall.Fstat(int(fh), &stgo))
}
return
}
func (self *Ptfs) Mkdir(path string, mode uint32) (errc int) {
path = filepath.Join(self.root, path)
return errno(syscall.Mkdir(path, mode))
}
提供“-d”挂载选项我得到了这个额外的输出:
make dir... unique: 9, opcode: LOOKUP (1), nodeid: 1, insize: 48, pid: 27053 LOOKUP /testDir getattr /testDir unique: 9, error: -2 (No such file or directory), outsize: 16 unique: 7, opcode: GETATTR (3), nodeid: 1, insize: 56, pid: 27053 getattr / unique: 7, success, outsize: 136 unique: 2, opcode: DESTROY (38), nodeid: 1, insize: 40, pid: 27053 unique: 2, success, outsize: 16
dir "testDir" inside root dir in mountpoint 还不存在,所以我想 "No such file or directory" 是可以的。但即使在 "root" 目录的 GETATTR 的 "success" 之后,我仍然无法创建目录。我相信操作码 DESTROY 是通过延迟 host.Unmount().
引起的系统卸载获得的[编辑] 深入研究: func syscall.Lstat() 从 Getattr():
使用func Lstat(path string, stat *Stat_t) (err error) {
var _p0 *byte
_p0, err = BytePtrFromString(path)
if err != nil {
return
}
_, _, e1 := Syscall(SYS_LSTAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)
if e1 != 0 {
err = errnoErr(e1)
}
return
}
我的错误在于 Getattr() 函数的实现。有必要将统计信息正确地放入给定的 stat 指针结构中,而不是用 stat struct 而不是 given 重写另一个地址。通过指针正确填充给定的统计结构,它将按预期工作。