Provided by: manpages-ru-dev_4.23.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 находятся на разных смонтированных файловых системах.

СТАНДАРТЫ

       Linux.

ИСТОРИЯ

       Linux 4.5.

       They were previously known as BTRFS_IOC_CLONE and BTRFS_IOC_CLONE_RANGE, and were private to Btrfs.

ПРИМЕЧАНИЯ

       Так как для операции копирования-при-записи требуется выделение нового пространства в хранилище, операция
       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 (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html  версии  3  или
       более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.

       Если  вы  обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом
       разработчику по его адресу электронной почты или по адресу списка рассылки русских переводчиков.

Linux man-pages 6.8                               2 мая 2024 г.                            ioctl_ficlonerange(2)