Реализация асинхронной файловой системы с FUSE в Linux - PullRequest
7 голосов
/ 25 января 2011

Я пытался спросить в списке рассылки FUSE, но пока не получил никакого ответа ... У меня есть пара вопросов.Я собираюсь реализовать низкоуровневую файловую систему FUSE и наблюдать за дескриптором fuse_chan с помощью epoll.

  1. Мне нужно подделать inode для всех объектов в моей файловой системе.?Существуют ли правила выбора inode для объектов в VFS (например, должен ли я использовать только положительные значения или я могу использовать значения в некотором диапазоне)?

  2. Можно ли сделать дескриптор fuse_chan неблокирующим?Если да, скажите, пожалуйста, могу ли я предположить, что fuse_chan_recv() / fuse_chan_send() получит / отправит всю структуру запроса, или мне нужно переопределить их функциями, обрабатывающими частичную отправку и получение?

  3. А как насчет buffer size?Я вижу, что в fuse_loop() новый буфер выделяется для каждого вызова, поэтому я предполагаю, что размер буфера не является фиксированным.Однако, может быть, есть какой-то максимально возможный размер буфера?Затем я могу выделить больший буфер и сократить операции выделения памяти.

1 Ответ

2 голосов
/ 13 июля 2011

(1) Иноды определяются как целые числа без знака, поэтому теоретически вы можете использовать любые значения. Тем не менее, поскольку могут быть программы, которые не являются осторожными, я буду рисковать и использовать только ненулевые положительные целые числа вплоть до INT_MAX.

(2) Fuse использует специальное устройство ядра. Хотя fuse_chan_recv () не поддерживает частичное чтение, это может не потребоваться, так как ядро ​​в любом случае не должно возвращать частичные пакеты.

(3) Имена файлов в Linux - максимум 4096 символов. Это накладывает ограничение на размер буфера:

$ grep PATH_MAX /usr/include/linux/limits.h
#define PATH_MAX        4096    /* # chars in a path name including nul */
...