Мой первоначальный ответ был частично неверным, это серьезная перезапись.
Linux 2.6.30.10 и ниже
В Linux 2.6.30.10 и старше, splice
возвращает EINVAL
, когдаисходная или целевая файловая система не поддерживает соединение.Вот файловые системы, которые поддерживают сращивание :
- в режиме чтения : adfs, affs, afs, bfs, btrfs, coda, ecryptfs, exofs,ext2, ext3, ext4, жир, предохранитель, 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 и выше
Начиная с Linux2.6.31, все файловые системы поддерживают сращивание как в режиме чтения, так и в режиме записи .
Подробности приведены ниже.Когда файловая система не имеет .splice_read
или .splice_write
в своих struct file_operations
, используется резервная функция: default_file_splice_read
и default_file_splice_write
, соответственно.См. do_splice_to()
и do_splice_from()
для реализации.Примечание: EINVAL
может быть возвращено по другим причинам, указанным в документации.