存储 频道

JFS布局:日志文件系统如何处理磁盘布局(14)

        inode 分配映射表

 

        inode 分配映射表解决正向查找问题。聚集和每个文件集都有一个 inode 分配映射表,该表是一个 IAG(inode 分配组)的数组。IAG 是 inode 分配映射表的数据。对于聚集,inode 分配映射表映射的 inode 也称为聚集 inode 表。对于文件集,inode 分配映射表映射的 inode 也称为文件 inode 表。

        每个 IAG 大小为 4K,描述磁盘上 128 个物理 inode 盘区。由于每个 inode 盘区包含 32 个 inode ,所以每个 IAG 描述 4096 个 inode 。IAG 可以位于聚集的任意位置。IAG 的所有 inode 盘区位于一个分配组,由此 IAG 和 AG 绑定在一起直至释放所有的 inode 盘区。任意 AG 可以分配空间给一个 inode 盘区,然后该 IAG 就与那个 AG 绑定。IAG 由 struct iag_t 定义(见 jfs_imap.h)。


            /*
            *  inode allocation group page (per 4096 inodes of an AG)
            */
            typedef struct {
            int64   agstart;    /* 8: starting block of ag      */
            int32   iagnum;     /* 4: inode allocation group number     */
            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 盘区。

0
相关文章