Угорел по криптоонанизму и снова засел за сабж. Набросал структурку для метаданных:
directory metadata block:
4 bytes: "ABJU"
1 byte: version
3 bytes: reserved
4 bytes: number of directory entries in this block
directory entry:
1 byte: type (file, directory)
1 byte: storage method (plain file, extended shit (fragmented file, crypted shit, etc))
2 bytes: reserved
20 bytes: sha1 of the linked file
asciiz: file name ("." for the next block of this directory, ".." for the first block of the parent directory)
4 bytes: file storage plugin ID (local file, remote file plugins for different hosting types (there would be a global database on these; don't forget to allocate some address space for private plugins))
asciiz: file link (plugin-specific; just a path for local files)
TBD: more metadata? (perms and stuff)
Грустно то, что придётся обновлять кучу фигни в случае, когда мы меняем небольшой кусочек глубоко закопанного файла, поскольку блоки у нас, как правило, write-once. Но основной юзкейс abusefs предполагает, что метаданные хранятся таки локально, что облегчает проблему.
Собственно, от каждого плагина должны быть как минимум дёргалки для получения максимального размера для сохраняемого в них блока, максимальной длины получаемого линка, создания нового блока и чтения существующего. Дополнительно в зависимости от того, что может underlying medium, может быть реализована всякая няшнота вроде проверки хеша серверсайд, проверки существования, чтения определённого куска блока, удаления блока, перезаписи блока.
Какашки приветствуются.
