osxfuse cgofuse mkdir输入/输出错误

时间:2018-02-16 14:00:00

标签: go system-calls fuse osxfuse

使用cgofuse时我无法使用os.Mkdir在已安装的fs中创建dir:

  

恐慌:mkdir mp / testDir:输入/输出错误

代码:

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"挂载选项我得到这个额外的输出:

  

制作dir ......   唯一:9,操作码:LOOKUP(1),nodeid:1,insize:48,pid:27053   LOOKUP / testDir   getattr / testDir      唯一:9,错误:-2(没有这样的文件或目录),超大:16   唯一:7,操作​​码:GETATTR(3),nodeid:1,insize:56,pid:27053   getattr /      独特:7,成功,超大:136   唯一:2,操作码:DESTROY(38),nodeid:1,insize:40,pid:27053      独特:2,成功,超大:16

dir" testDir" mountpoint里面的根目录还没有存在,所以我想"没有这样的文件或目录"没关系。但即使在"成功" GETATTR of" root"我仍然无法创建目录。 Opcode 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
}

1 个答案:

答案 0 :(得分:0)

我的错误在于Getattr()函数实现。有必要正确地将stats放在给定的stat指针结构中,而不是用stat struct而不是给定重写另一个地址。通过指针正确填充给定的stat结构,它将按预期工作。