哪些文件系统支持通过Linux的拼接进行拼接(2)?

Dan*_*ien 18 c linux filesystems splice zero-copy

系统调用手册页splicesplice可能会失败并设置errnoEINVAL:

目标文件系统不支持拼接; 描述符都不是指管道; 或不可寻找设备的偏移量

哪些文件系统支持拼接?

Bol*_*olo 15

我的原始答案部分不正确,这是一个重大改写.

Linux 2.6.30.10及以下版本

在Linux中2.6.30.10及以上,splice返回EINVAL时在源或目标文件系统不支持拼接.以下是支持拼接文件系统:

  • 在阅读模式:adfs,affs,afs,bfs,btrfs,coda,ecryptfs,exofs,ext2,ext3,ext4,fat,fuse,hpfs,jffs2,jfs,minix,nfs,nilfs2,ntfs,ocfs2,omfs,qnx4, reiserfs,smbfs,sysv,ubifs,udf,ufs.
  • 在写模式下:exofs,ext2,ext3,ext4,jfs,ocfs2,reiserfs,ubifs.

细节如下.支持do_splice_to()在"文件到管道"情况和do_splice_from()"管道到文件"情况下的函数中确定的拼接.它是通过检查相关是否struct file_operations包含.splice_read.splice_write分别完成的.为了生产文件系统的上述名单,我已经grepped fs/*/file.c.splice_read.splice_write.

Linux 2.6.31及以上版本

从Linux 2.6.31开始,所有文件系统都支持在读取和写入模式下进行拼接.

细节如下.当文件系统没有.splice_read.splice_write在其中时struct file_operations,使用回退函数:default_file_splice_readdefault_file_splice_write.查看do_splice_to()do_splice_from()实现.注意:EINVAL由于文档中列出的其他原因,可能仍会返回.