Ответ 1
Мой первоначальный ответ был частично неправильным, это серьезная переписывание.
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()
в случае "pipe to file". Это делается путем проверки, соответствует ли соответствующий 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_read
и default_file_splice_write
, соответственно. См. do_splice_to()
и do_splice_from()
для реализаций. Примечание: EINVAL
может по-прежнему возвращаться по другим причинам, перечисленным в документации.