Provided by: manpages-ru-dev_4.23.1-1_all bug

ИМЯ

       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;
           };

       Each  deduplication  operation targets src_length bytes in file descriptor dest_fd at offset dest_offset.
       The field reserved must be zero.  During the call, src_fd must be open for reading and  dest_fd  must  be
       open   for   writing.    The   combined   size   of   the   struct   file_dedupe_range   and  the  struct
       file_dedupe_range_info array must not exceed the system page size.  The maximum  size  of  src_length  is
       filesystem  dependent  and  is typically 16 MiB.  This limit will be enforced silently by the filesystem.
       By convention, the storage used by src_fd is mapped into dest_fd and the previous contents in dest_fd are
       freed.

       Upon successful completion of this ioctl, the number of bytes successfully deduplicated  is  returned  in
       bytes_deduped  and a status code for the deduplication operation is returned in status.  If even a single
       byte in the range does not match, the deduplication operation request will be ignored and status  set  to
       FILE_DEDUPE_RANGE_DIFFERS.   The  status  code  is  set to FILE_DEDUPE_RANGE_SAME for success, a negative
       error code in case of error, or FILE_DEDUPE_RANGE_DIFFERS if the data did not match.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

       В случае ошибки возвращается -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 находятся на разных смонтированных файловых системах.

ВЕРСИИ

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

СТАНДАРТЫ

       Linux.

ИСТОРИЯ

       Linux 4.5.

       It was previously known as BTRFS_IOC_FILE_EXTENT_SAME and was 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_fideduperange(2)