23 июля 2010 г.

fuse_operations::flush и реальность

В библиотеке FUSE (Filesystem in userspace) есть обработчики flush и release. Судя по описанию, обработчик flush вызывается, когда происходит системный вызов close() для файлового дескриптора. То есть сколько раз вызывался open() для файла, столько же раз будет вызван close() и, соответственно, flush. А release вызывается всего один раз, когда в системе не осталось больше ни одного открытого дескриптора этого файла.

В описании fuse_operations::flush есть небольшое примечание:
NOTE:The flush() method may be called more than once for each open(). (...) It is not possible to determine if a flush is final, so each flush should be treated equally. Multiple write-flush sequences are relatively rare, so this shouldn't be a problem.

На деле оказывается, что первый же вызов команды echo с выводом результата в файл (например, "echo blablabla >./1.txt") приводит к следующей последовательности вызовов обработчиков: create - flush - write - flush - release. То есть flush вызывается два раза, причем один раз до записи данных в файл, а второй раз — после. Получается, что корректно закрыть файловый дескриптор в обработчике flush невозможно.

Как с этим бороться — непонятно. Можно, конечно, отказаться от поддержки команд, которые приводят к "multiple write-flush sequences", но так поступать не очень хочется. Поэтому пока реализовал извращение в обработчике release, чтобы хоть как-то обойти проблему двойного вызова flush, а обработчик flush остаётся пустой, потому что при таком раскладе он совершенно бесполезен.

Комментариев нет:

Отправить комментарий