【发布时间】:2015-05-26 15:10:28
【问题描述】:
ext2 目录条目作为linked list 持久化。引用1:
目录文件是目录条目结构的链表。每个结构都包含条目的名称、与该条目的数据关联的 inode 以及目录文件中到下一个条目的距离。
但它并没有说 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。我更正了。
【问题讨论】:
-
Fromfs/ext2/dir.c :
/* * ext2_delete_entry deletes a directory entry by merging it with the * previous entry. Page is up-to-date. Releases the page. */所以你应该使用 rec_len 作为偏移量来添加到新的目录条目(它的绝对偏移量是 1004,所以它可能是一个末梢哨兵条目。 -
你是对的。 rec_len 是一个信号。我将在下面发布我的答案。谢谢乔普。
-
那么如果rec_len = 1000,它加起来就是1024,这意味着下一个条目将在下一个磁盘页面上(如果有的话)
-
您应该(至少)在此处发布您用来获取结果的代码。这些天水晶球很稀少......