首先,我们要知道NAT中的每个表项都对应着MAIN AREA区域中NODE段的一个block,还要知道NODE block很特别,block末尾会有一个node footer结构:

243 struct node_footer {
244     __le32 nid;     /* node id */
245     __le32 ino;     /* inode nunmber */
246     __le32 flag;        /* include cold/fsync/dentry marks and offset */
247     __le64 cp_ver;      /* checkpoint version */
248     __le32 next_blkaddr;    /* next node page block address */
249 } __packed;

区分一个NODE block里是inode还是普通的dnode,只要比较footer中的nid和ino两个域就可以了,二者如果相等那么这个block里面就是个inode,否则就是普通的dnode。

还要说一点,新建一个文件的时候,会从VFS层分配一个inode,但是这个inode结构的 ino 是不确定的,需要f2fs给它一个值,这个值f2fs通过alloc_nid函数获得,从可用的nid的选择一个,把这个值作为新申请的文件的ino,这样一来,inode的ino和nid就成一样的了,但是对于普通dnode来说,nid还是分配的这个nid,但是ino必须要赋值成文件的ino了。

相关文章:

  • 2021-11-20
  • 2022-02-14
  • 2022-01-15
  • 2021-10-26
  • 2021-12-01
  • 2021-06-02
猜你喜欢
  • 2022-01-15
  • 2021-11-20
  • 2021-07-10
  • 2021-11-07
  • 2021-09-13
  • 2021-10-18
  • 2022-12-23
相关资源
相似解决方案