ext2 目录条目列表:结束在哪里?

ext2 directory entry list: Where is the end?

ext2 目录条目保存为 linked list. Quote from 1:

A directory file is a linked list of directory entry structures. Each structure contains the name of the entry, the inode associated with the data of this entry, and the distance within the directory file to the next entry.

但是并没有说inode中有终结符。此外,没有任何字段告诉目录 inode 中有多少条目。

那么问题来了:当你读取inode数据结构的时候,你怎么知道它什么时候到达链表的末尾?

示例:假设一个空的根目录“/”。所以命令 ls 应该打印出这样的东西:

drwxr-xr-x 4 junji junji  4096 Mar 23 10:33 .
drwxr-xr-x 7 junji junji  4096 Mar 23 10:27 ..
drwxr-xr-x 7 junji junji  4096 Mar 23 10:27 lost+found

在执行ls时,你已经从磁盘中读取了根inode结构,然后按照i_blocks尝试获取所有的目录条目。在磁盘上,条目列表实际上存储为:

{inode = 2, rec_len = 12, name_len = 1, name = .}
{inode = 2, rec_len = 12, name_len = 2, name = ..}
{inode = 12, rec_len = 1000, name_len = 6, name = lost+found}   
{inode = 12, rec_len = 12, name_len = 1, name = .}
{inode = 2, rec_len = 32, name_len = 2, name = ..}
...

第三个 "lost+found" 条目旁边还有一个条目。

显然程序应该在 "lost+found" 条目处停止,因为下一个条目即“.”属于另一个目录。但是我们如何让我们的程序知道呢?我们什么时候知道它是目录条目列表的末尾?

谢谢!

编辑:

inode列表有点不一致。特别是,lost+found条目的rec_len是1000而不是980。我更正了它。

我明白了。目录的所有条目都应该适合大小固定的数据块。对于ext2,一个数据块是1024。

在上面的例子中,根索引节点只指向一个数据块(即,i_blocks数组只有一个非零元素)。该数据块中的所有条目都属于根。除此之外,它是其他一些目录。

{inode = 2, rec_len = 12, name_len = 1, name = .}
{inode = 2, rec_len = 12, name_len = 2, name = ..}
{inode = 12, rec_len = 1000, name_len = 6, name = lost+found}
{inode = 12, rec_len = 12, name_len = 1, name = .}
{inode = 2, rec_len = 32, name_len = 2, name = ..}

如果把前3项的rec_len值全部加起来,12+12+1000=1024,那么已经是一个数据块大小了。这就是我一直在寻找的哨兵信号。除此之外,它位于另一个目录的另一个数据块中。