传统文件系统创建 struct file_operations 结构以实现VFS功能。例如,在ext4(Linux 4.0及之前版本)中, struct file_operations ext4_file_operations 使读指针指向new_sync_read。
Linux 4.0 /fs/ext4/file.c
const struct file_operations ext4_dax_file_operations = {
.read = new_sync_read,
.read_iter = generic_file_read_iter,
....
}
但是,在Linux 4.1及更高版本中,读指针没有这样的赋值,但是添加了splice_read指针。
Linux 4.1 /fs/ext4/file.c
const struct file_operations ext4_file_operations = {
.read_iter = generic_file_read_iter,
.splice_read = generic_file_splice_read,
...
}
但" /include/linux/fs.h"中定义的 struct file_operations ;仍然有读指针。那么,ext4中的哪个函数现在负责传统的读函数?
答案 0 :(得分:1)
我已经通过编写一个新的文件系统进行了测试,发现如果我们初始化两个指针,那么如果我使用 cat 命令,则会调用.read
。如果我使用 cat 命令而未初始化.read
但初始化.read_iter
则会调用.read_iter
。
答案 1 :(得分:1)
我知道这个问题已经很老了,但是我实际上是在寻找相同的东西并找到了答案。
在Linux 5.8的vfs_read()
函数中,
if (file->f_op->read)
ret = file->f_op->read(file, buf, count, pos);
else if (file->f_op->read_iter)
ret = new_sync_read(file, buf, count, pos);
这些行查找.read
是否由file
的文件操作(f_op
)定义。
如果不是,则.read_iter
中的new_sync_read()
调用将代替读操作。