2017-05-26 47 views
0

我有一個包含標籤的散列值數據庫,我想爲它實現一個FUSE接口。由於值通過哈希值進行索引,因此它們必須是隻讀的。在FUSE上覆制/移動語義

此數據庫的原生界面非常簡單:

  • 您可以downloaduploadtag文件。
  • 您可以獲得所有定義的集合tags
  • 對於按照布爾標籤組合標記的文件,您可以使用search

FUSE接口語義很簡單:

  • 數據庫被視爲一個大的合成目錄層次結構中的值是通過其散列命名的文件和標籤的目錄。
  • cd對於給定標記(路徑上的命名約定可用於實現布爾操作),目錄內的語義等價於search
  • read -ing一個文件是語義上等同於一個值(FUSE允許無國籍readopen所以和close可以是空操作)download(的一部分)。
  • 將不存在的文件複製/移動到給定路徑中相當於uploadtag它。將現有文件複製/移動到給定路徑相當於添加新的tag s。
  • 其他任何操作都會引發錯誤。

這FUSE接口是非常有好處的,讓您輕鬆嵌入一個層次一個內部的標記文件系統,而無需像TagSpacesEvernote需要的外部工具。

我的問題出現在使用FUSE接口的任何其他禁止操作中識別文件copymove:操作與等效語義有無盡的可能組合。

用FUSE接口識別文件copymove最可靠的方法是什麼?

回答

0

通過實施rename() fuse call,掛接文件的重命名應該很簡單。在這個調用中,您將獲得舊地址和新地址的路徑,以便您可以檢查文件是否來自外部。也就是說,這隻有在用戶空間工具通過調用內核調用rename(2)來重命名文件時才起作用。另一方面,掛鉤文件複製操作將更加困難:由於不存在這樣的熔絲調用,所以不能直接完成 - 複製發生在用戶空間中,因此在內核空間中不能直接檢測到。

你可以嘗試做一些啓發式操作並處理傳入的熔絲操作,以檢測已存儲文件的重命名(例如,通過散列新文件的內容並將其與已有文件進行比較),但我不確定它有多少在你的情況下是有道理的,或者如果它實際上是實際的。