IOCTL_FICLONERANGE - Linux手册页

时间:2019-08-20 17:58:54  来源:igfitidea点击:

Linux程序员手册 第2部分
更新日期: 2017-09-15

名称

ioctl_ficlonerange,ioctl_ficlone-与另一个文件共享一个文件的一些数据

语法

#包括
#包括

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文件中而不是单独制作数据的物理副本。这两个文件必须位于同一文件系统中。如果应将文件写入共享区域,则文件系统必须确保所做的更改对正在写入的文件保持私有。此行为通常称为"写入时复制"。

这个ioctl将偏移量为src_offset的文件描述符src_fd中最多src_length个字节重新链接到偏移量为dest_offset的文件dest_fd中,前提是这两个都是文件。如果src_length为零,则ioctl reflink到源文件的末尾。此信息以以下形式的结构传递:

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或套接字,也会出现此错误。磁盘文件系统通常要求offset和length参数要与基本块大小对齐。 XFS和Btrfs在同一文件中不支持重叠的reflink范围。
EISDIR
文件之一是目录,文件系统不支持目录中的共享区域。
EOPNOTSUPP
如果文件系统不支持任何一个文件描述符的重新链接,或者其中一个文件描述符都引用了特殊的索引节点,则可能会出现这种情况。
EPERM
dest_fd是不可变的。
ETXTBSY
其中一个文件是交换文件。交换文件无法共享存储。
EXDEV
dest_fd和src_fd不在同一已挂载的文件系统上。

版本

这些ioctl操作首先出现在Linux 4.5中。它们以前被称为BTRFS_IOC_CLONE和BTRFS_IOC_CLONE_RANGE,并且是Btrfs专用的。

遵循规范

该API是特定于Linux的。

备注

由于写时复制操作需要分配新的存储,fallocate(2)操作可能会取消共享共享块,以确保后续的写操作不会因缺少磁盘空间而失败。

另外参见

ioctl(2)

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/