保险丝:在readdir中设置填充函数的偏移量

我正在使用保险丝实现虚拟文件系统,并且需要对readdir中的offset参数有一些了解.

之前我们忽略了偏移量,并在填充函数中传递了0,在这种情况下,内核应注意.

我们的文件系统数据库正在存储:目录名,文件长度,索引节点号和父索引节点号.

我如何计算得到的偏移量?

那么,每个组件的偏移量是否等于其大小,以其inode号的增量形式排序?如果目录中存在目录,会发生什么情况?在这种情况下,偏移量等于内部文件的总和吗?

Example: in case the dir listing is - a.txt b.txt c.txt
And inode number of a.txt=3, b.txt=5, c.txt=7

Offset of a.txt= directory offset
Offset of b.txt=dir offset + size of a.txt
Offset of c.txt=dir offset + size of b.txt

以上假设正确吗?

PS:Here are the callbacks of fuse

解决方法:

传递给填充函数的偏移量是目录中下一项的偏移量.您可以按任意顺序在目录中输入条目.如果您不想一次返回整个目录,则需要使用偏移量来确定要查询和存储的内容.目录中项目的顺序取决于您,而名称或索引节点或其他任何顺序无关紧要.

具体来说,在readdir调用中,将传递一个偏移量.您要开始使用此回调或更晚版本的条目来调用填充函数.在最简单的情况下,每个条目的长度为24字节strlen(条目名称),四舍五入到最接近的8字节倍数.但是,如果不是这种情况,请参见http://sourceforge.net/projects/fuse/处的保险丝源代码.

我有一个简单的示例,在我的readdir函数中有一个循环(伪C代码):

int my_readdir(const char *path, void *buf, fuse_fill_dir_t filler, off_t offset, struct fuse_file_info *fi)
{
   (a bunch of prep work has been omitted)
   struct stat st;
   int off, nextoff=0, lenentry, i;
   char namebuf[(long enough for any one name)];

   for (i=0; i<NumDirectoryEntries; i++)
   {
      (fill st with the stat information, including inode, etc.)
      (fill namebuf with the name of the directory entry)
      lenentry = ((24+strlen(namebuf)+7)&~7);
      off = nextoff; /* offset of this entry */
      nextoff += lenentry;
      /* Skip this entry if we weren't asked for it */
      if (off<offset)
         continue;
      /* Add this to our response until we are asked to stop */
      if (filler(buf, namebuf, &st, nextoff))
         break;
   }
   /* All done because we were asked to stop or because we finished */
   return 0;
}

我在自己的代码中进行了测试(我以前从未使用过偏移量),并且工作正常.

上一篇:关于在c中实现FUSE文件系统的说明


下一篇:c – 如何在使用g编译器时使用c样式初始化结构?