2

我正在 python 开发 fuse fs(使用 fuse-python 绑定)。我需要什么方法才能正确实现该触摸?目前我有下一个输出:


$ touch m/My\ files/d3elete1.me 
touch: setting times of `m/My files/d3elete1.me': Invalid argument

文件存在“d3elete1.me”:


$ ls -l m/My\ files/d3elete1.me 
-rw-rw-rw- 1 root root 0 Jul 28 15:28 m/My files/d3elete1.me

我也试图跟踪系统调用:


$ strace touch m/My\ files/d3elete1.me
...
open("m/My files/d3elete1.me", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK|O_LARGEFILE, 0666) = 3
dup2(3, 0)                              = 0
close(3)                                = 0
utimensat(0, NULL, NULL, 0)             = -1 EINVAL (Invalid argument)
close(0)                                = 0
...

如您所见,utimensat失败了。我试图实现空的 utimensutime但它甚至没有被调用。

4

2 回答 2

2

尝试使用 -f 选项启动 fuse。保险丝将留在前台,您可以在控制台中看到错误。

于 2010-07-28T13:24:22.980 回答
1

您必须实施utimensand getattr。并非所有系统调用都必须直接映射到您可能期望的 C 调用。其中许多由 FUSE 在内部用于检查和导航您的文件系统,具体取决于设置的 FUSE 选项。

我相信在您的情况下, FUSE 在它的解释之前是utimesatto utimens,并getattr检查以验证请求的文件是否存在,并且具有预期的属性。

更新0

这是一个很大的巧合。下面有一条评论建议该问题与 FUSE 不支持的事实有关utimensat。事实并非如此。我在 Ubuntu 10.04 上使用 fuse-python 时提供了完全相同的回溯。我戳了一下,似乎 fuse-python 0.2 绑定是针对 FUSE 2.6 的,可能是一个细微的变化引入了这个错误(FUSE 现在是 2.8 版)。我的解决方案是停止使用 fuse-python (代码是一个丑陋的烂摊子),我找到了一个替代绑定fusepy。我没有回头,从那以后也没有任何麻烦。

我强烈建议您看一下,您的初始化代码会更干净,并且需要进行最少的更改以适应新的绑定。最重要的是,它只有一个模块,而且易于阅读。

于 2010-07-28T13:20:56.847 回答