我正在使用保险丝实现虚拟文件系统,并且需要对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;
}
我在自己的代码中进行了测试(我以前从未使用过偏移量),并且工作正常.