融合utimensat问题

时间:2010-07-28 12:36:29

标签: python linux filesystems fuse

我正在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 失败。我试图实现空 utimens utime ,但它甚至都没有被调用。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

我相信你的情况FUSE在utimesatutimens的解释之前,用getattr检查以验证所请求的文件是否存在,并且具有预期的属性。< / p>

Update0

这是一个很大的巧合。以下评论建议该问题与FUSE不支持utimensat的事实相符。这不是的情况。我在Ubuntu 10.04上使用fuse-python时提供了完全相同的回溯。我捅了一下,看起来fuse-python 0.2绑定是针对FUSE 2.6的,可能是稍微改变引入了这个错误(FUSE现在是2.8版本)。我的解决方案是停止使用fuse-python(代码是一个丑陋的混乱),我找到了一个替代绑定fusepy。我没有回头,从此没有遇到任何麻烦。

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