int32 inofreefwd; /* 4: ag inode free list forward */ int32 inofreeback; /* 4: ag inode free list back */ int32 extfreefwd; /* 4: ag inode extent free list forward */ int32 extfreeback; /* 4: ag inode extent free list back */ int32 iagfree; /* 4: iag free list */ /* summary map: 1 bit per inode extent */ int32 inosmap[SMAPSZ];/* 16: sum map of mapwords w/ free inodes; * note: this indicates free and backed * inodes, if the extent is not backed the * value will be 1. if the extent is * backed but all inodes are being used the * value will be 1. if the extent is * backed but at least one of the inodes is * free the value will be 0. */ int32 extsmap[SMAPSZ];/* 16: sum map of mapwords w/ free extents */ int32 nfreeinos; /* 4: number of free inodes */ int32 nfreeexts; /* 4: number of free extents */ /* (72) */ uint8 pad[1976]; /* 1976: pad to 2048 bytes */ /* allocation bit map: 1 bit per inode (0 - free, 1 - allocated) */ uint32 wmap[EXTSPERIAG]; /* 512: working allocation map */ uint32 pmap[EXTSPERIAG]; /* 512: persistent allocation map */ pxd_t inoext[EXTSPERIAG]; /* 1024: inode extent addresses */ } iag_t; /* (4096) */ inode 分配映射表最前面 4k 大小的页是控制页。该页包含 inode 分配映射表的摘要信息。 dinomap_t 结构的定义见 jfs_imap.h。 逻辑上,inode 分配映射表是动态可扩展的 IAG 结构的数组: struct iag inode_allocation_map [ 1.. N ]; 物理上,inode 分配映射表本身是聚集内的一个文件。聚集 inode 分配映射表由聚集 self-node 描述。文件集 inode 分配映射表由文件集 inode 描述。页空间的分配和释放依据 B+ 树索引需要进行。B+ 树的键是 IAG 页的字节偏移量。 JFS 使用提交策略确保控制数据可靠更新。可靠更新意味着一旦系统出错时,要维持一致的 JFS 结构和资源分配状态。为确保 inode 分配映射表的一致性,每个 IAG 都同时维护两个映射表,工作映射表和持续映射表。工作映射表记录当前分配状态。持续磁盘记录递交的分配状态,包括磁盘上记录的分配状态或是 JFS 日志中提交的 JFS 事务记录描述的分配状态。 映射表中的每一位记录相应 inode 是空闲还是已分配的。位值 0 表示 inode 空闲,1 表示 inode 已分配。IAG 的每一个控制区内都有一个摘要映射表,用以提高查找空闲 inode 的性能。摘要映射表映射到 IAG 的工作位图。摘要映射表使用一位映射工作映射表的相邻 32 位。每一位表示相应的 inode 可用(0),或相应的 inode 不可用(1)。(如果没有已分配的盘区,那么该 inode 摘要映射位为 1,表明没有可用的 inode ,) IAG 还包含 inode 盘区描述符,该描述符描述相应的 inode 盘区。每个 IAG 有 128 个描述符。IAG 的每个控制区内都有一个摘要映射表,用于改进空闲 inode 盘区查找的性能。摘要映射表用一位映射一个 inode 盘区。0 表示空闲的 inode 盘区,1 表示已分配的 inode 盘区。 如果给定 inode 号,用 inode 分配映射表,通过以下步骤,可以找到 inode 的物理位置: 1. 找到描述该 inode 的 IAG。需要找到 inode 分配映射表在 B+ 树中的键(字节偏移量)。 iag key = ((Inode number / Inodes per iag) * Inodes per iag) + 4096 (EQ 1) 2. 查找已找到的 IAG 中引用的 inode 。这可用于在 IAG 工作映射表和持续映射表中索引。 iag inode index = (Inode number) mod (Inodes per iag) (EQ 2) 3. 查找 IAG 中的 inode 盘区描述符,该描述符描述包含指定 inode 的 inode 盘区。 inode extent descriptor = (iag inode index) / (Inode per inode extent) (EQ 3) 4. 要找的 inode 位于找到的 inode 盘区内、适当的偏移量处。 inode offset = ((iag inode index) mod (Inodes per inode extent)
|