ext2磁盘数据结构

在这里插入图片描述
只使用块组0中的超级块和组描述符,其他块组中的超级块和组描述符可以在块组0损坏时进行恢复。

其他块组中的超级块和组描述符是否需要按一定策略和块组0中的进行同步。如果需要,什么时机?

// 根据文件inode获取文件索引节点所在的块组编号

block_group = (inode->i_ino - 1) / EXT2_INODES_PER_GROUP(inode->i_sb);
     if (block_group >= inode->i_sb->u.ext2_sb.s_groups_count) {
          ext2_error (inode->i_sb, "ext2_read_inode",
                   "group >= groups count");
          goto bad_inode;
     }

// 块组编号除以每个数据块最大能存储的块组描述信息,即是块组描述信息所在数据块的块号

     group_desc = block_group >> EXT2_DESC_PER_BLOCK_BITS(inode->i_sb);

// 块组编号对应的块组描述符在一个数据块内的位置

     desc = block_group & (EXT2_DESC_PER_BLOCK(inode->i_sb) - 1);

// 块组描述符所在的数据块的缓存

     bh = inode->i_sb->u.ext2_sb.s_group_desc[group_desc];
     if (!bh) {
          ext2_error (inode->i_sb, "ext2_read_inode",
                   "Descriptor not loaded");
          goto bad_inode;
     }

// 数据块内起始的块组描述符指针

     gdp = (struct ext2_group_desc *) bh->b_data;
     /*
     * Figure out the offset within the block group inode table
     */

// 在一个块组内部,一个inode信息的偏移,以字节为单位

     offset = ((inode->i_ino - 1) % EXT2_INODES_PER_GROUP(inode->i_sb)) *
          EXT2_INODE_SIZE(inode->i_sb);

// 这个inode信息在索引节点表后面的第几个块中

     block = le32_to_cpu(gdp[desc].bg_inode_table) +
          (offset >> EXT2_BLOCK_SIZE_BITS(inode->i_sb));

// 读取整个数据块

     if (!(bh = bread (inode->i_dev, block, inode->i_sb->s_blocksize))) {
          ext2_error (inode->i_sb, "ext2_read_inode",
                   "unable to read inode block - "
                   "inode=%lu, block=%lu", inode->i_ino, block);
          goto bad_inode;
     }

// 计算inode属性在这个数据块中的偏移

     offset &= (EXT2_BLOCK_SIZE(inode->i_sb) - 1);

// 获取inode属性

     raw_inode = (struct ext2_inode *) (bh->b_data + offset);

inode分配策略

在这里插入图片描述

inode state

/* Inode state bits… /
#define I_DIRTY_SYNC 1 /
Not dirty enough for O_DATASYNC /
#define I_DIRTY_DATASYNC 2 /
Data-related inode changes pending /
#define I_DIRTY_PAGES 4 /
Data-related inode changes pending */
#define I_LOCK 8 涉及到的索引节点处于I/O传输中
#define I_FREEING 16 索引节点对象正在被释放
#define I_CLEAR 32 索引节点对象内容不再有意义
I_NEW 索引节点对象已经分配,但还没有用从磁盘索引节点读取的数据来填充

inode_unused

在这里插入图片描述

inode_in_use

在这里插入图片描述

s_dirty(sb)

在这里插入图片描述

s_inodes(sb)

在这里插入图片描述

inode_hashtabel

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值