在 linux 内核模块中克隆一个文件

Clone a file in linux kernel module

我在使用 linux 模块时遇到一些问题,我想从文件描述符克隆一个文件。我尝试使用

vfs_clone_file_range

但我收到 EOPNOTSUPP 错误。所以我尝试使用 vfs_copy_file_range,并且副本工作正常,但我也需要具有与原始标记相同的标志,但这样一来,即使原始标记是用 O_APPEND 指针打开的副本的开头始终位于文件的开头。

这是我的代码:

//The file descriptor is taken correctly and it works
original_filp = fcheck(o_fd);
copy_filp = filp_open(addr, O_CREAT | O_RDWR  , 0644);
vfs_copy_file_range(original_filp, 0, copy_filp, 0, i_size_read(original_filp->f_inode), 0);

内容是正确的,但是指针,正如我所说的那样在开头,即使有 O_APPEND 标志,所以我应该明确地移动指针。 我也尝试添加这一行,但没有结果:

copy_filp->f_pos = original_filp->f_pos;

我真的不知道要改变什么才能让它工作。 预先感谢您的帮助

我不知道我是否明白了,但是根据文档,当 file_out 设置了 O_APPEND 时 copy_file_range returns EBADF 错误代码.所以解决方法可以是:

//The file descriptor is taken correctly and it works
original_filp = fcheck(o_fd);
copy_filp = filp_open(addr, O_CREAT | O_RDWR  , 0644);
vfs_copy_file_range(original_filp, 0, copy_filp, 0, `i_size_read(original_filp->f_inode), 0);`
copy_filp->f_flags=original_filp->f_flags

这样你就可以在两个文件上设置相同的标志