Copy/move FUSE 语义
Copy/move semantics on FUSE
我有一个带标签的哈希值数据库,我想为它实现一个 FUSE 接口。因为值是由它们的哈希值索引的,所以它们必须是只读的。
此数据库的本机界面非常简单:
- 您可以
download
、upload
或 tag
一个文件。
- 您可以获得所有定义的集合
tags
。
- 您可以
search
根据标签的布尔组合标记文件。
FUSE 接口语义很简单:
- 数据库被视为一个大的合成目录层次结构,其中值是由其哈希命名的文件,标签是目录。
cd
-ing 在目录中在语义上等同于给定标记的 search
(路径上的命名约定可用于实现布尔运算)。
read
-ing 文件在语义上等同于 download
(部分)值(FUSE 允许无状态 read
,因此 open
和 close
可以是空操作)。
- Copying/moving一个不存在的文件放到给定的路径下相当于
upload
和tag
而已。 Copying/moving 将现有文件放入给定路径相当于添加新的 tag
s.
- 任何其他操作都会引发错误。
这个 FUSE 接口非常有用,允许您轻松地将标签文件系统嵌入到分层系统中,而无需像 TagSpaces or Evernote.
这样的外部工具。
我的问题是从使用 FUSE 接口的任何其他禁止操作中识别文件 copy
或 move
:具有等效语义的操作有无限可能的组合。
使用 FUSE 接口识别文件 copy
或 move
的最可靠方法是什么?
通过实施 rename() fuse call. In this call, you will get path of both old and new location, so that you can check if the file comes from outside or not. That said, this would work only if user space tool renames a file by invoking rename(2) 内核调用挂钩文件重命名应该很简单。
另一方面,挂钩文件复制操作会更难:它不能直接完成,因为没有这样的保险丝调用 - 复制完全发生在用户 space 中,因此无法直接检测到内核 space.
您可以尝试做一些试探法并处理传入的融合操作来检测已存储文件的重命名(例如,通过散列新文件的内容并将其与现有文件进行比较),但我不确定多少它对你的情况有意义,或者它是否实际可行。
我有一个带标签的哈希值数据库,我想为它实现一个 FUSE 接口。因为值是由它们的哈希值索引的,所以它们必须是只读的。
此数据库的本机界面非常简单:
- 您可以
download
、upload
或tag
一个文件。 - 您可以获得所有定义的集合
tags
。 - 您可以
search
根据标签的布尔组合标记文件。
FUSE 接口语义很简单:
- 数据库被视为一个大的合成目录层次结构,其中值是由其哈希命名的文件,标签是目录。
cd
-ing 在目录中在语义上等同于给定标记的search
(路径上的命名约定可用于实现布尔运算)。read
-ing 文件在语义上等同于download
(部分)值(FUSE 允许无状态read
,因此open
和close
可以是空操作)。- Copying/moving一个不存在的文件放到给定的路径下相当于
upload
和tag
而已。 Copying/moving 将现有文件放入给定路径相当于添加新的tag
s. - 任何其他操作都会引发错误。
这个 FUSE 接口非常有用,允许您轻松地将标签文件系统嵌入到分层系统中,而无需像 TagSpaces or Evernote.
这样的外部工具。我的问题是从使用 FUSE 接口的任何其他禁止操作中识别文件 copy
或 move
:具有等效语义的操作有无限可能的组合。
使用 FUSE 接口识别文件 copy
或 move
的最可靠方法是什么?
通过实施 rename() fuse call. In this call, you will get path of both old and new location, so that you can check if the file comes from outside or not. That said, this would work only if user space tool renames a file by invoking rename(2) 内核调用挂钩文件重命名应该很简单。
另一方面,挂钩文件复制操作会更难:它不能直接完成,因为没有这样的保险丝调用 - 复制完全发生在用户 space 中,因此无法直接检测到内核 space.
您可以尝试做一些试探法并处理传入的融合操作来检测已存储文件的重命名(例如,通过散列新文件的内容并将其与现有文件进行比较),但我不确定多少它对你的情况有意义,或者它是否实际可行。