Scroll to navigation

FALLOCATE(2) Руководство программиста Linux FALLOCATE(2)

ИМЯ

fallocate - управляет пространством файла

ОБЗОР

#define _GNU_SOURCE             /* Смотрите feature_test_macros(7) */
#include <fcntl.h>
int fallocate(int fd, int mode, off_t offset, off_t len);

ОПИСАНИЕ

Это непереносимый системный вызов, существующий только в Linux. В POSIX.1 есть переносимый метод, обеспечивающий выделения пространства под файл (см. posix_fallocate(3)).

fallocate() позволяет вызывающему напрямую управлять выделенным дисковым пространством файла, на который указывает fd, определённого байтового диапазона, начинающегося с offset и имеющего длину len байт.

В аргументе mode задаётся операция, выполняемая над указанным диапазоном. Детали о поддерживаемых операциях представлены в подразделах далее.

Выделение дискового пространства

Операция по умолчанию (т.е., значение mode равно нулю) выделяет и инициализирует нулями место на диске в диапазоне, задаваемом offset и len. Размер файла (полученный через stat(2)) будет изменён, если offset+len больше чем размер файла. Такое поведение по умолчанию очень напоминает поведение библиотечной функции posix_fallocate(3), и служит для оптимальной реализации этой функции.

После успешного завершения вызова последующие операции записи в диапазон, указанный offset и len, гарантированно не завершатся с ошибкой из-за нехватки места на диске.

Если в mode указан флаг FALLOC_FL_KEEP_SIZE, то поведение по умолчанию почти то же, но размер файла не изменяется даже если offset+len больше чем размер файла. Предварительное заполнение нулями блоков за концом файла полезно для оптимизации дополнительной нагрузки.

Так как выделение выполняется кусками размером с блок, fallocate() может выделить больший диапазон дискового пространства, чем было указано.

Освобождение файлового пространства

Указание флага FALLOC_FL_PUNCH_HOLE flag (доступен, начиная с Linux 2.6.38) в mode освобождает пространство (т.е., создаёт дыру) в диапазоне начиная с offset и до len байт. Внутри заданного диапазона, частичные блоки файловой системы заполняются нулями, а полные блоки файловой системы удаляются из файла. После успешного завершения вызова, последующие операции чтения из этого диапазона вернут нули.

Флаг FALLOC_FL_PUNCH_HOLE должен быть сложен (OR) с флагом FALLOC_FL_KEEP_SIZE в mode; другими словами, даже когда пробивание (punching) выходит за конец файла, размер файла (получаемый с помощью stat(2)) остаётся неизменным.

Не все файловые системы поддерживают FALLOC_FL_PUNCH_HOLE; если файловая система не поддерживает эту операцию, то возвращается ошибка.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

При успешном выполнении функции fallocate() возвращается 0. В случае ошибки возвращается -1.

ОШИБКИ

fd не является допустимым файловым дескриптором или не открыт на запись.
Сумма offset+len превышает максимальный размер файла.
При выполнении поступил сигнал.
offset меньше 0, или len меньше или равна 0.
При чтении или записи в файловую систему произошла ошибка ввода-вывода.
fd не указывает на обычный файл или каталог. (Если fd — канал или FIFO, то возникнет другая ошибка.)
Недостаточно дискового пространства на устройстве, на котором расположен файл, указанный в fd.
В данном ядре вызов fallocate() не реализован.
Файловая система с файлом, на который указывает fd, не поддерживает данную операцию; или значение mode не поддерживается файловой системой, в которой находится файл, на который указывает fd.
Файл, на который ссылается fd, помечен как неизменяемый (immutable) (см. chattr(1)). Или: в mode указан флаг FALLOC_FL_PUNCH_HOLE и файл, на который ссылается fd, помечена как только для добавления (см. chattr(1)).
Значение fd указывает на канал или FIFO.

ВЕРСИИ

fallocate() доступен в Linux начиная с ядра 2.6.23. Поддержка в glibc добавлена в версии 2.10.

СООТВЕТСТВИЕ СТАНДАРТАМ

fallocate() есть только в Linux.

СМОТРИТЕ ТАКЖЕ

ftruncate(2), posix_fadvise(3), posix_fallocate(3)

2012-04-23 Linux