* sizeof dinode) (EQ 4) inode 分配映射表本身由聚集 inode 表中文件集的分配映射表 inode 描述。 通过前面介绍的公式,将 inode 号,#9157,转换成一个偏移量: iag key = ((inum / num_inodes_per_iag ) * (num_inodes_per_iag )) + 4096 = ((9157 / 4096) * 4096 ) + 4096 = 12288 iag inode index = inum mod num_inodes_per_iag = (9157 mod 4096 ) = 965 inode extent descriptor = iag_inode_index / num_inodes_per_extent = 965 / 32 = 30 inode offset = (iag_inode_index mod num_inodes_per_extent) * sizeof dinode = (965 mod 32) * 512 = 5 * 512 = 2560 为简化 JFS 维护命令,及便于理解布局策略的动态性,inode 分配映射文件盘区的大小总为 4KB。 当新文件集创建时,必须分配一个 IAG 以及第一个 inode 盘区,以处理文件集的元数据文件。(即,保留的 inode 和根目录 inode )。 AG 空闲 inode 列表 AG 空闲 inode 列表解决反向查找问题。为减少扩展和缩减聚集的系统开销,JFS 设定每个聚集允许的最大 AG 数。所以,AG 空闲 inode 列表头的个数是固定的。列表头在 inode 分配映射表的控制页中。表的第 i 项是一个双向列表的头,表的第 i 项是一个双向列表的头,该双向列表是第 i 个 AG 中的所有包含空闲 inode 的 inode 分配映射表项(IAG)的集合。IAG 号作为列表索引。-1 表示列表尾。每个 IAG 控制区都包含指向该列表的正向和反向指针。 AG 列表从表头开始插入。当分配新的 inode 盘区,或当因盘区占满而删除一个 inode 时,会有插入操作。当一个 IAG 所有的 inode 盘区都满时,从列表中删除该 IAG。 注意 AG3 中的 IAG 没有任何相应的 inode 盘区可供分配。所以,这些 inode 未在 AG 空闲 inode 列表中表示。 此表没有记日志;但可以在恢复时由 logredo 恢复,或由 fsck 重建。AG 空闲列表结构定义是 struct dinomap_t,见 jfs_imap.h 文件。 [page_break] AG 空闲 inode 盘区列表 AG 空闲 inode 盘区列表有助于解决反向查找问题以及空闲 inode 号查找问题。这使得 JFS 能找到下一个空闲盘区所在的 IAG 号和 AG 号。(实际是给出了空闲 inode 号。)每个文件集的每个 AG 都有一个AG 空闲 inode 盘区列表。为减少扩展和缩减聚集的系统开销,JFS 设定每个聚集允许的最大 AG 数。所以,AG 空闲 inode 盘区列表头的个数是固定的。列表头在 inode 分配映射表的控制页中。表的第 i 项是一个双向列表的头,该双向列表是第 i 个 AG 中所有包含空闲 inode 的 inode 分配映射表项(IAG)的集合。IAG 号作为列表索引。-1 表示列表尾。每个 IAG 控制区都包含指向该列表的正向和反向指针。 当盘区中所有的 inode 都已删除,则释放该 inode 盘区的磁盘块。当 IAG 的一个 inode 盘区被删除时,该 IAG 插至所属的 AG 空闲 inode 盘区列表的表头。当创建新的 IAG,并分配一个 inode 盘区时,该 IAG 号插至 AG 空闲 inode 盘区列表的表头。当 IAG 的所有 inode 盘区分配完时,从列表中删除该 IAG。当释放 IAG 的所有 inode 盘区时,从列表中删除该 IAG 同时加到IAG 空闲列表中。当 AG 需要分配 inode 盘区时, 则使用 AG 空闲列表头上的第一项。 此表没有记日志;但可以在恢复时由 logredo 恢复,或由 fsck 重建。 表的结构定义见 jfs_imap.h, struct dinomap_t . IAG 空闲列表 IAG 空闲列表有助于查找空闲 inode 号。这使得 JFS 不用查看相应分配的 inode 盘区就可找到 IAG。(实际时给出了空闲 inode 号)。聚集和其每个文件集都有自己的链表。该列表的每个项指向一个 IAG 链表。IAG 号作为列表索引。-1 表示列表尾。当删除盘区的所有 inode 时,则释放该 inode 盘区的磁盘块。如果某个 IAG 的所有 inode 都为空闲,则该 IAG 号插入 IAG 空闲列表头。当需要分配新的 inode 盘区,而该 AG 中又没有包含空闲盘区的 IAG,则使用 IAG 空闲列表头的第一项(即从表中删除)。inode 盘区分配描述符一经分配就不再删除。inode 盘区的地址设为 0x0。 对于聚集 IAG 空闲列表头是聚集自用 inode 的一个字段。对于每个文件集 IAG 空闲列表头是文件集分配映射表 inode 的一个字段。该列表没记日志;但可在恢复时由 logredo 修复,或由 fsck 重建。 IAG 空闲列表的结构定义 struct inomap_t 在文件 jfs_dinode.h 中。 下一个空闲 IAG 下一个空闲 IAG 计数器有助于查找空闲 inode 号。使得 JFS 能找到下一个可以分配的 IAG 的 iag号。(实际是让 JFS 找到空闲 inode 号)。聚集和其每个文件集都有自己的计数器。计数器在 inode 分配映射表的控制页中。IAG 一经分配就不再删除。 文件集分配 inode 文件集 inode 表中的文件集分配映射表 inode 是特殊类型的 inode 。既然这些节点表示文件集,则可以说是文件集的“父 inode ”。这些节点包含文件集特定信息,而不是一般的 inode 数据。同时也记录文件集 inode 分配映射表在 B+ 树中的位置。结构定义 struct dinode 见文件 jfs_dinode.h 文件
|