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

发布于 2024-09-17 19:19:52 字数 286 浏览 7 评论 0原文

splice 系统调用的手册页splice 可能会失败并将 errno 设置为 EINVAL

目标文件系统不支持拼接;两个描述符都不涉及管道;或为不可搜索设备指定的偏移量

哪些文件系统支持拼接?

The man page for the splice system call says that splice may fail and set errno to EINVAL if:

Target file system doesn't support splicing; neither of the descriptors refers to a pipe; or offset given for non-seekable device

Which file systems support splicing?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

如此安好 2024-09-24 19:19:52

我原来的答案部分不正确,这是一个重大重写。

Linux 2.6.30.10 及更低版本

在 Linux 2.6.30.10 及更早版本中,当源或目标文件系统不支持拼接时,splice 返回 EINVAL。以下是支持拼接的文件系统

  • 在读取模式下:adfs、affs、afs、bfs、btrfs、coda、ecryptfs、exofs、ext2、ext3、ext4、fat 、保险丝、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 来完成的。为了生成上述文件系统列表,我在 fs/*/file.c 中查找了 .splice_read.splice_write

Linux 2.6.31 及更高版本

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

详细信息如下。当文件系统的 struct file_operations 中没有 .splice_read.splice_write 时,将使用后备函数:default_file_splice_readdefault_file_splice_write 分别。请参阅do_splice_to()do_splice_from() 用于实现。注意:由于文档中列出的其他原因,EINVAL 仍可能被返回。

My original answer was partially incorrect, this is a major rewrite.

Linux 2.6.30.10 and below

In Linux 2.6.30.10 and older, splice returns EINVAL when the source or target filesystem does not support splicing. Here are the filesystems that do support splicing:

  • in read mode: 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.
  • in write mode: exofs, ext2, ext3, ext4, jfs, ocfs2, reiserfs, ubifs.

Details follow. Support for splicing in determined in the do_splice_to() function in the "file to pipe" case and in the do_splice_from() function in the "pipe to file" case. It is done by checking whether the relevant struct file_operations contains .splice_read or .splice_write, respectively. In order to produce the above lists of filesystems, I've grepped fs/*/file.c for .splice_read and .splice_write.

Linux 2.6.31 and above

Starting with Linux 2.6.31, all the filesystems support splicing both in read and write modes.

Details follow. When a filesystem does not have .splice_read or .splice_write in its struct file_operations, a fallback function is used: default_file_splice_read and default_file_splice_write, respectively. See do_splice_to() and do_splice_from() for implementations. Note: EINVAL may still be returned for other reasons listed in the documentation.

纵山崖 2024-09-24 19:19:52

Accordding to this, EXT3 does. It seems that you might be out of luck with any FUSE file system.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文