2014-02-03 2 views
2

Есть ли способ безопасно использовать ненулевые тайм-ауты в файловых системах без чтения? Кажется, я не могу найти его. Пара встречных примеров:Как использовать entry_timeout и attr_timeout в низкоуровневом API FUSE/OSXFUSE?

Пример Один (ненулевой отрицательной тайм-аута входа):

  1. приложение вызывает стат() и получает ENOENT;
  2. вызывает create();
  3. вызывает stat(), ожидая успеха, но вместо этого получает ENOENT из-за отрицательного таймаута входа, поэтому он завершает, что FS сломан/несогласован/etc.

Пример второй (ненулевой атр тайм-аут):

  1. Приложение вызывает utimes();
  2. вызывает stat(), но получает устаревшие значения и завершает, что FS сломан/несогласован/etc.

Я не могу придумать контрпример для положительного тайм-аута входа - кажется, что даже если поиск() возвращает некоторый затхлый инод, файловая система все еще может вернуться ENOENT для последующего GetAttr() вызова.

Но как насчет вышеуказанных 2 примеров?

ответ

2

Только для справки, тот же вопрос был отправлен на FUSE mailing list.

Вот почему answer from Kyle Lippincott ненулевая таймауты работа:

Если создать() проходит через ядро, оно аннулирует отрицательный таймаут входа. Если создание происходит извне, то время ожидания сохраняется.

Цитирование Goswin фон Brederlow когда ненулевые таймауты проблема:

Кэширование работает только правильно, если вы реализуете файловой системы диска на основе, один, где только процесс предохранитель может изменять метаданные и все доступ идет только через плавкий предохранитель. Любая файловая система с перекрытием, где что-то может изменить , базовая файловая система, не проходя через плавкий предохранитель, может столкнуться с несоответствиями .

Так что, если вы, например. создавая сетевую файловую систему, которая позволяет нескольким хостам изменять данные, которые могут возникнуть при отсутствии ненужных тайм-аутов.

Смежные вопросы