IOCTL_FICLONERANGE - Linux手册页
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/。