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

ИМЯ

       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)