table of contents
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.
ОШИБКИ¶
- 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.
СМОТРИТЕ ТАКЖЕ¶
2012-04-23 | Linux |