Provided by: manpages-ru-dev_4.18.1-1_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 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ или более позднюю, чтобы
       узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

       Если  вы  обнаружите  ошибки  в  переводе этой страницы руководства, пожалуйста, отправьте
       электронное письмо на ⟨man-pages-ru-talks@lists.sourceforge.net⟩.