ext4 读取块组下的节点位图

/*
 * Read the inode allocation bitmap for a given block_group, reading
 * into the specified slot in the superblock's bitmap cache.
 * Return buffer_head of bitmap on success or NULL.
 */
static struct buffer_head *
ext4_read_inode_bitmap(struct super_block *sb, ext4_group_t block_group)
{
    struct ext4_group_desc *desc;
    struct buffer_head *bh = NULL;
    ext4_fsblk_t bitmap_blk;
    int err;

    desc = ext4_get_group_desc(sb, block_group, NULL);
    if (!desc)
        return ERR_PTR(-EFSCORRUPTED);

    bitmap_blk = ext4_inode_bitmap(sb, desc);
    bh = sb_getblk(sb, bitmap_blk);
    if (unlikely(!bh)) {
        ext4_error(sb, "Cannot read inode bitmap - "
                "block_group = %u, inode_bitmap = %llu",
                block_group, bitmap_blk);
        return ERR_PTR(-EIO);
    }
    if (bitmap_uptodate(bh))//数据已经是最新的了,ok,我们验证这些数据
        goto verify;

    lock_buffer(bh);
    if (bitmap_uptodate(bh)) {
        unlock_buffer(bh);
        goto verify;
    }

    ext4_lock_group(sb, block_group);
    if (desc->bg_flags & cpu_to_le16(EXT4_BG_INODE_UNINIT)) {
        err = ext4_init_inode_bitmap(sb, bh, block_group, desc);
        set_bitmap_uptodate(bh);
        set_buffer_uptodate(bh);
        set_buffer_verified(bh);
        ext4_unlock_group(sb, block_group);
        unlock_buffer(bh);
        if (err) {
            ext4_error(sb, "Failed to init inode bitmap for group "
                   "%u: %d", block_group, err);
            goto out;
        }
        return bh;
    }
    ext4_unlock_group(sb, block_group);

    if (buffer_uptodate(bh)) {
        /*
         * if not uninit if bh is uptodate,
         * bitmap is also uptodate
         */
        set_bitmap_uptodate(bh);
        unlock_buffer(bh);
        goto verify;
    }
    /*
     * submit the buffer_head for reading
     */
    trace_ext4_load_inode_bitmap(sb, block_group);
    bh->b_end_io = ext4_end_bitmap_read;
    get_bh(bh);
    submit_bh(REQ_OP_READ, REQ_META | REQ_PRIO, bh);
    wait_on_buffer(bh);
    if (!buffer_uptodate(bh)) {
        put_bh(bh);
        ext4_error(sb, "Cannot read inode bitmap - "
               "block_group = %u, inode_bitmap = %llu",
               block_group, bitmap_blk);
        return ERR_PTR(-EIO);
    }

verify:
    err = ext4_validate_inode_bitmap(sb, desc, block_group, bh);
    if (err)
        goto out;
    return bh;
out:
    put_bh(bh);
    return ERR_PTR(err);
}

最后想一想为啥要读取位图,什么时候修改位图?节点位图描述的是节点使用情况,所以,在分配节点和释放节点时
需要读取节点位图,这样接下来标记节点使用,这样对应的节点表也会被使用。 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值