标签:filesystems fuse linux
我正在使用保险丝实现虚拟文件系统,并且需要对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;
}
我在自己的代码中进行了测试(我以前从未使用过偏移量),并且工作正常.
标签:filesystems,fuse,linux 来源: https://codeday.me/bug/20191029/1960990.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。