gpt4 book ai didi

go - FUSE - 避免在 GetAttr 中计算大小

转载 作者:IT王子 更新时间:2023-10-29 00:47:53 25 4
gpt4 key购买 nike

我正在为远程服务实现 FUSE 文件系统。当用户打开文件时,我会进行网络调用以获取文件的内容。 It appears必须通过 GetAttr 报告文件大小才能打开。
为了知道文件的大小,我必须发出网络调用,并且由于在执行 ls 时会为每个条目调用 GetAttr,所以我很担心这种设计(如果用户在包含许多项目的目录中执行 ls,它将必须获取所有文件,即使用户不想打开其中任何一个。

我该如何解决这个问题?我的想法是:

  • 使用不依赖于报告大小的较低级别的读取方法?我认为使用 Read 而不是 Open 会有所帮助,但是如果没有大小我就无法让它工作。
  • 如果我可以区分源自 OpenGetAttr 调用与其他调用(包括 ls),我可以仅在以下情况下发出网络调用需要。

我使用 Go 和 go-fuse ,但我认为这无关紧要,因为这是一个一般的 FUSE 问题。

此外,FUSE 文档是非常少的(实际上缺失的)文档。如果熟悉此事的人可以解释 lscdcat 的调用流程,那就太好了——调用了哪些 FUSE 函数订单。
比如为什么既有Open又有Read

更新:
我一直在浏览 SSHFS,它被认为是 FUSE 文件系统的典型示例,它似乎也在 getattr 上通过网络获取文件:https://github.com/libfuse/sshfs/blob/master/sshfs.c#L3167
你怎么看?

最佳答案

您看到的问题是因为内核正在缓冲您的读取,当它这样做时,它使用 inode 的大小来准确计算它必须复制到用户空间的字节数 (https://elixir.bootlin.com/linux/v4.19.7/source/mm/filemap.c#L2137)。所以有不同的解决方法:

  1. 从 GetAttr 返回巨大的 st_size

  2. 打开文件时,设置 direct_io 标志,这样您就不会使用页面缓存。

关于go - FUSE - 避免在 GetAttr 中计算大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46267972/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com