ioctl_fideduperange(2)

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

LIBRARY
Standard C library (libc, -lc)

СИНТАКСИС
#include <linux/fs.h>      /* Definition of FIDEDUPERANGE and
                              FILE_DEDUPE_* constants*/
#include <sys/ioctl.h>

int ioctl(int src_fd, FIDEDUPERANGE, struct file_dedupe_range *arg);

ОПИСАНИЕ
Если файловая система поддерживает общее файловое физическое хранилище между несколькими файлами, то эту операцию ioctl(2) можно использовать для того, чтобы часть данных файла src_fd появилась в файле dest_fd в виде общего пространства на носителе, если данные файлов одинаковы («дедупликация», deduplication). Оба файла должны располагаться в одной файловой системе. Это сокращает затраты на место, позволяя хранить в файловой системе только одну копию данных.Если выполняется запись в эту общую область, то файловая система должна гарантировать, что изменения будут видны только в файле, в который производится запись. Такое поведение часто называют как «копирование при записи» (copy on write).

Данный ioctl выполняет операцию «сравнения и создания общей области при совпадении» с не более src_length байт из файлового дескриптора src_fd по смещению src_offset. Данная информация передаётся в структуре следующего вида:

    struct file_dedupe_range {
        __u64 src_offset;
        __u64 src_length;
        __u16 dest_count;
        __u16 reserved1;
        __u32 reserved2;
        struct file_dedupe_range_info info[0];
    };

Дедупликация атомарна для одновременной записи, поэтому для получения корректной дедуплицированной копии не нужно получать блокировки.

Поля reserved1 и reserved2 должны быть равны нулю.

Назначения для операции дедупликации передаются в массиве в конце структуры. Количество назначений задаётся в dest_count, а информация о назначении задаётся в следующем виде:

    struct file_dedupe_range_info {
        __s64 dest_fd;
        __u64 dest_offset;
        __u64 bytes_deduped;
        __s32 status;
        __u32 reserved;
    };

Целью каждой операции дедупликации является src_length байт в файловом дескрипторе dest_fd со смещением logical_offset. Поле reserved должно быть равно нулю.На момент вызова src_fd должен быть открыт на чтение и, dest_fd должен быть открыт на запись. Сумма размеров структуры file_dedupe_range и массива структур file_dedupe_range_info не должна превышать системный размер страницы. Максимальный размер src_length зависит от файловой системы и, обычно равен 16 МиБ. Это ограничение будет невидимо соблюдаться файловой системой. По соглашению, хранилище, используемое src_fd, отображается в dest_fd, а предыдущее содержимое в dest_fd освобождается.

При успешном выполнении ioctl в bytes_deduped возвращается количество дедуплицированных байт, а в status — код состояния операции дедупликации. Если не совпадает даже один байт из диапазона, то запрос дедупликации будет проигнорирован и status будет присвоено FILE_DEDUPE_RANGE_DIFFERS. При успешном выполнении код status изменяется на FILE_DEDUPE_RANGE_SAME, при ошибке — отрицательное значение кода, или FILE_DEDUPE_RANGE_DIFFERS, если данные не совпадают.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
В случае ошибки возвращается -1, а errno устанавливается в значение ошибки.

ОШИБКИ
Possible errors include (but are not limited to) the following:

EBADF
    Дескриптор src_fd не открыт на чтение; dest_fd не открыт на запись или открыт только для добавления; файловая система, в которой находится src_fd, не поддерживает дедупликацию.

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

EISDIR
    Один из файлов является каталогом и файловая система не поддерживает диапазоны для каталогов.

ENOMEM
    Ядро не смогло выделить достаточно памяти для выполнения операции или размер dest_count слишком большой из-за того, что описание входного аргумента занимает больше одной страницы в памяти.

EOPNOTSUPP
    Может возникать, если файловая система не поддерживает дедупликацию для файловых дескрипторов или когда файловый дескриптор ссылается на специальные иноды.

EPERM
    Дескриптор dest_fd является неизменным.

ETXTBSY
    Один из файлов является файлом подкачки. Файлы подкачки не могут содержаться в совместных хранилищах.

EXDEV
    Дескрипторы dest_fd и src_fd находятся на разных смонтированных файловых системах.

ВЕРСИИ
Данная операция ioctl появилась в Linux 4.5. Раньше она называлась BTRFS_IOC_FILE_EXTENT_SAME и работала только в 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.