代码是:

void ext2_read_inode (struct inode * inode)
{
    struct buffer_head * bh;
    struct ext2_inode * raw_inode;
    unsigned long block_group;
    unsigned long group_desc;
    unsigned long desc;
    unsigned long block;
    unsigned long offset;
    struct ext2_group_desc * gdp;

    if (
        ( inode->i_ino != EXT2_ROOT_INO
            && inode->i_ino != EXT2_ACL_IDX_INO
            && inode->i_ino != EXT2_ACL_DATA_INO
            && inode->i_ino < EXT2_FIRST_INO(inode->i_sb)
        ) || inode->i_ino > le32_to_cpu(
                inode->i_sb->u.ext2_sb.s_es->s_inodes_count)
    )
    {
        ext2_error(inode->i_sb, "ext2_read_inode",
            "bad inode number: %lu", inode->i_ino);
        goto bad_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];

    /* ... other code omitted ... */
}

你能解释一下为什么这里有-1吗?
block_group = (inode->i_ino - 1) / EXT2_INODES_PER_GROUP(inode->i_sb);

在这里:
desc = block_group & (EXT2_DESC_PER_BLOCK(inode->i_sb) - 1);

谢谢您。

最佳答案

Dave Poirier - The Second Extended File System: Internal Layout - 3.6. Locating an Inode说:
知道inode 1是inode表中定义的第一个inode,
可以使用以下公式:
block group = (inode - 1) / s_inodes_per_group
在这里,我们可以说,与约阿希姆皮勒堡- 1有没有“使它零基础”。
但是,在

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

与零基础无关;这是另一种写作方式
desc = block_group % EXT2_DESC_PER_BLOCK(inode->i_sb);

因为每个存储块的块组描述符数是2的幂。

关于c - 为什么在fs/ext2/inode.c的“inode-> i_ino-1”中减去一个?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18743584/

10-12 00:33
查看更多