当从程序调用{{1}}系统调用时,要在FUSE托管目录中创建一个空文件(带open
),执行我的FUSE文件系统实现中的以下函数: / p>
O_WRONLY | O_CREAT | O_TRUNC
(由于文件不存在而返回错误)getattr
create
我的问题是:
这些函数调用是否对Linux中的所有文件系统(包括ext4等本机文件系统)或FUSE内部行为都是通用的?
在fgetattr
程序中,我只能看到strace
系统调用。
答案 0 :(得分:3)
经过几天的研究和盯着Linux内核和FUSE源代码,我明白了发生了什么。
首先,我必须说release
执行fgetattr
系统调用后open
执行close
,但调用strace
时。所以我编辑了我的问题以删除它。
好吧,我的主要问题是open
向我展示了对lookup
系统调用的调用,但我的FUSE程序日志显示已执行了三个函数。因此我对其他文件系统的问题。
在Linux kernel documentation中我们可以看到内核VFS详细解释:
要查找inode,需要VFS调用lookup()方法 父目录inode。此方法由具体安装 inode所在的文件系统实现。一旦VFS有 所需的dentry(以及inode),我们可以做所有那些无聊的事情 比如open(2)文件或stat(2)
在FUSE文件系统中,这意味着在低级API中调用getattr
,或在高级API中调用mkdir
(因为inode-path转换由libfuse处理)。用户名代码。其他系统调用(例如open
或带有O_CREAT
标记的lookup
也需要lookup
,在这种情况下确认否定dentry 任何东西。第1点已解决。
你得到的dentry不应该有一个inode(即它应该是负的dentry)。
在内核中实现的文件系统(如ext4)也会将其功能执行到strace
。但是你无法通过常见的工具(例如fgetattr
)从外部看到它们(你需要像kernelshark这样的东西,很棒的东西)。
请参阅ext4 lookup function(我正在运行Linux 3.13内核)
第3点的lookup
函数调用与libfuse内部结构更相关。我不知道确切的原因,但在执行mkdir
或create
等函数后,libfuse会执行lookup
。请记住,getattr
是高级API中的fgetattr
(或stat
创建的文件)。我认为这是由于文件/目录属性检查。
您可以在libfuse source code处查看创建功能的实际操作。
奖励:请记住,FUSE使用文件属性(和条目)缓存。如果将getattr
挂载选项设置为0秒,则某些调用-o attr_timeout
会将两个out
提升到高级API。