&inode->i_data 和 inode->i_mapping 有什么区别

Yif*_*ang 3 linux-kernel

我发现在大多数情况下,i_data 只是 i_mapping 的解引用数据,如下所示,为什么在一个 inode 结构中设置两个相同的值?

crash> struct inode ffffffc073c1f360 -o
struct inode {
 ...
  [ffffffc073c1f4a8] struct file_lock *i_flock;
  **[ffffffc073c1f4b0] struct address_space i_data;**
  [ffffffc073c1f558] struct list_head i_devices;
 ...   

crash> struct inode ffffffc073c1f360
struct inode {
...
  i_op = 0xffffffc0007ad1c0 <ext4_file_inode_operations>, 
  i_sb = 0xffffffc002010000, 
  **i_mapping = 0xffffffc073c1f4b0,** 
  i_security = 0xffffffc07230d050, 
...
Run Code Online (Sandbox Code Playgroud)

ska*_*hal 5

地址空间总是处理页面缓存。如果页面的所有者是文件,则访问页面缓存中的页面时,address_space 对象嵌入在 VFS inode 对象的 i_data 字段中。inode 的 i_mapping 字段始终指向包含 inode 数据的页面所有者的 address_space 对象。address_space 对象的主机字段指向嵌入描述符的 inode 对象。

例如,如果page属于ext4文件系统中存储的常规文件,则VFS inode的i_data指向该文件的inode,inode的i_mapping字段指向同一个inode的i_data,address_space对象的host字段指向同一个inode .

然而事情并不总是那么简单。假设一个页面包含从块设备文件读取的数据,其中包含块设备的“原始”数据,address_space 被嵌入到 bdev 文件的“主”inode 中,与块设备关联的特殊文件系统(由 bd_inode 引用) )。因此块设备文件的inode的i_mapping域指向嵌入在master inode中的address_space对象;相应地,address_space对象的host域指向master inode。这样,所有包含从块设备读取的数据的页面都具有相同的 address_space 对象,即使它们已通过引用不同的块设备文件进行访问。因此,当涉及到页面属于常规文件还是块设备特殊文件时,两者之间略有区别。