IOCTL-FICLONERANGE(2) Руководство программиста Linux IOCTL-FICLONERANGE(2)

ИМЯ

ioctl_ficlonerange, ioctl_ficlone - сделать некоторые данные одного файла общими с другим файлом

ОБЗОР

#include <sys/ioctl.h> #include <linux/fs.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 устанавливается в значение ошибки.

ОШИБКИ

Возможные коды ошибок (помимо прочих):

Дескриптор src_fd не открыт на чтение; dest_fd не открыт на запись или открыт только для добавления; файловая система, в которой находится src_fd, не поддерживает reflink.
Файловая система не поддерживает создание ссылок диапазонов в заданных файлах. Эта ошибка также может возникнуть, если файловый дескриптор представляет устройство, FIFO или сокет. Обычно, для дисковых файловых систем требуются, чтобы аргументы смещения и длины были выровнены по основному размеру блока. В XFS и Btrfs нет поддержки ссылок перекрывающихся диапазонов в одном и том же файле.
Один из файлов является каталогом и файловая система не поддерживает диапазоны для каталогов.
Может возникать, если файловая система не поддерживает ссылки для файловых дескрипторов или когда файловый дескриптор ссылается на специальные иноды.
Дескриптор dest_fd является неизменным.
Один из файлов является файлом подкачки. Файлы подкачки не могут содержаться в совместных хранилищах.
Дескрипторы dest_fd и src_fd находятся на разных смонтированных файловых системах.

ВЕРСИИ

Данные операции ioctl появились в Linux 4.5. Раньше они назывались BTRFS_IOC_CLONE и BTRFS_IOC_CLONE_RANGE и работали только в Btrfs.

СООТВЕТСТВИЕ СТАНДАРТАМ

Данный программный интерфейс существует только в Linux.

ЗАМЕЧАНИЯ

Так как для операции копирования-при-записи требуется выделение нового пространства в хранилище, операция fallocate(2) может отменить совместное использование общих блоков для гарантии того, что последующие операции записи не завершатся ошибкой из-за нехватки места на диске.

СМОТРИТЕ ТАКЖЕ

ioctl(2)

2017-09-15 Linux