table of contents
- bookworm 4.18.1-1
- bookworm-backports 4.25.1-1~bpo12+1
ioctl_fideduperange(2) | System Calls Manual | ioctl_fideduperange(2) |
НАИМЕНОВАНИЕ¶
ioctl_ficlonerange - сделать некоторые данные одного файла общими с другим файлом
БИБЛИОТЕКА¶
Стандартная библиотека языка C (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.
При успешном выполнении ioctl в bytes_deduped возвращается количество дедуплицированных байт, а в status — код состояния операции дедупликации. Если не совпадает даже один байт из диапазона, то запрос дедупликации будет проигнорирован и status будет присвоено FILE_DEDUPE_RANGE_DIFFERS. При успешном выполнении код status изменяется на FILE_DEDUPE_RANGE_SAME, при ошибке — отрицательное значение кода, или FILE_DEDUPE_RANGE_DIFFERS, если данные не совпадают.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ¶
В случае ошибки возвращается -1, а errno устанавливается в значение ошибки.
ОШИБКИ¶
Возможные ошибки включают (но не ограничиваются) следующее:
- 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) может отменить совместное использование общих блоков для гарантии того, что последующие операции записи не завершатся ошибкой из-за нехватки места на диске.
Некоторые файловые системы имеют ограничение на количество данных, которое может быть дедуплицировано за один вызов.
СМОТРИТЕ ТАКЖЕ¶
ПЕРЕВОД¶
Русский перевод этой страницы руководства разработал(и) Azamat Hackimov <azamat.hackimov@gmail.com>, Dmitriy S. Seregin <dseregin@59.ru>, Yuri Kozlov <yuray@komyakino.ru>, Иван Павлов <pavia00@gmail.com> и Kirill Rekhov <krekhov.dev@gmail.com>
Этот перевод является свободной программной документацией; он распространяется на условиях общедоступной лицензии GNU (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html версии 3 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.
Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом разработчику(ам) по его(их) адресу(ам) электронной почты или по адресу списка рассылки русских переводчиков.
30 октября 2022 г. | Справочные страницы Linux 6.03 |