FUSE开放系统调用机制

时间:2015-08-25 19:09:09

标签: c linux filesystems fuse

当从程序调用{​​{1}}系统调用时,要在FUSE托管目录中创建一个空文件(带open),执行我的FUSE文件系统实现中的以下函数: / p>

  1. O_WRONLY | O_CREAT | O_TRUNC(由于文件不存在而返回错误)
  2. getattr
  3. create
  4. 我的问题是:

    这些函数调用是否对Linux中的所有文件系统(包括ext4等本机文件系统)或FUSE内部行为都是通用的?

    fgetattr程序中,我只能看到strace系统调用。

1 个答案:

答案 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内部结构更相关。我不知道确切的原因,但在执行mkdircreate等函数后,libfuse会执行lookup。请记住,getattr是高级API中的fgetattr(或stat创建的文件)。我认为这是由于文件/目录属性检查。

您可以在libfuse source code处查看创建功能的实际操作。

奖励:请记住,FUSE使用文件属性(和条目)缓存。如果将getattr挂载选项设置为0秒,则某些调用-o attr_timeout会将两个out提升到高级API。