代码是:
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/