Provided by: manpages-ru-dev_4.21.0-2_all 

ИМЯ
ioctl_ficlonerange, ioctl_ficlone - сделать некоторые данные одного файла общими с другим файлом
LIBRARY
Standard C library (libc, -lc)
СИНТАКСИС
#include <linux/fs.h> /* определения констант FICLONE* */
#include <sys/ioctl.h>
int ioctl(int dest_fd, FICLONERANGE, struct file_clone_range *arg);
int ioctl(int dest_fd, FICLONE, int src_fd);
ОПИСАНИЕ
Если файловая система поддерживает общее файловое физическое хранилище для файлов («reflink»), то эту
операцию ioctl(2) можно использовать для того, чтобы часть данных файла src_fd появилась в файле dest_fd
в виде общего пространства на носителе, что быстрее по сравнению с созданием отдельной физической копии
данных. Оба файла должны располагаться в одной файловой системе. Если выполняется запись в эту общую
область, то файловая система должна гарантировать, что изменения будут видны только в файле, в который
производится запись. Такое поведение часто называют как «копирование при записи» (copy on write).
Данный ioctl создаёт ссылку (reflink) на не более src_length байт из файлового дескриптора src_fd по
смещению src_offset в файл dest_fd по смещению dest_offset, предоставляя её обоим файлам. Если src_length
равно нулю, то ioctl делает ссылку на конец файла-источника. Данная информация передаётся в структуре
следующего вида:
struct file_clone_range {
__s64 src_fd;
__u64 src_offset;
__u64 src_length;
__u64 dest_offset;
};
Клоны атомарны для одновременной записи, поэтому для получения корректной копии не нужно получать
блокировки.
Операция FICLONE ioctl клонирует файлы полностью.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
В случае ошибки возвращается -1, а errno устанавливается в значение ошибки.
ОШИБКИ
Возможные коды ошибок (помимо прочих):
EBADF Дескриптор src_fd не открыт на чтение; dest_fd не открыт на запись или открыт только для
добавления; файловая система, в которой находится src_fd, не поддерживает reflink.
EINVAL Файловая система не поддерживает создание ссылок диапазонов в заданных файлах. Эта ошибка также
может возникнуть, если файловый дескриптор представляет устройство, FIFO или сокет. Обычно, для
дисковых файловых систем требуются, чтобы аргументы смещения и длины были выровнены по основному
размеру блока. В XFS и Btrfs нет поддержки ссылок перекрывающихся диапазонов в одном и том же
файле.
EISDIR Один из файлов является каталогом и файловая система не поддерживает диапазоны для каталогов.
EOPNOTSUPP
Может возникать, если файловая система не поддерживает ссылки для файловых дескрипторов или когда
файловый дескриптор ссылается на специальные иноды.
EPERM Дескриптор dest_fd является неизменным.
ETXTBSY
Один из файлов является файлом подкачки. Файлы подкачки не могут содержаться в совместных
хранилищах.
EXDEV Дескрипторы dest_fd и src_fd находятся на разных смонтированных файловых системах.
ВЕРСИИ
Данные операции ioctl появились в Linux 4.5. Раньше они назывались BTRFS_IOC_CLONE и
BTRFS_IOC_CLONE_RANGE и работали только в Btrfs.
СТАНДАРТЫ
Данный программный интерфейс существует только в Linux.
ЗАМЕЧАНИЯ
Так как для операции копирования-при-записи требуется выделение нового пространства в хранилище, операция
fallocate(2) может отменить совместное использование общих блоков для гарантии того, что последующие
операции записи не завершатся ошибкой из-за нехватки места на диске.
СМ. ТАКЖЕ
ioctl(2)
ПЕРЕВОД
Русский перевод этой страницы руководства был сделан Azamat Hackimov <azamat.hackimov@gmail.com>, Dmitriy
S. Seregin <dseregin@59.ru>, Yuri Kozlov <yuray@komyakino.ru> и Иван Павлов <pavia00@gmail.com>
Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3
или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.
Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо
на man-pages-ru-talks@lists.sourceforge.net.
Linux man-pages 6.03 30 октября 2022 г. ioctl_ficlonerange(2)