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.

ОШИБКИ

EBADF
    fd не является допустимым файловым дескриптором или не открыт на запись.

EFBIG
    Сумма offset+len превышает максимальный размер файла.

EINTR
    При выполнении поступил сигнал.

EINVAL
    offset меньше 0, или len меньше или равна 0.

EIO При чтении или записи в файловую систему произошла ошибка ввода-вывода.

ENODEV
    fd не указывает на обычный файл или каталог. (Если fd — канал или FIFO, то возникнет другая ошибка.)

ENOSPC
    Недостаточно дискового пространства на устройстве, на котором расположен файл, указанный в fd.

ENOSYS
    В данном ядре вызов fallocate() не реализован.

EOPNOTSUPP
    Файловая система с файлом, на который указывает fd, не поддерживает данную операцию; или значение mode не поддерживается файловой системой, в которой находится файл, на который указывает fd.

EPERM
    Файл, на который ссылается fd, помечен как неизменяемый (immutable) (см. chattr(1)). Или: в mode указан флаг FALLOC_FL_PUNCH_HOLE и файл, на который ссылается fd, помечена как только для добавления (см. chattr(1)).

ESPIPE
    Значение fd указывает на канал или FIFO.

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

СООТВЕТСТВИЕ СТАНДАРТАМ
fallocate() есть только в Linux.

СМОТРИТЕ ТАКЖЕ
ftruncate(2), posix_fadvise(3), posix_fallocate(3)