在FUSE上复制/移动语义

时间:2017-05-26 18:29:26

标签: fuse

我有一个带标签的哈希值数据库,我想为它实现一个FUSE接口。因为值是由它们的哈希值索引的,所以它们必须是只读的。

此数据库的本机接口非常简单:

  • 您可以downloaduploadtag文件。
  • 您可以获取所有定义的tags
  • 您可以search查看根据布尔组合标记标记的文件。

FUSE接口语义很简单:

  • 数据库被视为一个大型合成目录层次结构,其中值是由其哈希命名的文件,而标记是目录。
  • cd - 对于给定标记,目录内部在语义上等同于search(路径上的命名约定可用于实现布尔操作)。
  • read - 文件在语义上等同于download(部分)值(FUSE允许无状态read,因此openclose可以是无操作的。)
  • 将不存在的文件复制/移动到给定路径等同于uploadtag。将现有文件复制/移动到给定路径等同于添加新tag s。
  • 任何其他操作都会抛出错误。

此FUSE界面非常实用,您可以轻松地将标记文件系统嵌入到分层文件系统中,而无需使用TagSpacesEvernote等外部工具。

我的问题出现了使用FUSE接口从任何其他禁止操作中识别文件copymove:有无穷无尽的操作组合和等效语义。

使用FUSE界面识别文件copymove的最可靠方法是什么?

1 个答案:

答案 0 :(得分:1)

通过实施rename() fuse call,可以直接挂钩文件的重命名。在此调用中,您将获得旧位置和新位置的路径,以便您可以检查文件是否来自外部。也就是说,只有当用户空间工具通过调用rename(2)内核调用重命名文件时,这才有效。

另一方面,挂钩文件复制操作会更难:它不能直接完成,因为没有这样的熔丝调用 - 复制完全发生在用户空间中,因此在内核空间中无法直接检测到。

您可以尝试进行一些启发式操作并处理传入的熔丝操作以检测已存储文件的重命名(例如,通过散列新文件的内容并将其与现有文件进行比较),但我不确定它是多少在你的情况下是否有意义,或者它是否实际可行。